相信不少人跟我同样,在实际开发中有时候须要用到原生js来获取一个元素的宽高,天真的觉得 document.getElementById('box').style.width 就能够获取到,可是结果常常事与愿违~这也让不少小伙伴摸不着头脑~这里我为何要说常常而不说老是呢??是由于有时候能够获取有时候却不能。what????(黑人问号脸)还有这种操做?碰到这种状况的时候你是否是怀疑人生了,哈哈。。。。。bash
发生的缘由:之因此会出现有时候能够获取,有时候不能够获取的状况,是由于亲爱的你有时候把样式写在style标签中了,有时候又把样式写在style属性中了,你的不经意,却形成了很是大的差距呢~post
有如下两种状况:测试
可是在实际开发中,咱们不多会把样式写在style属性中,那该如何获取呢?下面咱们就来讲一下offset系列~ui
<style>
#box1{
width: 200px;
height: 200px;
background: pink;
position: absolute;
left: 100px;
top: 50px;
}
#box2{
width: 100px;
height: 100px;
background: lightgreen;
}
#btn{
position: absolute;
top: 250px;
}
</style>
<body>
<div id="box1" style="width:200px">
<div id="box2"></div>
</div>
<input type="button" value="按钮" id="btn">
<script>
var box1=document.getElementById('box1');
var box2=document.getElementById('box2');
document.getElementById('btn').onclick=function(){
console.log(box1.style.width); //200px
console.log(box1.style.height); //获取不到
console.log(box1.offsetWidth); //200
console.log(box1.offsetHeight); //200
console.log(box1.offsetLeft); //100
console.log(box1.offsetTop); //50
}
</script>
</body>
复制代码
总结:由上能够看出,offset系列获取到的值都是数字类型,很容易操做spa
以上咱们主要是针对box1进行分析的,下面咱们对box2进行分析,按照如下两种状况依次分析,分析影响offsetLeft、offsetTop的因素有哪些(这里以offsetLeft为例):3d
没有脱离文档流:code
offsetLeft:父级元素margin+父级元素padding+父级元素的border+本身的margincdn
脱离文档流了:blog
主要是本身的left和本身的margin ,与padding无关,与border无关 ip
该系列没有什么理解复杂的部分,经常使用的属性通常就是scrollLeft、scrollTop这两个属性,就是卷曲出去的值,这里我以为也没什么可分析的,就来给你们看一下经常使用的场景:
总结:由上图能够看出来,client获取到的也是数字类型的值,并且clientLeft、clientTop结果与边框有关,通过测试,给box加上margin、padding后,上图的值不变,可见与margin、padding无关
看到这里,你们对这三个系列我想已经有了必定的认识与了解,在这以前,我写过一篇文章,原生js如何实现懒加载?,当时不理解这三个系列的宝宝们可能有点懵,如今回过头去看我想应该很是easy了吧~