Javascript 访问布局信息是否也会导致浏览器回流?

Javascript 访问布局信息是否也会导致浏览器回流?,javascript,browser,cross-browser,reflow,Javascript,Browser,Cross Browser,Reflow,我知道设置样式属性会导致浏览器回流。访问布局属性时是否也可能发生浏览器回流。如果是,请给出一个具体示例,说明为什么会导致浏览器回流?获取属性可能会(见下文),但更改属性会。实例的样式相关属性,如ele.width。iframe或img标记的位置属性,如src,将被删除 另请注意,附加事件侦听器(*=…上的,附加事件侦听器(*,…)等)会导致回流。这是由于事件捕获方式从最外层的父元素到src元素,并通过父元素链从src元素冒泡出来 此外,现代浏览器(例如chrome)会延迟更新GUI,除非查看指定

我知道设置样式属性会导致浏览器回流。访问布局属性时是否也可能发生浏览器回流。如果是,请给出一个具体示例,说明为什么会导致浏览器回流?

获取属性可能会(见下文),但更改属性会。实例的样式相关属性,如
ele.width
。iframe或img标记的位置属性,如
src
,将被删除

另请注意,附加事件侦听器(*=…上的
附加事件侦听器(*,…)
等)会导致回流。这是由于事件捕获方式从最外层的父元素到src元素,并通过父元素链从src元素冒泡出来


此外,现代浏览器(例如chrome)会延迟更新GUI,除非查看指定的页面。当页面再次激活时,由于浏览器确保页面正确显示,这会导致回流。此延迟/队列会使获取属性看起来像是导致了回流,实际上,浏览器会确保它正确显示。如果您不更改CSS属性,只访问它,则不需要重新提交页面。

当然这取决于实现,但通常情况下,如果浏览器认为需要重新查询布局数据(即,此元素或任何父元素上的某些布局相关属性已更改),则在读取元素的属性时会触发回流

您可以在此处找到WebKit受影响属性的列表:。
一篇更具一般性的文章,附有示例:

我知道这已经晚了,如果您阅读了其他人已经发布的链接,您可以找到它的答案,但值得在此明确说明:

浏览器的任务是为您提供当前值,因此作为一般规则,它将回流并重新绘制,以确保您现在拥有的是当前值。我发现这样想很有帮助——每当你要求页面上任何元素的位置或大小时,你都可以假设你将导致回流/重新绘制。不,这并不是100%都是正确的,但它已经接近100%,如果你要求的是顶部、左侧、底部、右侧、高度、宽度或任何影响这些测量值的东西(如比例、旋转等),你将导致R/R。这是我能给你的最具体的答案


再说一次,这并非总是100%正确的,但我发现如果你这样想的话,它在98%的情况下是正确的,并且对其他2%的人不会像对98%的人那样有多大的伤害。

这是个轶事,但我在仅仅尝试在开发工具中检查一个元素时看到了Chrome回流元素。即使所检查的元件与回流的元件不太接近/不相关。可能重复或“布局属性”的确切含义是什么?@Bergi布局属性如OK中所示。不,获取css样式的属性(不是它们的计算值)不会导致回流。您能解释一下事件侦听器为什么会导致回流吗?我真的不敢相信。依赖于浏览器,当连接事件侦听器时,浏览器会从最外面的元素向内移动到相关元素(EIQ)。在执行此操作时,浏览器需要检查位置、宽度等是否正确显示,以便悬停、单击、选择等事件按预期触发。我真的无法解释原因,但一个例子是点击EIQ/圆角。如果在正常情况下单击角点(已舍入)的位置,则不会触发事件。有许多非css属性会导致回流,甚至有一些css属性不会。嗯,我的意思是不更改属性,因为只获取值。我知道设置属性通常会导致回流。哦,当然,获取css样式永远不会导致回流。但是获取计算的样式就可以了。即使你不改变任何值?在现代浏览器中,至少-他们有一个回流队列,而不是每次改变某个内容时处理整个算法-在获取计算的布局值之前,他们需要刷新该队列。