offsetWidth 是什么?从外形上来看,它和width很像,其实offsetWidth是取得一个DOM对象的border + padding + width的和。果然是和width属性是有关联的啊。
我们认识了offsetWidth后,看一下以下的代码,看看offsetWidth返回的值是什么。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>offsetWidth的怪异问题</title>
<style>
.img-wrap {
width: 520px;
height: 280px;
position: relative;
margin: 100px auto 0;
border: 1px solid #F00;
}
.img-wrap ul {
position: absolute;
left: 0;
top: 0;
margin: 0;
padding: 0;
}
.img-wrap ul li {
list-style: none;
float: left;
}
.img-wrap ul li img {
display: block; /* 消除img的魔鬼间距 */
}
</style>
</head>
<body>
<div class="img-wrap">
<ul>
<li><img src="./image/aa.webp"/></li>
<li><img src="./image/bb.jpg"/></li>
<li><img src="./image/cc.jpg"/></li>
<li><img src="./image/ee.webp"/></li>
</ul>
</div>
<script>
var oImgWrap = document.querySelector('.img-wrap');
var oUl = document.querySelector('ul');
var aLi = oUl.getElementsByTagName('li');
var aWidth = aLi[0].offsetWidth;
console.log(aWidth);// 输出的值是什么?
console.log(oUl.offsetWidth); // 输出的值是什么?
</script>
</body>
</html>
这里我要补充说明的是,代码中引入的图片的规格都是520 * 280的(单位:px)。所以以上代码输出的值是什么?520吗?很让人意外的是输出的是0。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>幻灯片</title>
<style>
.img-wrap {
width: 520px;
height: 280px;
position: relative;
margin: 100px auto 0;
border: 1px solid #F00;
}
.img-wrap ul {
position: absolute;
left: 0;
top: 0;
margin: 0;
padding: 0;
}
.img-wrap ul li {
list-style: none;
float: left;
}
.img-wrap ul li img {
display: block; /* 消除img的魔鬼间距 */
}
</style>
</head>
<body>
<div class="img-wrap">
<ul>
<li><img src="./image/aa.webp"/></li>
<li><img src="./image/bb.jpg"/></li>
<li><img src="./image/cc.jpg"/></li>
<li><img src="./image/ee.webp"/></li>
</ul>
</div>
<script>
window.onload = function () {
var oImgWrap = document.querySelector('.img-wrap');
var oUl = document.querySelector('ul');
var aLi = oUl.getElementsByTagName('li');
var aWidth = aLi[0].offsetWidth;
console.log(aWidth); // 520
console.log(oUl.offsetWidth);// 520
}
</script>
</body>
</html>
这段代码比上段代码多出了一句window.onload = function () {},这句话的作用是当文档内容或者图片加载完毕后再执行里面的代码,我们发现offsetWidth的值被正确的获取到了,可是按照我的理解,最初的那段代码的js是放在最后面的,按道理来说,执行输出offsetWidth值得时候,文档和图片都应该是加载完毕了的,不应该会出现获取不到offsetWidth值得情况呀。这种怪异的现象先记录在此,以后写代码的时候尽量要写上window.onload = function() {}。