查找元素相对于文档的位置

ein*_*ein 100 javascript dom

确定相对于文档/正文/浏览器窗口的元素位置的最简单方法是什么?

现在我正在使用.offsetLeft/offsetTop,但是这个方法只给你相对于父元素的位置,所以你需要确定body元素的父元素数,以了解与body/browser窗口/文档位置相关的位置.

这种方法也很麻烦.

bas*_*sil 163

您可以在不遍历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) };
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案没有考虑到父母的抵消.它只相对于视口 (4认同)
  • @Nickey是不正确的-视口位置以及滚动偏移量检查会产生相对于整个文档的坐标。 (2认同)

dy_*_*dy_ 74

您可以使用element.getBoundingClientRect()相对于视口检索元素位置.

然后用于document.documentElement.scrollTop计算视口偏移量.

两者之和将给出相对于文档的元素位置:

element.getBoundingClientRect().top + document.documentElement.scrollTop
Run Code Online (Sandbox Code Playgroud)

  • 他相对于视口开始并添加scrollY以使其相对于文档. (12认同)
  • 相对于视口与文档相对不相同.如果页面向下滚动一点,则相对于视口的顶部将比相对于文档的顶部的数字小. (9认同)
  • @JoaquinCuencaAbela - 你是*他*和你在说什么`scrollY` (6认同)
  • `document.documentElement.scrollTop` 在 Safari 中不起作用,请改用 `window.scrollY` (2认同)

Kea*_*her 60

您可以遍历offsetParentDOM的顶级.

function getOffsetLeft( elem )
{
    var offsetLeft = 0;
    do {
      if ( !isNaN( elem.offsetLeft ) )
      {
          offsetLeft += elem.offsetLeft;
      }
    } while( elem = elem.offsetParent );
    return offsetLeft;
}
Run Code Online (Sandbox Code Playgroud)

  • 不,它没有,当任何父(特别是html元素!!!)有边距,填充或边框. (26认同)
  • 为什么这是公认的答案?这已经过时且表现不佳.帮自己一个忙,并使用其他答案中建议的getBoundingClientRect(). (4认同)

Rob*_*art 9

我发现以下方法在处理触发 offsetTop/offsetLeft 的边缘情况时是最可靠的。

function getPosition(element) {
    var clientRect = element.getBoundingClientRect();
    return {left: clientRect.left + document.body.scrollLeft,
            top: clientRect.top + document.body.scrollTop};
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*lin 6

document-offset(第三方脚本)很有趣,似乎从这里的其他答案中采用了方法.

例:

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


Rap*_*nah 6

对于那些想要获取元素相对于文档的各个位置的 x 和 y 坐标的人。

const getCoords = (element, position) => {
  const { top, left, width, height } = element.getBoundingClientRect();
  let point;
  switch (position) {
    case "top left":
      point = {
        x: left + window.pageXOffset,
        y: top + window.pageYOffset
      };
      break;
    case "top center":
      point = {
        x: left + width / 2 + window.pageXOffset,
        y: top + window.pageYOffset
      };
      break;
    case "top right":
      point = {
        x: left + width + window.pageXOffset,
        y: top + window.pageYOffset
      };
      break;
    case "center left":
      point = {
        x: left + window.pageXOffset,
        y: top + height / 2 + window.pageYOffset
      };
      break;
    case "center":
      point = {
        x: left + width / 2 + window.pageXOffset,
        y: top + height / 2 + window.pageYOffset
      };
      break;
    case "center right":
      point = {
        x: left + width + window.pageXOffset,
        y: top + height / 2 + window.pageYOffset
      };
      break;
    case "bottom left":
      point = {
        x: left + window.pageXOffset,
        y: top + height + window.pageYOffset
      };
      break;
    case "bottom center":
      point = {
        x: left + width / 2 + window.pageXOffset,
        y: top + height + window.pageYOffset
      };
      break;
    case "bottom right":
      point = {
        x: left + width + window.pageXOffset,
        y: top + height + window.pageYOffset
      };
      break;
  }
  return point;
};
Run Code Online (Sandbox Code Playgroud)

用法

  • getCoords(document.querySelector('selector'), 'center')

  • getCoords(document.querySelector('selector'), 'bottom right')

  • getCoords(document.querySelector('selector'), 'top center')


小智 5

我建议使用

element.getBoundingClientRect()
Run Code Online (Sandbox Code Playgroud)

如此处建议的那样 而不是通过offsetLeftoffsetTopoffsetParent进行手动偏移计算。如提出这里 在某些情况下*手动遍历产生无效的结果。看到这个柱塞:http ://plnkr.co/pC8Kgj

*当元素位于具有静态(=默认)位置的可滚动父级内部时。