摘要:元素的尺寸和位置元素的尺寸包括內容區寬高不包括如果元素的是那么此時設置的就是該元素的也就是等于內容區的寬高滾動條。元素的位置使用我們可以得到元素相對于的位置。還有一種方法可以得到元素相對于最近定位的祖先元素的位置,就是使用和屬性。
DOM元素的尺寸和位置 DOM 元素的尺寸 DOM.offsetWidth/offsetHeight:
包括內容區寬/高,padding,border,不包括margin.
如果元素的box-sizeing是border-box,那么此時設置的style.width/style.height就是該元素的offsetWidth/offsetHeight.也就是等于內容區的寬/高 + padding + border + 滾動條。
包括內容區寬/高,padding,不包括border 和margin.
在box-sizing:border-box的情況下,等于style.width/height - border的寬度。
這里還有另外一種換算方法:clientWidth/clientHeight = offsetWidth/height - border - 滾動條的寬/高
包括內容區的寬/高,padding,以及子元素超出的寬/高,不包括border.
就是clientWidth / clientHeight 加上其子元素超出的寬/高。
box-sizing:border-box的情況也是一樣。
值得注意的是:這里 DOM的子元素超出部分 的計算隨著DOM的overflow的取值不同而略有不同。
如下:綠色盒子寬高100px,padding:20px;box-sizing:content-box里面有一個高度為200px的紅色盒子
當綠色盒子的overflow為默認值的時候,綠色盒子的scrollHeight = 上邊距 20px + 紅色盒子的高度 = 220px
當綠色盒子的overflow屬性為auto,scroll,hidden中的任意一個的時候,其scrollHeight = 上邊距 + 下邊距 + 紅色盒子的高度 = 20 + 20 +200 = 240px
返回style屬性中的width和height。這兩個值根據box-sizing 的取值不同所表示的范圍也不同。
使用DOM.style.width/height 這種方式只能取到行內樣式,而取不到CSS樣式中的屬性值。更多時候,我們可能需要的是這個方法:
window.getComputedStyle(DOM) 返回一個DOM元素計算后的style對象。
當box-sizing:content-box的時候,style.width/height = offsetWidth/height - 滾動條的寬/高 - border - 內邊距。
當box-sizing :border-box的時候,style.width/height 就等于offsetWidth / offsetHeight
的clientHeight 和clientWidth 永遠等于viewport - 滾動條的寬度/高度(移動端除外),不論box-sizing的取值是什么。
返回一個DOMRect對象,包含left ,top,width,height 四個屬性的邊框集合
其中的left ,top 是相對于視口左上角而言的。如果元素滾動了,left,top值也是變化的。width/height就是元素的盒子模型(border + padding + content + 滾動條)的計算寬度和高度。對于html和body同樣適用。
使用element.getBoundingClientRect()我們可以得到元素相對于viewport的位置。
還有一種方法可以得到元素相對于最近定位的祖先元素的位置,就是使用element.offsetTop和element.offsetLeft 屬性。
這里有另外一個可以得到元素相對于根元素(通常情況下根元素指的是視口),根據element.offsetParent 一直向上查找,直到element.offsetParent == null。html,body的offsetParent都為null.
let current = element.offsetParent let top = element.offsetTop while(current){ top = current.offsetTop current = current.offsetParent }
值得注意的是,element.offsetTop/offsetLeft的計算的是element元素外邊框到包含它的元素的內邊框之間的距離。所以嚴格上來說,應該還要依據情況加上邊框的寬度的。但是邊框一般不會很大,最多1px 2px,所以可以忽略。
click 事件中鼠標指針的位置在PC,移動端的click事件中mouseEvent 都會包含以下信息:
e.clientX/e.clientY:返回鼠標指針相對與瀏覽器窗口客戶區的坐標。
e.pageX/e.pageY:返回鼠標指針相對于整個文檔的坐標。瀏覽器沒有滾動條的時候,這個值和e.clientX/e.clientY 是一樣的。但是有滾動條的時候,這個值就會比e.clientX/e.clientY大。
e.screenX/e.screenY返回鼠標指針相對于整個屏幕的坐標。哪怕此時你的瀏覽器被你縮小了移動到了角落,它的計算基準都是物理屏幕的左上角。
e.offsetX/e.offsetY返回鼠標指針相對于e.target的坐標,這一點要區別于e.currentTarget。由于事件的冒泡,所以當底層的元素點擊事件冒泡到頂層的時候,在頂層事件處理函數中的event 對象中的offsetX/offsetY 還是相對于最初觸發的底層元素。
如果祖先元素有translate,scale貌似這個值獲取不對。。。
換一種方法獲取吧,e.clientX,e.clientY配合element.getBoundingClientRect()
function getOffset(e){ let target = e.currentTarget let rect = target.getBoundingClientRect() return { x: e.clientX - rect.left, y: e.clientY - rect.top } }
這樣子不管其祖先元素有沒有設置transform,都可以在點擊的時候獲得鼠標指針位置相對于e.currentTarget的相對坐標。
移動端touch事件中一些關于位置的有用信息移動端的touch 事件我們也能得到許多類似的信息,這些信息存在e.touches 的touch對象中。
touch.screenX/touch.screenY:返回相對于屏幕邊沿的坐標。
touch.clientX/touch.clientY:返回相對于viewport邊沿的坐標。
touch.pageX/touch.pageY:返回相對于文檔邊沿的坐標。和clientX/clientY的區別跟上面差不多。
應該來說,這三個值在移動端很多時候都是相等的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/115629.html
摘要:元素的尺寸和位置元素的尺寸包括內容區寬高不包括如果元素的是那么此時設置的就是該元素的也就是等于內容區的寬高滾動條。元素的位置使用我們可以得到元素相對于的位置。還有一種方法可以得到元素相對于最近定位的祖先元素的位置,就是使用和屬性。 DOM元素的尺寸和位置 DOM 元素的尺寸 DOM.offsetWidth/offsetHeight: 包括內容區寬/高,padding,border,不...
摘要:元素的尺寸和位置元素的尺寸包括內容區寬高不包括如果元素的是那么此時設置的就是該元素的也就是等于內容區的寬高滾動條。元素的位置使用我們可以得到元素相對于的位置。還有一種方法可以得到元素相對于最近定位的祖先元素的位置,就是使用和屬性。 DOM元素的尺寸和位置 DOM 元素的尺寸 DOM.offsetWidth/offsetHeight: 包括內容區寬/高,padding,border,不...
摘要:整理獲取和尺寸和位置方法更多前端技術和知識點,搜索訂閱號菌訂閱視口頁面或窗口的位置和寬高獲取視口寬高下面方法是包括滾動條的寬高,不支持滾動條另外瀏覽器兼容差,可獲取包括工具欄的寬高頁面滾動位置返回整個頁面的滾動的位置,與返回的值一致,前者是 showImg(https://segmentfault.com/img/remote/1460000018860153?w=640&h=426)...
摘要:如何獲取元素的真實尺寸呢通過下,介紹。這個函數主要提供給我們元素和寬度在內的一系列值仍然不要妄想通過獲得,加上原先的,就可以減去和的值獲得元素的真實尺寸。 關于元素的尺寸和位置,這原本是 CSS 干的事,但更多的時候需要用 JavaScript 來獲取這些參數,比如一個很好的例子 js 實現的圖片瀑布流。 showImg(https://segmentfault.com/img/bVG...
閱讀 1026·2021-11-23 09:51
閱讀 2344·2021-10-08 10:22
閱讀 2544·2021-09-29 09:35
閱讀 853·2021-09-22 15:20
閱讀 2858·2019-08-30 15:53
閱讀 2413·2019-08-30 13:55
閱讀 1096·2019-08-29 17:27
閱讀 2869·2019-08-29 17:26