【问题标题】:Can accessing layout information also cause browser reflows?访问布局信息也会导致浏览器重排吗?
【发布时间】:2012-09-07 11:42:28
【问题描述】:

我知道设置样式属性会导致浏览器重排。访问布局属性时是否也可能发生浏览器重排。如果是,请举一个具体的例子,为什么会导致浏览器重排?

【问题讨论】:

标签: javascript browser cross-browser reflow


【解决方案1】:

我知道这对游戏来说已经很晚了,如果你阅读其他人已经发布的链接,它会以一种你可以找到的方式回答,但它应该在这里明确说明:

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

再说一次,这并不是 100% 正确的,但我发现如果你这样想,它会在 98% 的时候帮助它正确的,并且不会对其他 2% 的人来说,伤害不如对 98 人的帮助那么大。

【讨论】:

    【解决方案2】:

    如果您不更改 CSS 属性,仅访问它,则不需要,页面将不需要重新呈现。

    【讨论】:

    • 有很多非css属性会导致回流,甚至有一些css属性不会。
    • 好吧,我的意思是不要像只获取值那样更改属性。我知道设置属性通常会导致回流。
    • 哦,当然,获取 css 样式永远不会导致回流。但是获得计算样式可以做到。
    • 即使您没有更改任何值?
    • 至少在现代浏览器中——它们有一个回流队列,而不是每次更改时都处理整个算法——并且在获得计算的布局值之前,它们需要刷新该队列。
    【解决方案3】:

    当然这取决于实现,但通常浏览器会在读取元素的属性时触发重排,如果它认为需要重新查询布局数据(即一些与布局相关的属性)元素或任何父元素已更改)。

    您可以在此处找到 WebKit 的受影响属性列表:How (not) to trigger a layout in WebKit。 带有示例的更一般的文章:Rendering: repaint, reflow/relayout, restyle

    【讨论】:

      【解决方案4】:

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

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

      此外,现代浏览器(例如 chrome)延迟更新 GUI,除非查看指定的页面。由于浏览器确保它正确显示页面,当页面再次变为活动状态时,这会导致重排。这种延迟/队列可以使获取属性看起来好像它们正在导致重排,而实际上是浏览器确保它正确显示

      【讨论】:

      • 您能解释一下为什么事件监听器会导致回流吗?我简直不敢相信。
      • 依赖于浏览器,当附加事件监听器时,浏览器从最外层元素向内移动到有问题的元素(EIQ)。这样做时,浏览器需要检查定位、宽度等是否正确显示,以便悬停、单击、选择等事件按预期触发。我无法真正解释原因,但一个例子是点击带有圆角的 EIQ。如果通常单击角(已被四舍五入)的位置,则不应触发该事件。
      猜你喜欢
      • 2011-07-25
      • 2012-01-15
      • 2021-02-13
      • 1970-01-01
      • 2012-01-30
      • 2021-09-19
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多