相信不少人跟我同樣,在實際開發中有時候須要用到原生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了吧~