目录
一、客户区大小
clientHeight
clientWidth
clientLeft
clientTop
二、页面大小
三、注意事项
关于元素尺寸,一般地,有偏移大小offset、客户区大小client和滚动大小scroll。前文已经介绍过偏移属性,后文将介绍scroll滚动大小,本文主要介绍客户区大小client。
一、客户区大小
客户区大小client指的是元素内容及其内边距所占据的空间大小
clientHeight
clientHeight属性返回元素节点的客户区高度
element.clientHeight = padding-top + height + padding-bottom
包含padding 不包含 border 和 margin以及水平滚动条的高度
clientWidth
clientWidth属性返回元素节点的客户区宽度
element.clientWidth = padding-left + width + padding-right
包含padding 不包含 border 和 margin以及垂直滚动条的宽度
clientWidth / clientHeight示例:
<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div>
<script>
//120(10+100+10)
console.log(test.clientHeight);
console.log(test.clientWidth);
</script>
注意:滚动条宽度不计算在内
<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;overflow:scroll"></div>
<script>
//103(120-17),滚动条宽度为17px
console.log(test.clientHeight);
console.log(test.clientWidth);
</script>
<div id="test" style="width:100px;margin: 10px;border: 1px solid black;overflow:scroll;font-size:20px;line-height:1;height:100px">
内容<br>内容<br>内容<br>内容<br>内容<br>内容<br>
</div>
<script>
//83(100-17)
console.log(test.clientHeight);
</script>
当height和纵向padding的和为0(以及小于17px的情况)时,如果仍然存在滚动条,各浏览器表现不一样。
<div id="test" style="width: 100px;height:0;margin: 10px;border: 1px solid black;overflow:scroll"></div>
<script>
//chrome/safari:-17(0-17)
//firefox/IE:0
console.log(test.clientHeight);
</script>
<div id="test" style="width: 100px;height:10px;margin: 10px;border: 1px solid black;overflow:scroll"></div>
<script>
//chrome/safari:-7(10-17)
//firefox/IE:0
console.log(test.clientHeight);
</script>
bug
如果设置overflow:scroll,使得滚动条始终存在,当不设置高度height值时,各个浏览器表现不一样。firefox存在一个最小高度为34px的垂直滚动条,IE7-浏览器存在一个最小高度为19px的垂直滚动条,而其他浏览器的垂直滚动条无最小高度
所以,当clientHeight的值小于34px时,firefox会返回34;当clientHeight的值小于19px时,IE7-会返回19
<div id="test" style="width: 100px;margin: 10px;border: 1px solid black;overflow:scroll"></div>
<script>
//chrome/IE8+/safari:0(因为height和padding都是0)
//firefox:34(设置overflow:scroll之后,默认存在一个高34px的垂直滚动条)
//IE7-:19(默认存在一个高19px的垂直滚动条)
console.log(test.clientHeight);
</script>
<div id="test" style="width: 100px;margin: 10px;border: 1px solid black;font-size:20px;line-height:1;overflow:scroll">内容</div>
<script>
//chrome/IE8+/safari:20(20*1)
//firefox:34(20<34)
//IE7-:20(20>19)
console.log(test.clientHeight);
</script>
<div id="test" style="width: 100px;padding-top:20px;margin: 10px;border: 1px solid black;font-size:20px;line-height:1;overflow:scroll">内容</div>
<script>
//chrome/IE8+/safari:40(20*1+20)
//firefox:40(40>34)
//IE7-:40(40>19)
console.log(test.clientHeight);
</script>
—— 小结:客户区client系列属性:clientWidth 和 clintHeight属性。
clientWidth属性:此属性返回一个元素的宽度值,包括元素的内容和内边距,但不包括边框、外边距和滚动条部分。返回值是一个整数,单位是像素。此属性是只读的。
clientHeight属性:此属性返回一个元素的高度值,包括元素的内容和内边距,但不包括边框、外边距和滚动条部分。返回值也是一个整数,单位是像素。此属性是只读的。
这两个属性的主要用途是获取元素的可视区域大小,不包括滚动条等隐藏部分。
在前端开发中,clientWidth和clientHeight属性常用于确定元素的可视区域大小,这对于布局调整和动态内容显示非常重要。例如,在实现自适应布局时,开发者需要获取元素的clientWidth和clientHeight来调整布局以适应不同屏幕尺寸。此外,在实现滚动效果时,这些属性也用于计算滚动条的位置和大小 。
clientLeft
clientLeft属性返回左边框的宽度
clientTop
clientTop属性返回上边框的宽度
<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div>
<script>
//1 1
console.log(test.clientLeft);
console.log(test.clientTop);
</script>
注意:如果display为inline时,clientLeft属性和clientTop属性都返回0
<div id="test" style="display:inline;width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div>
<script>
//0 0
console.log(test.clientLeft);
console.log(test.clientTop);
</script>
二、页面大小
常用document.documentElement的client属性来表示页面大小(不包含滚动条宽度)
注意:在IE7-浏览器中,<html>元素默认存在垂直滚动条
<body style="overflow:scroll">
<script>
//1903(1920-17)
console.log(document.documentElement.clientWidth);
//930(947-17)
console.log(document.documentElement.clientHeight);
</script>
另一对常用的表示页面大小的属性是window.innerHeight和innerWidth属性(包含滚动条宽度)
innerHeight和innerWidth表示的是浏览器窗口大小减去菜单栏、地址栏等剩余的页面尺寸,由于滚动条是属于页面的,所以包含滚动条
注意:IE8-浏览器不支持innerHeight和innerWidth属性
<body style="overflow:scroll">
<script>
//1920
console.log(window.innerWidth);
//947
console.log(window.innerHeight);
</script>
如果没有滚动条,这两类属性在电脑端表示同样的值,但是却表示不同的含义。在移动端,innerWidth和innerHeight表示的是视觉视口,即用户正在看到的网站的区域;而document.documentElement.clientWidth和clientHeight表示的是布局视口,指CSS布局的尺寸。详细情况移步至此:移动web开发之视口viewport
注意:页面的客户区大小和页面的实际大小是不同的,页面的实际大小将由后文的scroll滚动大小来表示。
✔ 实用的获取页面大小的浏览器兼容性JavaScript 方案(涵盖所有浏览器):
var w=window.innerWidth || document.documentElement.clientWidth
|| document.body.clientWidth;
var h=window.innerHeight || document.documentElement.clientHeight
|| document.body.clientHeight;
三、注意事项
【1】所有客户区client属性都是只读的
<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div>
<script>
console.log(test.clientHeight);
//IE8-浏览器会报错,其他浏览器则静默失败
test.clientHeight = 10;
console.log(test.clientHeight);
</script>
【2】如果给元素设置了display:none,则客户区client属性都为0
<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;display:none;"></div>
<script>
console.log(test.clientHeight);//0
console.log(test.clientTop);//0
</script>
【3】每次访问客户区client属性都需要重新计算,重复访问需要耗费大量的性能,所以要尽量避免重复访问这些属性。如果需要重复访问,则把它们的值保存在变量中,以提高性能
<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div>
<script>
console.time("time");
for(var i = 0; i < 100000; i++){
var a = test.clientHeight;
}
console.timeEnd('time');//66.798ms
</script>
<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div>
<script>
console.time("time");
var a = test.clientHeight;
for(var i = 0; i < 100000; i++){
var b = a;
}
console.timeEnd('time');//1.705ms
</script>
● 参考资料 ●
scrollTop及offsetTop的对比_scrolltop和offsettop-CSDN博客
JS | JS之元素偏移量 offset 系列属性详解 - 烤地瓜的CSDN博客
JS | JS之深入理解滚动scroll系列属性- 烤地瓜的CSDN博客
JS | 详解图片懒加载的6种实现方案之利用JS监听scroll滚动事件