javascript - 为什么 scrollHeight、clientHeight 和 offsetHeight 都返回相同的值?

标签 javascript dom

根据 this answer on stackoverflow scrollHeightclientHeightoffsetHeight 都返回不同的值。

滚动高度

is a measurement of the height of an element's content including content not visible on the screen due to overflow

客户端高度

returns the inner height of an element in pixels, including padding but not the horizontal scrollbar height, border, or margin

偏移高度

is a measurement which includes the element borders, the element vertical padding, the element horizontal scrollbar (if present, if rendered) and the element CSS height.

然而,当我测试这些属性时,它们返回了相同的值。在 Chrome、Firefox 和 IE 中都是如此。我在下面包含了所有 3 种方法的测试代码。我究竟做错了什么?他们不应该返回不同的值吗?

滚动高度值

"use strict"

console.log(document.querySelector('.testDiv').scrollHeight);
.testDiv {
    background-color: red;
    padding: 10px
}
<div class="testDiv">

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse scelerisque quam a ultricies eleifend. Duis pharetra mi sit amet est tempor auctor. Vestibulum pellentesque metus at blandit pharetra. Cras sodales sem eu nisl interdum, placerat ornare nisi malesuada. Nam at bibendum nunc, eu feugiat neque. Sed quis lacus in lacus ornare ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris accumsan libero eget libero iaculis varius.

 Nulla eget orci dolor. Curabitur varius volutpat arcu, sed porta erat faucibus vitae. Nulla vitae consequat tortor. Sed ornare, elit sit amet tempus tincidunt, leo arcu malesuada elit, iaculis aliquam neque tortor a nisi. Aliquam placerat faucibus tortor, et interdum massa tristique vitae. Maecenas commodo lobortis libero ac placerat. Nam tincidunt augue non sollicitudin iaculis. Etiam consectetur libero non neque varius efficitur. Maecenas id tortor ipsum.
            
In hac habitasse platea dictumst. Phasellus ut quam et eros ullamcorper posuere nec vitae sapien. Cras id leo placerat, porttitor felis vel, accumsan mauris. Nullam eget mauris vitae libero tincidunt dictum non et sem. Integer ipsum orci, blandit sit amet porta sollicitudin, interdum id nisl. Duis ac nulla mauris. Fusce dictum porttitor dolor vel viverra. Integer tempus nisi sed enim semper tristique. Maecenas feugiat, lectus ac viverra semper, orci libero lobortis urna, placerat accumsan nulla quam non libero. Proin ex ante, vehicula quis aliquam id, consectetur efficitur orci. Quisque nisi quam, volutpat at convallis condimentum, sodales eget magna.
            
Integer accumsan vehicula sagittis. Donec sed malesuada mauris, at sagittis odio. Donec facilisis orci at sapien gravida, ac cursus dolor consectetur. Integer gravida at elit non eleifend. Fusce maximus mauris vitae lectus venenatis, id volutpat mauris viverra. Etiam libero urna, porttitor ut neque feugiat, maximus sollicitudin lorem. Morbi convallis ultrices sem quis rutrum. Aenean varius risus non justo accumsan posuere. Nam egestas quis leo quis suscipit. Morbi ac quam quam. Aliquam erat volutpat.
            
Morbi eget dui ut mauris bibendum laoreet vitae sed nunc. Duis dignissim, lacus ornare condimentum semper, est elit fringilla nisi, ac pharetra risus diam eu sem. Curabitur eget urna nec ex pharetra lacinia. Proin eu metus felis. Nunc luctus sem eget nulla volutpat vestibulum. Phasellus ut interdum velit, sit amet vestibulum tortor. Donec pretium euismod pharetra. Donec consequat in sem quis consectetur. Proin tempor nulla nibh, sed porta dolor hendrerit a. Nam tincidunt nisl eget leo ornare, non fringilla nulla viverra. Suspendisse volutpat est vel tellus gravida tempor.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse scelerisque quam a ultricies eleifend. Duis pharetra mi sit amet est tempor auctor. Vestibulum pellentesque metus at blandit pharetra. Cras sodales sem eu nisl interdum, placerat ornare nisi malesuada. Nam at bibendum nunc, eu feugiat neque. Sed quis lacus in lacus ornare ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris accumsan libero eget libero iaculis varius.

