clientHeight,offsetHeight与scrollHeight的相关知识

在html里,width与height是最常用也是最基础的两个属性,因此,在js里,我们也经常需要操作这两个属性。js关于这两个属性提供了client*,offset*与scroll*,很多同学搞不清楚这三者之间的区别,经常望着这三个属性满脸问号,不知道该用哪个。所以今天就来看一下这三个属相的区别。

JUST SHUTUP AND SHOW ME YOUR CODE!!

ok,不多说话,看代码。

<style>
    .out{
       width:100px;
       height:100px;
       background:red;
    }
</style>
<body>
    <div class="out"></div>
</body>

我们这里创建了一个宽100,高100的红色方块,没有border,没有margin,也没有padding。我们先看这种情况下三个属性的值

var out = document.querySelector(‘.out‘);
console.log(out.clientHeight);   //100
console.log(out.offsetHeight);  //100
console.log(out.scrollHeight);  //100

恩,值都一样,似乎看不出来什么,现在我们加一个padding

<style>
    .out{
       width:100px;
       height:100px;
       background:red;
       padding:20px;
    }
</style>
<body>
    <div class="out"></div>
</body>

方块更大了,我们看一下这种情况下三个属性的值

var out = document.querySelector(‘.out‘);
console.log(out.clientHeight);   //140
console.log(out.offsetHeight);  //140
console.log(out.scrollHeight);  //140

恩,值依然都相同,都是可视区高度+padding(不是content的高度+padding,原因一会说),现在我们再加一个border

<style>
    .out{
       width:100px;
       height:100px;
       background:red;
       padding:20px;
       border:10px solid black;
    }
</style>
<body>
    <div class="out"></div>
</body>

方块外面多了一个10像素的边框,我们再看一下三个属性的值

var out = document.querySelector(‘.out‘);
console.log(out.clientHeight);   //140
console.log(out.offsetHeight);  //160
console.log(out.scrollHeight);  //140

注意,这时候发生变化了,clientHeight和scrollHeight没变化,offsetHeight变成了160!

观察到这里我们可以得到一个简易的结论:

clientHeight = 可视区高度 + padding

offsetHeight = content高度 + padding + border

scrollHeight = 可视区高度 + padding

仔细,仔细观察上面的结论(表述未必完全准确,待会会解释),scrollHeight与clientHeight一样(没有滚动的情况下),先不说,看offsetHeight与clientHeight。

offsetHeight相比clientHeight多了boder的宽度,然而可视区高度content高度又有什么不同呢?

看下面的图,我强制给方块添加了滚动条

<style>
    .out{
       width:100px;
       height:100px;
       background:red;
       padding:20px;
       border:10px solid black;
       overflow:scroll;
    }
</style>
<body>
    <div class="out"></div>
</body>

此时的三个属性值为

var out = document.querySelector(‘.out‘);
console.log(out.clientHeight);   //128
console.log(out.offsetHeight);  //160
console.log(out.scrollHeight);  //128

绿色的线表示可视区高度,蓝色的线表示content的高度

由于方块出现了滚动条,滚动条占用了一定的大小,可视区因此变小了,所以此时的方块,可视区高度 < content高度

了解了这一点,我们就知道,offsetHeight并不是仅仅比clientHeight多了border的宽度,即使没有border,但是有滚动条的情况下,clientHeight是要小于offsetHeight的

下面再来看scrollHeight

为外面的方块添加一个子方块

<style>
    .out{
       width:100px;
       height:100px;
       background:red;
       padding:20px;
       border:10px solid black;
    }
    .inner{
       width:200px;
       height:200px;
       background:blue;
    }
</style>
<body>
    <div class="out">
        <div class="inner"></div>
    </div>
</body>

此时的scrollHeight的值为:

var out = document.querySelector(‘.out‘);
console.log(out.scrollHeight);  //220

值为220,即scrollHeight = 内部元素的实际高度(content+padding+border+margin) + 父元素的padding-top值

注:当有滚动条时,padding-bottom和padding-right是无效的,不会进行计算,也不会进行渲染(chrome除外)

再次注意,这里计算时,对父元素的padding值应该只计算一个(即使父元素上下padding都设置了值),可以认为只计算padding-top值(实验证明确实计算的是padding-top值,如果不设置padding-top,只设置padding-bottom,那该值是无效的)

截止到目前为止,mac上的chrome(版本:51.0.2704.106 (64-bit))对scrollHeight的计算和渲染应该是错误的(不确定是不是错误,欢迎指正),因为chrome计算scrollHeight时,计算了padding-bottom,公式如下:

scrollHeight = 内部元素的实际高度(content+padding+border+margin) + 父元素的padding-top值 + 父元素的padding-bottom值

chrome不仅是这样计算的,也是这样渲染的!!

  

如上图,padding-bottom在mac上的chrome上起了作用,而在其他浏览器上没有作用(padding-right也是如此)



以上是关于height的三个属性的一些说明,width的三个属性同理,就不再多说,这里可以总结一下:

clientHeight = 可视区高度 + padding

offsetHeight = content高度 + padding + border

当内部元素高度超出了外部元素高度时

  scrollHeight = 内部元素的实际高度(content+padding+border+margin) + 父元素的padding-top值

当内部元素高度小于外部元素高度是

  scrollHeight = 可视区高度 + padding



