DOM元素尺寸和位置相關的屬性(clientWidth、offsetWidth、scrollWidth...)總結

初衷

由於DOM元素位置和大小的屬性這塊和鼠標事件的知識點容易混淆,所以需要單獨總結一下,又不想把截圖存到本地,所以就有了這篇文章。如果有什麼地方寫的不對,還請私信或留言給我扶正! 謝謝。

爲了方便演示,先寫一些基本的代碼

html

<div><div>

css

/* 先把 body 的 8px margin 幹掉,看着太難受了 */
body {
  margin: 0;
}

div {
  width: 100px;
  height: 100px;
  padding: 10px;
  border: 2px solid #000;
  background-color: hotpink;
  margin: 100px auto;
}

js

// 先拿到這個元素
var div = document.querySelector('div')

clientWidth、clientHeight

該屬性表示計算元素內部的寬度和高度,包括內邊距(padding)

console.log(div.clientWidth, div.clientHeight);


輸出的結果爲

如果內容超出了,元素出現了滾動條,那麼這個值就會發生改變,會減掉滾動條的寬高.

在 html 中添加一些內容,在 vscode 中輸入 lorem 即可

<div>
  Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsa fuga dolorum impedit quisquam aspernatur quo iste esse, non repellendus eum placeat ullam, distinctio, eos tempore earum omnis officia quaerat laudantium.
</div>

把元素設置爲超出顯示滾動條

overflow:scroll;

這樣元素就會顯示滾動條了

然後再次運行代碼,查看輸出結果會發現 咦?

那麼這種計算就是把滾動條的寬度和高度減掉了


滾動條的寬度是 17px,所以結果就是 103px

offsetWidth、offsetHeight

返回元素的佈局寬度 (width/height + padding + border)


輸出的結果爲

scrollWidth、scrollHeight

返回元素內容實際的寬高,包括由於overflow溢出而在屏幕上不可見的內容。

 console.log(div.scrollWidth, div.scrollHeight);


運行結果 ,可以看出,它是包括隱藏的內容的,但是不包括 border
在這裏插入圖片描述

如果有滾動條呢,就會減去滾動條的寬高

在這裏插入圖片描述

運行結果

clientLeft、clientTop

表示元素邊框的寬度(粗細)

console.log(div.clientLeft,div.clientTop)

在這裏插入圖片描述

如果內容是從右向左顯示的,並且左邊出現垂直滾動條的話, clientLeft 會計算滾動條的寬度

給 div 添加樣式 direction: rtl; ,效果如下
在這裏插入圖片描述
運行結果: 就會加上滾動條的寬度來計算
在這裏插入圖片描述

offsetLeft、offsetTop

對於塊級元素來說,返回從當前元素的左上角想對於定位元素的父元素左上角的偏移量。 相當於定位元素的 left top 屬性。

修改代碼如下:

html

<div class="parent">
  <div class="box"></div>
</div>

css

.parent {
  width: 300px;
  height: 300px;
  border: 2px solid #000;
  position: relative;
  margin: 50px auto;
}

.box {
  width: 100px;
  height: 100px;
  background-color: #f78;
  position: absolute;
  top: 50px;
  left: 20px;
}

現在顯示是這樣的

這時候 offsetLect offsetTop 的值是這樣的
在這裏插入圖片描述
在這裏插入圖片描述

如果沒有定位的父元素,它是相對於窗口左上角的偏移量

 var parent = document.querySelector('.parent')
 console.log(parent.offsetLeft, parent.offsetTop);

因爲 parent 沒有定位的父元素,所以是根據可視區域左上角來定位的。

scrollLeft、scrollTop

可以獲取或設置元素的滾動條到元素左邊/頂部的距離

修改代碼

<div class="box">
    這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量
    這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量這個只讀屬性是元素內容寬度的一種度量
</div>
.box {
  width: 300px;
  height: 300px;
  background-color: #f78;
  position: absolute;
  top: 50px;
  left: 20px;
  overflow: scroll;
}

由於內容超出,出現滾動條了

 var div = document.querySelector('.box')
 // 給 文檔 綁定一個點擊事件 ,這樣當滑動滾動條的時候再點擊文檔,就可以打印出當前滾動條對於頂部的位置了.
 document.addEventListener('click', function () {
   console.log(div.scrollTop, div.scrollLeft);
 })

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章