Nulla eget orci dolor. Curabitur varius volutpat arcu, sed porta erat faucibus vitae. Nulla vitae consequat tortor. Sed ornare, elit sit amet tempus tincidunt, leo arcu malesuada elit, iaculis aliquam neque tortor a nisi. Aliquam placerat faucibus tortor, et interdum massa tristique vitae. Maecenas commodo lobortis libero ac placerat. Nam tincidunt augue non sollicitudin iaculis. Etiam consectetur libero non neque varius efficitur. Maecenas id tortor ipsum.

In hac habitasse platea dictumst. Phasellus ut quam et eros ullamcorper posuere nec vitae sapien. Cras id leo placerat, porttitor felis vel, accumsan mauris. Nullam eget mauris vitae libero tincidunt dictum non et sem. Integer ipsum orci, blandit sit amet porta sollicitudin, interdum id nisl. Duis ac nulla mauris. Fusce dictum porttitor dolor vel viverra. Integer tempus nisi sed enim semper tristique. Maecenas feugiat, lectus ac viverra semper, orci libero lobortis urna, placerat accumsan nulla quam non libero. Proin ex ante, vehicula quis aliquam id, consectetur efficitur orci. Quisque nisi quam, volutpat at convallis condimentum, sodales eget magna.

</div>

clientHeight 值

"use strict"

console.log(document.querySelector('.testDiv').clientHeight);
.testDiv {
    background-color: red;
    padding: 10px
}
<div class="testDiv">

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse scelerisque quam a ultricies eleifend. Duis pharetra mi sit amet est tempor auctor. Vestibulum pellentesque metus at blandit pharetra. Cras sodales sem eu nisl interdum, placerat ornare nisi malesuada. Nam at bibendum nunc, eu feugiat neque. Sed quis lacus in lacus ornare ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris accumsan libero eget libero iaculis varius.

 Nulla eget orci dolor. Curabitur varius volutpat arcu, sed porta erat faucibus vitae. Nulla vitae consequat tortor. Sed ornare, elit sit amet tempus tincidunt, leo arcu malesuada elit, iaculis aliquam neque tortor a nisi. Aliquam placerat faucibus tortor, et interdum massa tristique vitae. Maecenas commodo lobortis libero ac placerat. Nam tincidunt augue non sollicitudin iaculis. Etiam consectetur libero non neque varius efficitur. Maecenas id tortor ipsum.
            
In hac habitasse platea dictumst. Phasellus ut quam et eros ullamcorper posuere nec vitae sapien. Cras id leo placerat, porttitor felis vel, accumsan mauris. Nullam eget mauris vitae libero tincidunt dictum non et sem. Integer ipsum orci, blandit sit amet porta sollicitudin, interdum id nisl. Duis ac nulla mauris. Fusce dictum porttitor dolor vel viverra. Integer tempus nisi sed enim semper tristique. Maecenas feugiat, lectus ac viverra semper, orci libero lobortis urna, placerat accumsan nulla quam non libero. Proin ex ante, vehicula quis aliquam id, consectetur efficitur orci. Quisque nisi quam, volutpat at convallis condimentum, sodales eget magna.
            
Integer accumsan vehicula sagittis. Donec sed malesuada mauris, at sagittis odio. Donec facilisis orci at sapien gravida, ac cursus dolor consectetur. Integer gravida at elit non eleifend. Fusce maximus mauris vitae lectus venenatis, id volutpat mauris viverra. Etiam libero urna, porttitor ut neque feugiat, maximus sollicitudin lorem. Morbi convallis ultrices sem quis rutrum. Aenean varius risus non justo accumsan posuere. Nam egestas quis leo quis suscipit. Morbi ac quam quam. Aliquam erat volutpat.
            
