【问题标题】:offsetTop vs. jQuery.offset().topoffsetTop 与 jQuery.offset().top
【发布时间】:2011-10-10 06:54:48
【问题描述】:

我读到offsetLeftoffsetTop 不能在所有浏览器中正常工作。 jQuery.offset() 应该为此提供一个抽象,以提供正确的值 xbrowser。

我想要做的是获取元素被点击的位置相对于元素左上角的坐标。

问题是jQuery.offset().top 实际上在 FFX 3.6 中给了我一个十进制值(在 IE 和 Chrome 中,这两个值匹配)。

This fiddle 显示该问题。如果点击底部图片,jQuery.offset().top 返回 327.5,但 offsetTop 返回 328。

我想offset() 正在返回正确的值,我应该使用它,因为它可以跨浏览器工作。然而,人们显然不能点击像素的小数点。确定Math.round() jQuery 返回的偏移量的正确方法是否正确?我应该改用offsetTop,还是完全使用其他方法?

【问题讨论】:

    标签: javascript jquery offset


    【解决方案1】:

    这就是jQuery API Doc 所说的.offset()

    获取第一个元素的当前坐标,或者设置 匹配元素集合中每个元素的相对坐标 到文档

    这就是MDN Web API 所说的.offsetTop

    offsetTop 返回当前元素相对于 offsetParent 节点

    的顶部

    这是 jQuery v.1.11 .offset() 在获取坐标时的基本操作:

    var box = { top: 0, left: 0 };
    
    // BlackBerry 5, iOS 3 (original iPhone)
    if ( typeof elem.getBoundingClientRect !== strundefined ) {
      box = elem.getBoundingClientRect();
    }
    win = getWindow( doc );
    return {
      top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
      left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
    };
    
    • pageYOffset 直观地说页面滚动了多少
    • docElem.scrollTop 是 IE
    • docElem.clientTop 是元素(本例中的文档)上边框的宽度
    • elem.getBoundingClientRect() 获取相对于 document viewport 的坐标(参见 cmets)。它可能会返回小数值,因此这是您的错误的来源。页面缩放时也是may cause a bug in IE<8。为避免分数值,请尝试计算位置iteratively

    结论

    • 如果您想要相对于父节点的坐标,请使用element.offsetTop。如果您想考虑父滚动,请添加element.scrollTop。 (或者如果你是那个库的粉丝,可以使用 jQuery .position()
    • 如果您想要相对于 视口 的坐标,请使用 element.getBoundingClientRect().top。如果您想考虑文档滚动,请添加window.pageYOffset。如果文档没有边框(通常没有边框),则不需要减去文档的 clientTop,因此您具有相对于 文档 的位置
    • 如果不将元素边框视为元素的一部分,则减去 element.clientTop

    【讨论】:

    • Element.getBoundingClientRect() 给出相对于视口而非文档的位置
    • @Klaus:你能解释一下到底有什么区别吗?
    • @JanTuroň:不同之处在于它是相对于浏览器窗口的顶部而不是文档“真正的顶部”。这意味着,例如,如果您将其顶部滚动到窗口顶部,它将返回负值。
    【解决方案2】:

    我认为你说人们不能点击半像素是对的,所以就个人而言,我会使用圆形 jQuery 偏移量...

    【讨论】:

    • 使用 CSS 缩放时 jQuery 偏移有问题
    【解决方案3】:

    试试这个:parseInt(jQuery.offset().top, 10)

    【讨论】:

    • 我希望它背后有一个原因,所以我可以投票给你
    【解决方案4】:

    offset 可能是一个非整数,使用em 作为度量单位,相对于% 中的font-sizes

    我还推测,当zoom 不是100% 时,offset 可能不是整数,但这取决于浏览器如何处理缩放。

    【讨论】:

    【解决方案5】:

    您可以使用 parseInt(jQuery.offset().top) 在所有浏览器中始终使用整数(原始 - int)值。

    【讨论】:

    • parseInt() 是否舍入或截断它们?
    • 它只取数字的整数部分,并且在所有浏览器中都是相同的。
    • OP 声明在一个浏览器中它给出 327.5 而在另一个浏览器中给出 328。所以如果你只取整数部分(截断)OP 本身就是它的一个例子 不是 在所有浏览器中都相同。对于这个例子,至少它必须四舍五入才能给出相同的数字。
    猜你喜欢
    • 2020-02-22
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2020-04-22
    • 2011-09-02
    • 1970-01-01
    相关资源
    最近更新 更多