確定元素相對於文檔/正文/瀏覽器窗口的位置的最簡單方法是什麼?現在我使用的是'.offsetLeft/offsetTop',但是這種方法只會給你相對於父元素的位置,所以你需要確定身體元素的父母有多少,以知道與身體/瀏覽器相關的位置窗口/文件位置。這種方法也很麻煩。查找元素相對於文檔的位置
回答
您可以遍歷offsetParent
直到DOM的頂層。
function getOffsetLeft(elem)
{
var offsetLeft = 0;
do {
if (!isNaN(elem.offsetLeft))
{
offsetLeft += elem.offsetLeft;
}
} while(elem = elem.offsetParent);
return offsetLeft;
}
http://www.quirksmode.org/js/findpos.html解釋最好的辦法,總而言之,你在正確的軌道上,你必須找到偏移量,並沿着父母的樹。
您可以使用element.getBoundingClientRect()
來獲取相對於視元素位置。
使用scrollY
(document.documentElement.scrollTop
跨瀏覽器兼容)計算視口偏移量。
兩者的總和將給出相對於元件的位置到文檔:
subjectRect.top + document.documentElement.scrollTop
相對於視口是不是與文檔相同。如果頁面向下滾動一點,則相對於視口的頂部將是比相對於文檔頂部更小的數字。 – MrVimes 2014-06-21 12:20:54
他相對於視口開始並添加scrollY以相對於文檔獲取它。 – 2017-03-20 17:40:59
我建議使用
element.getBoundingClientRect()
提議here 代替手工偏移計算的通過offsetLeft, offsetTop and offsetParent。如提議here 在某些情況下*手動遍歷會產生無效結果。請參閱此Plunker:http://plnkr.co/pC8Kgj
*當元素位於具有靜態(=默認)定位的可滾動父級中時。
您也可以通過將scrollLeft和scrollTop合併到其中來使偏移量計算工作。 – 2015-08-18 18:36:57
但是我發現'offsetLeft'和'offsetTop'沒有考慮CSS3變換,'getBoundingClientRect()'做。因此,結果可能無效。如果你需要它,你可以使用'(element.getBoundingClientRect()。left - parent.getBoundingClientRect()。left)'獲得一個元素相對於父元素的偏移量(比如'offsetLeft')。 – 2015-08-18 20:19:02
你可以得到頂部和離開不必通過DOM是這樣的:
function getCoords(elem) { // crossbrowser version
var box = elem.getBoundingClientRect();
var body = document.body;
var docEl = document.documentElement;
var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
var clientTop = docEl.clientTop || body.clientTop || 0;
var clientLeft = docEl.clientLeft || body.clientLeft || 0;
var top = box.top + scrollTop - clientTop;
var left = box.left + scrollLeft - clientLeft;
return { top: Math.round(top), left: Math.round(left) };
}
這個答案沒有考慮父母的偏移量。它只是相對於視口 – Nickey 2016-09-16 12:09:07
@Nickey不正確 - 視口位置加上滾動偏移量檢查,會產生相對於整個文檔的座標。 – natchiketa 2016-12-21 13:00:17
可以在移動設備上的越野車http://stackoverflow.com/a/32623832/962634需要調查 – basil 2017-01-28 06:30:33
如果您使用NPM,document-offset有趣的是,它似乎能夠充分利用這裏的其他答案的方法。用法很簡單:
var offset = require('document-offset')
var target = document.getElementById('target')
console.log(offset(target))
// => {top: 69, left: 108}
如果你不介意使用jQuery,那麼你可以使用offset()
函數。如果您想了解更多關於此功能的信息,請參閱documentation。
測試在IE 11,鉻62,火狐56,邊緣38:
var box = domElement.getBoundingClientRect();
var offsetTop = Math.floor(box.top && box.top || box.y && box.y || 0);
使用放置offsetLeft/X。
- 1. 通過相對數組元素位置查找文檔
- 2. 找到元素相對於視口或文檔的整數像素位置:getBoundingClientRect?
- 3. 相對於文檔而不是元素的CSS背景位置?
- 4. 查找相對於svg元素的鼠標指針位置
- 5. jQuery查找元素相對於容器的位置
- 6. 獲取元素相對於其父元素的相對位置
- 7. 相對於頁面的位置元素
- 8. 位置相對不適用於元素
- 9. 在絕對位置查找元素
- 10. 滾動時獲取元素相對於文檔的動態位置
- 11. 鎖定元素相對於另一個元素的位置
- 12. 如何訪問元素相對於其父元素的位置
- 13. 獲取元素相對於第n個父元素的位置
- 14. 使用相對於位置元素的邊距或位置
- 15. 相對於元素和窗口的相對位置
- 16. 相對於文本輸入的元素位置
- 17. 在CSS位置,是絕對內相對,對文檔或父元素絕對?
- 18. CSS過渡位於具有相對位置或絕對位置的元素下
- 19. 相對定位元素內絕對位置元素頁面
- 20. 找到一個元素相對於最新的相對位置父親的位置與javascript
- 21. 定位iframe元素相對於對象
- 22. 相對於另一個元素而不是其父元素的位置元素
- 23. 整個文檔中的元素位置
- 24. 設置相對於元素邊緣的背景漸變位置?
- 25. Div相對於靜態元素的絕對位置
- 26. 如何使用相對於父元素的絕對位置
- 27. 查找基於相鄰值的元素
- 28. 相對於文檔的CSS位置對象
- 29. 的jQuery查找元素的位置
- 30. 查找距離位置最近的html元素(相對或絕對)
不,當任何父母(特別是HTML元素!!!)有邊距,填充或邊框時。 – 2014-11-20 15:10:40
關於保證金的東西......它可能有助於設置框的大小爲邊框......或沿着這些線......什麼都不能修復...... – 2017-10-20 08:55:45