Morbi eget dui ut mauris bibendum laoreet vitae sed nunc. Duis dignissim, lacus ornare condimentum semper, est elit fringilla nisi, ac pharetra risus diam eu sem. Curabitur eget urna nec ex pharetra lacinia. Proin eu metus felis. Nunc luctus sem eget nulla volutpat vestibulum. Phasellus ut interdum velit, sit amet vestibulum tortor. Donec pretium euismod pharetra. Donec consequat in sem quis consectetur. Proin tempor nulla nibh, sed porta dolor hendrerit a. Nam tincidunt nisl eget leo ornare, non fringilla nulla viverra. Suspendisse volutpat est vel tellus gravida tempor.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse scelerisque quam a ultricies eleifend. Duis pharetra mi sit amet est tempor auctor. Vestibulum pellentesque metus at blandit pharetra. Cras sodales sem eu nisl interdum, placerat ornare nisi malesuada. Nam at bibendum nunc, eu feugiat neque. Sed quis lacus in lacus ornare ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris accumsan libero eget libero iaculis varius.

Nulla eget orci dolor. Curabitur varius volutpat arcu, sed porta erat faucibus vitae. Nulla vitae consequat tortor. Sed ornare, elit sit amet tempus tincidunt, leo arcu malesuada elit, iaculis aliquam neque tortor a nisi. Aliquam placerat faucibus tortor, et interdum massa tristique vitae. Maecenas commodo lobortis libero ac placerat. Nam tincidunt augue non sollicitudin iaculis. Etiam consectetur libero non neque varius efficitur. Maecenas id tortor ipsum.

In hac habitasse platea dictumst. Phasellus ut quam et eros ullamcorper posuere nec vitae sapien. Cras id leo placerat, porttitor felis vel, accumsan mauris. Nullam eget mauris vitae libero tincidunt dictum non et sem. Integer ipsum orci, blandit sit amet porta sollicitudin, interdum id nisl. Duis ac nulla mauris. Fusce dictum porttitor dolor vel viverra. Integer tempus nisi sed enim semper tristique. Maecenas feugiat, lectus ac viverra semper, orci libero lobortis urna, placerat accumsan nulla quam non libero. Proin ex ante, vehicula quis aliquam id, consectetur efficitur orci. Quisque nisi quam, volutpat at convallis condimentum, sodales eget magna.

</div>

偏移高度值

"use strict"

console.log(document.querySelector('.testDiv').offsetHeight);
.testDiv {
    background-color: red;
    padding: 10px
}
<div class="testDiv">

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse scelerisque quam a ultricies eleifend. Duis pharetra mi sit amet est tempor auctor. Vestibulum pellentesque metus at blandit pharetra. Cras sodales sem eu nisl interdum, placerat ornare nisi malesuada. Nam at bibendum nunc, eu feugiat neque. Sed quis lacus in lacus ornare ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris accumsan libero eget libero iaculis varius.

 Nulla eget orci dolor. Curabitur varius volutpat arcu, sed porta erat faucibus vitae. Nulla vitae consequat tortor. Sed ornare, elit sit amet tempus tincidunt, leo arcu malesuada elit, iaculis aliquam neque tortor a nisi. Aliquam placerat faucibus tortor, et interdum massa tristique vitae. Maecenas commodo lobortis libero ac placerat. Nam tincidunt augue non sollicitudin iaculis. Etiam consectetur libero non neque varius efficitur. Maecenas id tortor ipsum.
            
In hac habitasse platea dictumst. Phasellus ut quam et eros ullamcorper posuere nec vitae sapien. Cras id leo placerat, porttitor felis vel, accumsan mauris. Nullam eget mauris vitae libero tincidunt dictum non et sem. Integer ipsum orci, blandit sit amet porta sollicitudin, interdum id nisl. Duis ac nulla mauris. Fusce dictum porttitor dolor vel viverra. Integer tempus nisi sed enim semper tristique. Maecenas feugiat, lectus ac viverra semper, orci libero lobortis urna, placerat accumsan nulla quam non libero. Proin ex ante, vehicula quis aliquam id, consectetur efficitur orci. Quisque nisi quam, volutpat at convallis condimentum, sodales eget magna.
            
Integer accumsan vehicula sagittis. Donec sed malesuada mauris, at sagittis odio. Donec facilisis orci at sapien gravida, ac cursus dolor consectetur. Integer gravida at elit non eleifend. Fusce maximus mauris vitae lectus venenatis, id volutpat mauris viverra. Etiam libero urna, porttitor ut neque feugiat, maximus sollicitudin lorem. Morbi convallis ultrices sem quis rutrum. Aenean varius risus non justo accumsan posuere. Nam egestas quis leo quis suscipit. Morbi ac quam quam. Aliquam erat volutpat.
            
