获取元素相对于父容器的位置/偏移量?

mat*_*att 111 javascript position offset zepto

我习惯使用jQuery.在我目前的项目中,我使用zepto.js.Zepto没有position()像jQuery那样提供方法.Zepto只附带offset().

知道如何使用纯js或Zepto检索容器相对于父级的偏移量吗?

jac*_*ers 184

element.offsetLeft并且element.offsetTop是用于查找元素相对于其位置的纯javascript属性offsetParent; 是最近的父元素,其位置为relativeabsolute

或者,您始终可以使用Zepto来获取元素及其父元素的位置,并简单地减去这两个元素:

var childPos = obj.offset();
var parentPos = obj.parent().offset();
var childOffset = {
    top: childPos.top - parentPos.top,
    left: childPos.left - parentPos.left
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,即使未定位父项,也可以为子项提供相对于其父项的偏移量.

  • @vsync jQuery不是任何东西的王者,因为ie9在2016年1月达到了EOL,我们在所有主流浏览器中都有标准化的DOM选择,学习纯粹的js.关于使用什么框架的意见在SO上也没有意义,因为它在很大程度上取决于项目和目标平台. (9认同)
  • 元素定位的`static`不是父母的偏移. (8认同)
  • 不要在大括号内使用分号,请使用逗号 (4认同)

fca*_*ran 54

在纯js中只是使用offsetLeftoffsetTop属性.
示例小提琴:http://jsfiddle.net/WKZ8P/

var elm = document.querySelector('span');
console.log(elm.offsetLeft, elm.offsetTop);
Run Code Online (Sandbox Code Playgroud)
p   { position:relative; left:10px; top:85px; border:1px solid blue; }
span{ position:relative; left:30px; top:35px; border:1px solid red; }
Run Code Online (Sandbox Code Playgroud)
<p>
    <span>paragraph</span>
</p>
Run Code Online (Sandbox Code Playgroud)

  • `p.offsetTop + p.parentNode.offsetTop`你可以在几年前将它包装在一个递归函数调用中[像PPK提议](http://www.quirksmode.org/js/findpos.html).您可以将函数更改为传递级别数或者使用选择器来模仿`$(selector).parents(parentSelector)`.我更喜欢这种解决方案,因为zepto实现仅适用于支持`getBoundingClientsRect`的浏览器 - 某些移动设备不支持. (2认同)

小智 5

我是在Internet Explorer中这样做的。

function getWindowRelativeOffset(parentWindow, elem) {
    var offset = {
        left : 0,
        top : 0
    };
    // relative to the target field's document
    offset.left = elem.getBoundingClientRect().left;
    offset.top = elem.getBoundingClientRect().top;
    // now we will calculate according to the current document, this current
    // document might be same as the document of target field or it may be
    // parent of the document of the target field
    var childWindow = elem.document.frames.window;
    while (childWindow != parentWindow) {
        offset.left = offset.left + childWindow.frameElement.getBoundingClientRect().left;
        offset.top = offset.top + childWindow.frameElement.getBoundingClientRect().top;
        childWindow = childWindow.parent;
    }

    return offset;
};
Run Code Online (Sandbox Code Playgroud)

===================你可以这样称呼它

getWindowRelativeOffset(top, inputElement);
Run Code Online (Sandbox Code Playgroud)

我只关注IE,但是其他浏览器也可以做类似的事情。


Irs*_*han 5

我得到了另一个解决方案。从子属性值中减去父属性值

$('child-div').offset().top - $('parent-div').offset().top;
Run Code Online (Sandbox Code Playgroud)

  • 问题中所要求的纯 JavaScript 如何实现? (9认同)