2011-04-08 40 views
63

確定元素相對於文檔/正文/瀏覽器窗口的位置的最簡單方法是什麼?現在我使用的是'.offsetLeft/offsetTop',但是這種方法只會給你相對於父元素的位置,所以你需要確定身體元素的父母有多少,以知道與身體/瀏覽器相關的位置窗口/文件位置。這種方法也很麻煩。查找元素相對於文檔的位置

回答

48

您可以遍歷offsetParent直到DOM的頂層。

function getOffsetLeft(elem) 
{ 
    var offsetLeft = 0; 
    do { 
     if (!isNaN(elem.offsetLeft)) 
     { 
      offsetLeft += elem.offsetLeft; 
     } 
    } while(elem = elem.offsetParent); 
    return offsetLeft; 
} 
+20

不,當任何父母(特別是HTML元素!!!)有邊距,填充或邊框時。 – 2014-11-20 15:10:40

+0

關於保證金的東西......它可能有助於設置框的大小爲邊框......或沿着這些線......什麼都不能修復...... – 2017-10-20 08:55:45

29

您可以使用element.getBoundingClientRect()來獲取相對於視元素位置。

使用scrollYdocument.documentElement.scrollTop跨瀏覽器兼容)計算視口偏移量。

兩者的總和將給出相對於元件的位置到文檔:

subjectRect.top + document.documentElement.scrollTop 
+8

相對於視口是不是與文檔相同。如果頁面向下滾動一點,則相對於視口的頂部將是比相對於文檔頂部更小的數字。 – MrVimes 2014-06-21 12:20:54

+5

他相對於視口開始並添加scrollY以相對於文檔獲取它。 – 2017-03-20 17:40:59

1

我建議使用

element.getBoundingClientRect() 

提議here 代替手工偏移計算的通過offsetLeftoffsetTop and offsetParent。如提議here 在某些情況下*手動遍歷會產生無效結果。請參閱此Plunker:http://plnkr.co/pC8Kgj

*當元素位於具有靜態(=默認)定位的可滾動父級中時。

+0

您也可以通過將scrollLeft和scrollTop合併到其中來使偏移量計算工作。 – 2015-08-18 18:36:57

+0

但是我發現'offsetLeft'和'offsetTop'沒有考慮CSS3變換,'getBoundingClientRect()'做。因此,結果可能無效。如果你需要它,你可以使用'(element.getBoundingClientRect()。left - parent.getBoundingClientRect()。left)'獲得一個元素相對於父元素的偏移量(比如'offsetLeft')。 – 2015-08-18 20:19:02

119

你可以得到頂部離開不必通過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) }; 
} 
+2

這個答案沒有考慮父母的偏移量。它只是相對於視口 – Nickey 2016-09-16 12:09:07

+1

@Nickey不正確 - 視口位置加上滾動偏移量檢查,會產生相對於整個文檔的座標。 – natchiketa 2016-12-21 13:00:17

+1

可以在移動設備上的越野車http://stackoverflow.com/a/32623832/962634需要調查 – basil 2017-01-28 06:30:33

5

如果您使用NPM,document-offset有趣的是,它似乎能夠充分利用這裏的其他答案的方法。用法很簡單:

var offset = require('document-offset') 
var target = document.getElementById('target') 
console.log(offset(target)) 
// => {top: 69, left: 108} 
0

如果你不介意使用jQuery,那麼你可以使用offset()函數。如果您想了解更多關於此功能的信息,請參閱documentation

0

測試在IE 11,鉻62,火狐56,邊緣38:

var box = domElement.getBoundingClientRect(); 
var offsetTop = Math.floor(box.top && box.top || box.y && box.y || 0); 

使用放置offsetLeft/X。

相關問題