Morbi eget dui ut mauris bibendum laoreet vitae sed nunc. Duis dignissim, lacus ornare condimentum semper, est elit fringilla nisi, ac pharetra risus diam eu sem. Curabitur eget urna nec ex pharetra lacinia. Proin eu metus felis. Nunc luctus sem eget nulla volutpat vestibulum. Phasellus ut interdum velit, sit amet vestibulum tortor. Donec pretium euismod pharetra. Donec consequat in sem quis consectetur. Proin tempor nulla nibh, sed porta dolor hendrerit a. Nam tincidunt nisl eget leo ornare, non fringilla nulla viverra. Suspendisse volutpat est vel tellus gravida tempor.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse scelerisque quam a ultricies eleifend. Duis pharetra mi sit amet est tempor auctor. Vestibulum pellentesque metus at blandit pharetra. Cras sodales sem eu nisl interdum, placerat ornare nisi malesuada. Nam at bibendum nunc, eu feugiat neque. Sed quis lacus in lacus ornare ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris accumsan libero eget libero iaculis varius.

Nulla eget orci dolor. Curabitur varius volutpat arcu, sed porta erat faucibus vitae. Nulla vitae consequat tortor. Sed ornare, elit sit amet tempus tincidunt, leo arcu malesuada elit, iaculis aliquam neque tortor a nisi. Aliquam placerat faucibus tortor, et interdum massa tristique vitae. Maecenas commodo lobortis libero ac placerat. Nam tincidunt augue non sollicitudin iaculis. Etiam consectetur libero non neque varius efficitur. Maecenas id tortor ipsum.

In hac habitasse platea dictumst. Phasellus ut quam et eros ullamcorper posuere nec vitae sapien. Cras id leo placerat, porttitor felis vel, accumsan mauris. Nullam eget mauris vitae libero tincidunt dictum non et sem. Integer ipsum orci, blandit sit amet porta sollicitudin, interdum id nisl. Duis ac nulla mauris. Fusce dictum porttitor dolor vel viverra. Integer tempus nisi sed enim semper tristique. Maecenas feugiat, lectus ac viverra semper, orci libero lobortis urna, placerat accumsan nulla quam non libero. Proin ex ante, vehicula quis aliquam id, consectetur efficitur orci. Quisque nisi quam, volutpat at convallis condimentum, sodales eget magna.

</div>

最佳答案

在您的示例中,div 本身不滚动,您看到的滚动属于主体,这就是为什么您会看到相同的结果...试试这个:

const el = document.querySelector('.testDiv');
console.log('clientHeight:', el.clientHeight);
console.log('scrollHeight:', el.scrollHeight);
console.log('offsetHeight:', el.offsetHeight);
.testDiv {
    background-color: red;
    border: 50px solid yellow;
    height: 500px;
    overflow: auto;
}
<div class="testDiv">

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse scelerisque quam a ultricies eleifend. Duis pharetra mi sit amet est tempor auctor. Vestibulum pellentesque metus at blandit pharetra. Cras sodales sem eu nisl interdum, placerat ornare nisi malesuada. Nam at bibendum nunc, eu feugiat neque. Sed quis lacus in lacus ornare ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris accumsan libero eget libero iaculis varius.

 Nulla eget orci dolor. Curabitur varius volutpat arcu, sed porta erat faucibus vitae. Nulla vitae consequat tortor. Sed ornare, elit sit amet tempus tincidunt, leo arcu malesuada elit, iaculis aliquam neque tortor a nisi. Aliquam placerat faucibus tortor, et interdum massa tristique vitae. Maecenas commodo lobortis libero ac placerat. Nam tincidunt augue non sollicitudin iaculis. Etiam consectetur libero non neque varius efficitur. Maecenas id tortor ipsum.
            
