我知道设置样式属性会导致浏览器重排。访问布局属性时是否也可能发生浏览器重排。如果是,请举一个具体的例子,为什么会导致浏览器重排?
4 回答
当然,这取决于实现,但通常浏览器在读取元素属性时如果认为需要重新查询布局数据(即该元素上的某些与布局相关的属性或任何父元素发生更改),就会触发重排。
您可以在此处找到 WebKit 的受影响属性列表:How (not) to trigger a layout in WebKit。带有示例的更一般的文章:渲染:重绘,重排/重布局,重新样式
获取属性可能(见下文)但更改属性会。样式相关的属性ele.width
,例如实例。位置属性,例如src
iframe 或 img 标签,将。
另请注意,附加事件侦听器(on*=...
、、addEventListener(*,...)
等)会导致重排。这是由于事件捕获从最外面的父元素到 src 元素的方式,并通过父元素链从 src 元素冒泡。
此外,除非查看指定的页面,否则现代浏览器(例如 chrome)会延迟更新 GUI。由于浏览器确保它正确显示页面,当页面再次变为活动状态时,这会导致重排。这种延迟/队列可以使获取属性看起来好像它们正在导致重排,而实际上是浏览器确保它正确显示
如果您不更改 CSS 属性,仅访问它,那么不,页面将不需要重新呈现。
我知道这对游戏来说已经很晚了,如果您阅读其他人已经发布的链接,它会以一种您可以找到的方式回答,但值得在这里明确说明:
浏览器的任务是为您提供当前值,因此作为一般规则,它将重新排列和重新绘制,以确保您拥有的是当前值。我发现以这种方式思考它会有所帮助 - 任何时候您要求页面上任何元素的位置或大小,您都可以假设您将导致重排/重绘。不,它不是 100% 总是正确的,但它足够接近 100%,如果您要求顶部、左侧、底部、右侧、高度、宽度或任何影响这些测量值的东西(如比例、旋转),您应该假设等),您将导致 R/R。这是我能给你的最具体的答案。
再说一次,这并不是 100% 正确的,但我发现如果你这样想,它会在 98% 的时候帮助它是正确的,并且不会像其他 2% 那样受到伤害对98有帮助。