Javascript 性能:计算Div位置
我在jsperf上设置了测试用例: 现在很多结果看起来很直观,也很有意义,但有一件事让我很困扰,关于ScrollTop和OffsetTopJavascript 性能:计算Div位置,javascript,html,Javascript,Html,我在jsperf上设置了测试用例: 现在很多结果看起来很直观,也很有意义,但有一件事让我很困扰,关于ScrollTop和OffsetTop 如果它们都是DOM元素属性,为什么ScrollTop比OffsetTop快3-4倍?特别是因为根据msdn,OffsetTop也只是一个只读属性:我不能确定-您必须检查源代码才能确定。但offsetTop性能较差的明显原因是计算起来更复杂 要计算Element.scrollTop浏览器只需浏览您要求的元素-它可以从中获取所需的所有输入数据 但是要计算Elem
如果它们都是DOM元素属性,为什么ScrollTop比OffsetTop快3-4倍?特别是因为根据msdn,OffsetTop也只是一个只读属性:我不能确定-您必须检查源代码才能确定。但offsetTop性能较差的明显原因是计算起来更复杂 要计算Element.scrollTop浏览器只需浏览您要求的元素-它可以从中获取所需的所有输入数据 但是要计算Element.offsetTop,您需要计算元素的位置和其父元素的位置,然后比较它们以获得相对位置。因此,需要更多的时间来执行它 您可以找到Element.offsetTop如何根据规范工作的说明 如果元素是HTML主体元素或没有任何关联的CSS布局框,则返回零并终止此算法 如果元素的offsetParent为null,则返回与元素关联的第一个CSS布局框的上边框边缘相对于初始包含块原点的y坐标,忽略应用于元素及其祖先的任何变换,并终止此算法 返回将与元素的offsetParent关联的第一个CSS布局框的顶部填充边的y坐标从与元素关联的第一个CSS布局框的顶部边界边的y坐标减去相对于初始包含块原点的y坐标的结果,忽略应用于元素及其祖先的任何变换 所以,是的,即使它看起来像一个简单的属性,它仍然可以触发对元素的一些计算 更新: 看来我的答案仍然不正确,因为在同一规范中声明了此接口:
partial interface HTMLElement {
readonly attribute Element? offsetParent;
readonly attribute long offsetTop;
readonly attribute long offsetLeft;
readonly attribute long offsetWidth;
readonly attribute long offsetHeight;
};
所以,是的,这两个属性都是只读的,所以一个比另一个快3倍的事实没有多大意义。忽略我之前写的内容。它们的测量值不一样:可能是因为
。scrollTop
总是返回0
,但是。offsetTop
在测试中总是返回5000
。因此,访问值为0的变量可能更快?可能,这取决于实现。我的观点是,比较这两种方法是没有意义的。是的,但是offsetTop
看起来像是一个成员,而不是一个方法。它是.offsetTop
,而不是.offsetTop()
,这意味着在访问该方法时要进行更多的计算。