既然说完了这三个属性,就顺便说说相关的clientTop,offsetTop,和scrollTop吧

clientTop是指当前可视对象距离上一级元素的距离,因为当前可视对象不包含border,所以通常来说,clientTop就等于border-top值

offsetTop是指当前元素到body元素的距离,因为当前元素包含了border,所以计算时要从margin值开始,依次向外加

scrollTop是指可滚动元素超出当前窗口显示范围的高度,超出多少与当前窗口的border的宽度无关

时间: 2024-09-30 06:05:02

clientHeight,offsetHeight与scrollHeight的相关知识的相关文章

搞清clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop

每个HTML元素都具有clientHeight offsetHeight scrollHeight offsetTop scrollTop 这5个和元素高度.滚动.位置相关的属性,单凭单词很难搞清楚分别代表什么意思之间有什么区别.通过阅读它们的文档总结出规律如下:clientHeight和offsetHeight属性和元素的滚动.位置没有关系它代表元素的高度,其中:clientHeight:包括padding但不包括border.水平滚动条.margin的元素的高度.对于inline的元素这个属

详解clientHeight、offsetHeight、scrollHeight

关于clientHeight.offsetHeight.scrollHeight window.screen.availWidth 返回当前屏幕宽度(空白空间) window.screen.availHeight 返回当前屏幕高度(空白空间) window.screen.width 返回当前屏幕宽度(分辨率值) window.screen.height 返回当前屏幕高度(分辨率值) window.document.body.offsetHeight; 返回当前网页高度 window.docume

clientHeight ,offsetHeight,style.height,scrollHeight的区别与联系

style.height 包括元素的滚动条,不包括边框 clientHeight 不包括元素的滚动条和边框,只有在没有元素的滚动条的情况下,style.height相等于clientHeight offsetHeight 包括元素的滚动条和边框,只有在没有元素的滚动条和边框的情况下,offsetHeight==style.height==clientHeight scrollHeight offsetHeight+scrollTop,只有在没有元素的滚动条和边框和滚动时的情况下,offsetHe

clientHeight ,offsetHeight,style.height,scrollHeight有区别与联系

style.height 包括 元素的滚动条,不包括边框clientHeight 不包括元素的滚动条和边框,只有在没有元素的滚动条的情况下,style.height相等于clientHeightoffsetHeight 包括元素的滚动条和边框,只有在没有元素的滚动条和边框的情况下,offsetHeight==style.height==clientHeightscrollHeight offsetHeight+scrollTop,只有在没有元素的滚动条和边框和滚动时的情况下,offsetHeig

height、clientHeight、offsetHeight、scrollHeight、height()、 innerHeight()、outerHeight()等的区别

1.height height是css属性,这个属性定义元素内容区的高度,在内容区外面可以增加内边距.边框和外边距. 当  box-sizing: content-box 时,高度应用到元素的内容框. 当  box-sizing:border-box时,高度包含了内容框.内边距和边框. 2.clientHeight Element.clientHeight只读属性是没有的CSS或内联布局框元素为零,否则它的像素单元内的高度,但不包括填充水平滚动条的高度,边界或边缘. // 包含元素的conten

浅谈style.height、clientHeight、offsetHeight、scrollHeight

先分别介绍以下,以下资料来自MDN HTMLElement.offsetHeight 是一个只读属性,它返回该元素的像素高度,高度包含该元素的垂直内边距和边框,且是一个整数. Element.clientHeight 是一个只读属性,它返回该元素的像素高度,高度包含该元素的垂直内边距和边框,且是一个整数. Element.scrollHeight 是一个只读属性,是一个元素内容高度的度量,包括由于溢出导致的视图中不可见内容 style.height clientHeight offsetHeig

搞懂offsetY、offsetTop、scrollTop、offsetHeight、scrollHeight

先搞offsetTop,最难懂的就是它了 官方解释:返回当前元素的上边界到它的包含元素的上边界的偏移量,以像素为单位.这真TM坑爹啊!有木有!经过仔细研究查找得出结论:offsetTop是相对于离它最近的具有绝对或相对定位的父级元素的距离,有点绕口是不是?别急,咱慢慢剥开它...首先一定要明白offsetTop是一个相对值,那它到底是相对于谁的值呢,现在的女明星不都流行找干爹嘛,offsetTop也给自己找了一个,别人的要求是要有钱有权,而它的要求是要有position(只能是relative和

offsetTop/offsetHeight scrollTop/scrollHeight 的区别

offsetTop/offsetHeight   scrollTop/scrollHeight  这几个属性困扰了我N久,这次一定要搞定. 假设 obj 为某个 HTML 控件. obj.offsetTop   obj距离上方或上层控件的位置,整型,单位像素. obj.offsetHeight   obj自身的高度,整型,单位像素. offsetTop 可以获得 HTML 元素距离上方或外层元素的位置,style.top 也是可以的,二者的区别是: 一.offsetTop 返回的是数字,而 st

python的list相关知识

关于list的相关知识 list01 = ['alex',12,65,'xiaodong',100,'chen',5] list02 = [67,7,'jinjiao_dawang','relax1949',53] #打印list01.list02 print(list01) print(list02) #列表截取.切片 print(list01[1]) print(list01[-2]) print(list01[1:3]) #列表重复 print(list01 * 3) #列表组合 prin