In hac habitasse platea dictumst. Phasellus ut quam et eros ullamcorper posuere nec vitae sapien. Cras id leo placerat, porttitor felis vel, accumsan mauris. Nullam eget mauris vitae libero tincidunt dictum non et sem. Integer ipsum orci, blandit sit amet porta sollicitudin, interdum id nisl. Duis ac nulla mauris. Fusce dictum porttitor dolor vel viverra. Integer tempus nisi sed enim semper tristique. Maecenas feugiat, lectus ac viverra semper, orci libero lobortis urna, placerat accumsan nulla quam non libero. Proin ex ante, vehicula quis aliquam id, consectetur efficitur orci. Quisque nisi quam, volutpat at convallis condimentum, sodales eget magna.
            
Integer accumsan vehicula sagittis. Donec sed malesuada mauris, at sagittis odio. Donec facilisis orci at sapien gravida, ac cursus dolor consectetur. Integer gravida at elit non eleifend. Fusce maximus mauris vitae lectus venenatis, id volutpat mauris viverra. Etiam libero urna, porttitor ut neque feugiat, maximus sollicitudin lorem. Morbi convallis ultrices sem quis rutrum. Aenean varius risus non justo accumsan posuere. Nam egestas quis leo quis suscipit. Morbi ac quam quam. Aliquam erat volutpat.
            
Morbi eget dui ut mauris bibendum laoreet vitae sed nunc. Duis dignissim, lacus ornare condimentum semper, est elit fringilla nisi, ac pharetra risus diam eu sem. Curabitur eget urna nec ex pharetra lacinia. Proin eu metus felis. Nunc luctus sem eget nulla volutpat vestibulum. Phasellus ut interdum velit, sit amet vestibulum tortor. Donec pretium euismod pharetra. Donec consequat in sem quis consectetur. Proin tempor nulla nibh, sed porta dolor hendrerit a. Nam tincidunt nisl eget leo ornare, non fringilla nulla viverra. Suspendisse volutpat est vel tellus gravida tempor.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse scelerisque quam a ultricies eleifend. Duis pharetra mi sit amet est tempor auctor. Vestibulum pellentesque metus at blandit pharetra. Cras sodales sem eu nisl interdum, placerat ornare nisi malesuada. Nam at bibendum nunc, eu feugiat neque. Sed quis lacus in lacus ornare ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris accumsan libero eget libero iaculis varius.

Nulla eget orci dolor. Curabitur varius volutpat arcu, sed porta erat faucibus vitae. Nulla vitae consequat tortor. Sed ornare, elit sit amet tempus tincidunt, leo arcu malesuada elit, iaculis aliquam neque tortor a nisi. Aliquam placerat faucibus tortor, et interdum massa tristique vitae. Maecenas commodo lobortis libero ac placerat. Nam tincidunt augue non sollicitudin iaculis. Etiam consectetur libero non neque varius efficitur. Maecenas id tortor ipsum.

In hac habitasse platea dictumst. Phasellus ut quam et eros ullamcorper posuere nec vitae sapien. Cras id leo placerat, porttitor felis vel, accumsan mauris. Nullam eget mauris vitae libero tincidunt dictum non et sem. Integer ipsum orci, blandit sit amet porta sollicitudin, interdum id nisl. Duis ac nulla mauris. Fusce dictum porttitor dolor vel viverra. Integer tempus nisi sed enim semper tristique. Maecenas feugiat, lectus ac viverra semper, orci libero lobortis urna, placerat accumsan nulla quam non libero. Proin ex ante, vehicula quis aliquam id, consectetur efficitur orci. Quisque nisi quam, volutpat at convallis condimentum, sodales eget magna.

</div>

关于javascript - 为什么 scrollHeight、clientHeight 和 offsetHeight 都返回相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50206854/

相关文章:

dom - 如何通过 DOM 在 xml 文档中插入 schemalocation

javascript - 如何从 Javascript 设置图像 url

javascript - 在单独的容器中拖放,并调整放置元素的位置

javascript - 返回 iframe 的流 HTMLElement.querySelector

javascript - 使用 document.getElementById 获取渲染对象

Java - 从动态 XML 中删除子节点

javascript - 关于 Angular 中构造函数和 ngOnInit() 之间逻辑的混淆

javascript - EXTJS + 保存网格后使用数据库 ID 更新商店

javascript - javascript document.createElement ('bootstrap' ) 是做什么的?不存在 'bootstrap' 这样的 DOM 元素类型!

javascript - 使用 JQuery 创建元素时遇到问题