如何从元素的顶部获得距离?

Sam*_*bhi 52 javascript

我想知道如何使用JavaScript从页面顶部获取元素的距离而不是父元素.
在此输入图像描述

http://jsfiddle.net/yZGSt/1/

Sha*_*ery 81

offsetTop仅查看元素的父级.只需循环访问父节点,直到父节用完为止并添加其偏移量.

function getPosition(element) {
    var xPosition = 0;
    var yPosition = 0;

    while(element) {
        xPosition += (element.offsetLeft - element.scrollLeft + element.clientLeft);
        yPosition += (element.offsetTop - element.scrollTop + element.clientTop);
        element = element.offsetParent;
    }

    return { x: xPosition, y: yPosition };
}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,元素将是:`var element = document.querySelectorAll('.wrapper')[0];` (2认同)
  • 为了进一步补充这一点,此实现在 Safari 中与 Chrome 中的功能不同 - 因此我认为不应该接受它。这是一个演示(在两个浏览器上滚动):https://codepen.io/anon/pen/LaKEPK。这个实现 /sf/answers/3734615391/ 有效。 (2认同)

eeg*_*azs 12

var elDistanceToTop = window.pageYOffset + el.getBoundingClientRect().top
Run Code Online (Sandbox Code Playgroud)

以我的经验document.body.scrollTop,并不总是返回当前滚动位置(例如,如果滚动实际上发生在其他元素上)。

  • 与最上面的答案不同,这确实适用于 iOS Safari。不要像我一样花 2 个小时进行调试:) (5认同)

Fan*_*nky 11

这个单线看起来效果不错

document.getElementById("el").getBoundingClientRect().top +  window.scrollY
Run Code Online (Sandbox Code Playgroud)

你的小提琴更新了


www*_*139 10

这里有一些有趣的代码:)

window.addEventListener('load', function() {
  //get the element
  var elem = document.getElementById('test');
  //get the distance scrolled on body (by default can be changed)
  var distanceScrolled = document.body.scrollTop;
  //create viewport offset object
  var elemRect = elem.getBoundingClientRect();
  //get the offset from the element to the viewport
  var elemViewportOffset = elemRect.top;
  //add them together
  var totalOffset = distanceScrolled + elemViewportOffset;
  //log it, (look at the top of this example snippet)
  document.getElementById('log').innerHTML = totalOffset;
});
Run Code Online (Sandbox Code Playgroud)
#test {
  width: 100px;
  height: 100px;
  background: red;
  margin-top: 100vh;
}
#log {
  position: fixed;
  top: 0;
  left: 0;
  display: table;
  background: #333;
  color: #fff;
}
html,
body {
  height: 2000px;
  height: 200vh;
}
Run Code Online (Sandbox Code Playgroud)
<div id="log"></div>
<div id="test"></div>
Run Code Online (Sandbox Code Playgroud)


sac*_*een 6

使用 offsetTop

document.getElementById("foo").offsetTop
Run Code Online (Sandbox Code Playgroud)

演示

  • 这将返回offsetParent的距离.他们是从页面顶部获取它的方法吗? (11认同)
  • @sachleen,http://jsfiddle.net/HxDEt/1/表明,如果任何容器元素具有相对,绝对或固定位置(并且自身具有offsetTop),则您的答案是不正确的. (7认同)

Tha*_*ija 6

offsetTop 不会获取到页面顶部的距离,而是到具有指定位置的最近父元素的顶部。

您可以使用一种简单的技术,将您感兴趣的元素的所有父元素的 offsetTop 相加以获得距离。

// Our element
var elem = document.querySelector('#some-element');

// Set our distance placeholder
var distance = 0;

// Loop up the dom
do {
    // Increase our distance counter
    distance += elem.offsetTop;

    // Set the element to it's parent
    elem = elem.offsetParent;

} while (elem);
distance = distance < 0 ? 0 : distance;
Run Code Online (Sandbox Code Playgroud)

原始代码来自https://gomakethings.com/how-to-get-an-elements-distance-from-the-top-of-the-page-with-vanilla-javascript/

  • 谷歌如何做某事并发现一个链接回你写的文章的 StackOverflow 答案是超现实的。大声笑,谢谢! (13认同)

小智 5

var distanceTop = element.getBoundingClientRect().top;
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请访问链接:

https://developer.mozilla.org/zh-CN/docs/Web/API/Element/getBoundingClientRect

  • 这不会给出从顶部的实际高度。它返回窗口当前滚动状态从顶部的高度。 (7认同)