html的区域大小,JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性...

本文详细介绍了在Web开发中如何利用DOM API获取元素的尺寸和位置,特别是offsetWidth、clientWidth和scrollWidth等属性的含义和应用场景。文章通过实例测试验证了这些属性在不同元素(普通HTML元素、HTML根元素和body元素)上的表现,总结了在实际编码中的使用技巧。测试结果显示,这些属性在现代浏览器中具有良好的兼容性。
摘要由CSDN通过智能技术生成

在web开发中,不可避免遇到要计算元素大小以及位置的问题,解决这类问题的方法是利用DOM提供的一些API结合兼容性处理来,所有内容大概分3篇左右的文章的来说明。本文作为第一篇,介绍DOM提供的与尺寸大小相关的DOM属性,提供一些兼容性处理的方法,并结合常见的场景说明如何正确运用这些属性。

1. 正确理解offsetWidth、clientWidth、scrollWidth及相应的height属性

假设某一个元素的横纵向滚动条都拖动到最末端,则offsetWidth、clientWidth、scrollWidth等属性相应的范围如下图所示:

af5957ccfa19d384cb31068b3c0daae8.png

1)offsetWidth ,offsetHeight对应的是盒模型的宽度和高度,这两个值跟我们使用chrome审查元素时看到的尺寸一致:

49092691347fc93ee23280f656b0238e.png

2)scrollWidth,与scrollHeight对应的是滚动区域的宽度和高度 , 但是不包含滚动条的宽度!滚动区域由padding和content组成。

3)clientWidth,clientHeight对应的是盒模型除去边框后的那部分区域的宽度和高度,不包含滚动条的宽度。

4)任何一个DOM元素,都可以通过以下api快速得到offsetWidth,clientWidth,scrollWidh及相关的height属性:

//domE为一个DOM Html Element对象

domE.scrollWidth

domE.scrollHeight

domE.clientWidth

domE.clientHeight

domE.offsetWidth

domE.offsetHeight

//domE为一个DOM Html Element对象

domE.scrollWidth

domE.scrollHeight

domE.clientWidth

domE.clientHeight

domE.offsetWidth

domE.offsetHeight

5) 这些属性在现代浏览器包括pc和mobile上几乎没有兼容性问题,可以放心使用 。如果你想了解详细的兼容性规则,可以参考下面的2篇文章:

W3C DOM Compatibility – CSS Object Model View

cssom视图模式cssom-view-module相关整理与介绍

下面针对普通html元素,html根元素和body元素的以上相关属性一一测试,以便验证前面的结论,总结一些可在实际编码过程中直接使用的经验技巧。之所以要区分普通html元素,html根元素和body元素,是因为前面的理论,在html根元素和body元素会有一些怪异之处,需要小心处理。

注:

1、为了减少篇幅,测试贴出的代码不是完整的代码,但不影响学习参考,另外文中给出的测试结果都是在chrome(版本:45.0)下运行得出的,在测试结果有差异的情况下,还会给出IE9,IE10,IE11,firefox(版本:42.0),opera(版本:34.0)的测试结果,没有差异的会在测试结果中说明,不考虑IE8及以下。

2、safari因为设备限制暂不测试,另外它跟chrome内核相同,对标准支持的可靠性差不到哪去。

3、老版本的chrome,firefox,opera也因为设备的限制无法测试,不过从浏览器对标准的支持程度考虑,这三个浏览器在很早的版本开始对W3C的标准都是比较规矩的,加之这些浏览器更新换代的速度较快,现在市面上这些浏览器主流的版本也都是较新的。

4、由于不考虑IE8及以下,同时html现在都用html5,所以document.compatMode = ‘BackCompat' 的情况不考虑。不过尽管BackCompat模式是IE6类的浏览器引出的,但是对于chrome,firefox等也存在document.compatMode = ‘BackCompat' 的情况,比如下面的这个网页,你用chrome打开,并且在console中打印document.compatMode,你会发现它的值也是BackCompat(原因跟该页面用的是html4.0的dtd有关,如果换成html4.01的dtd就不会在chrome和firefox里出现该情况了):

测试一、验证普通html元素(非body及html根元素)的offsetWidth、clientWidth、scrollWidth及相关height属性:

html,

body {

margin: 0;

}

body {

padding: 100px;

}

.box {

overflow: scroll;

width: 400px;

height: 300px;

padding: 20px;

border: 10px solid #000;

margin: 0 auto;

box-sizing: content-box;

}

.box-2 {

border: 1px solid #000;

}

...

var boxE = document.querySelectorAll('.box')[0];

console.log('scrollWidth:' + boxE.scrollWidth);

console.log('scrollHeight:' + boxE.scrollHeight);

console.log('clientWidth:' + boxE.clientWidth);

console.log('clientHeight:' + boxE.clientHeight);

console.log('offsetWidth :' + boxE.offsetWidth);

console.log('offsetHeight:' + boxE.offsetHeight);

html,

body{

margin: 0;

}

body{

padding: 100px;

}

.box{

overflow: scroll;

width: 400px;

height: 300px;

padding: 20px;

border: 10px solid #000;

margin: 0 auto;

box-sizing: content-box;

}

.box-2{

border: 1px solid #000;

}

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值