美文网首页让前端飞Web前端之路JavaScript 进阶营
触发浏览器回流的属性方法一览表

触发浏览器回流的属性方法一览表

作者: Tiffany_c4df | 来源:发表于2019-07-23 15:03 被阅读25次

【转】触发浏览器回流的属性方法一览表

转载自 奇舞周刊 何文力

@TiffanysBear

下列的所有属性、方法,在读取或执行的同时,将会导致浏览器同步地计算样式和布局。这种行为又叫做回流,也是常见的性能瓶颈。

元素类

元素测量

elem.offsetLeft, elem.offsetTop, elem.offsetWidth, elem.offsetHeight, elem.offsetParent
elem.clientLeft, elem.clientTop, elem.clientWidth, elem.clientHeight elem.getClientRects(), elem.getBoundingClientRect()

滚动相关

elem.scrollBy(), elem.scrollTo()
elem.scrollIntoView(), elem.scrollIntoViewIfNeeded()
elem.scrollWidth, elem.scrollHeight
elem.scrollLeft, elem.scrollTop 除了读取,设置也会触发

聚焦

elem.focus() 会触发两次强制布局

其他

elem.computedRole, elem.computedName
elem.innerText
getComputedStyle

window.getComputedStyle() 调用通常会导致样式的重新计算,并且,当满足下列条件时,会触发强制布局:

元素属于一颗影子树中
出现下列任意一个媒体查询时:
min-width, min-height, max-width, max-height, width, height
aspect-ratio, min-aspect-ratio, max-aspect-ratio
device-pixel-ratio, resolution, orientation , min-device-pixel-ratio, max-device-pixel-ratio

所获取的属性是下列之一时:

height, width
top, right, bottom, left
margin [-top, -right, -bottom, -left, 或简写形式] 仅在数值是定值时
padding [-top, -right, -bottom, -left, 或简写形式] 仅在数值是定值时
transform, transform-origin, perspective-origin
translate, rotate, scale
grid, grid-template, grid-template-columns, grid-template-rows
perspective-origin
window

window.scrollX, window.scrollY
window.innerHeight, window.innerWidth
window.getMatchedCSSRules() 仅会导致样式重新计算

表单:

inputElem.focus()
inputElem.select(), textareaElem.select()

鼠标事件:

mouseEvt.layerX, mouseEvt.layerY, mouseEvt.offsetX, mouseEvt.offsetY document

doc.scrollingElement 仅会导致样式重新计算

Range:

range.getClientRects(), range.getBoundingClientRect()

SVG

可以参见 Tony Gentilcore's 2011 Layout Triggering List

contenteditable

很多行为都会触发,包括复制粘贴图像进去

附录

在文档发生改变或布局、样式失效时会导致回流的消耗。通常,这是因为DOM发生了改变(类的修改,节点的增加、删除,甚至是添加一个伪类如 :focus);

如果需要强制布局,样式首先会被重新计算。所以强制布局会导致这两种操作的发生。它们所消耗的性能取决于当时的内容或者情况,但通常来说两者所消耗的性能都是相似的;
一些简单的解决办法:

  • 避免在 for 循环中强制布局以及更改DOM
  • 使用开发工具分析产生影响的代码
  • 批量读写DOM(使用FastDOM或者其他的虚拟DOM实现)

上述数据在各个浏览器中的表现:

Chromium 源码

CSS Triggers

CSS Triggers 提供了一个很好的资源,里面记载了关于设置或者改变一个CSS数值时,浏览器内需要做什么操作的信息。

更多关于强制布局的信息

  • Avoiding layout thrashing — Web Fundamentals
  • Fixing Layout thrashing in the real world | Matt Andrews
  • Timeline demo: Diagnosing forced synchronous layouts - Google Chrome
  • Preventing 'layout thrashing' | Wilson Page
  • wilsonpage/fastdom
  • Rendering: repaint, reflow/relayout, restyle / Stoyan
  • We spent a week making Trello boards load extremely fast. Here’s how we did it. - Fog Creek Blog
  • Minimizing browser reflow | PageSpeed Insights | Google Developers
  • Optimizing Web Content in UIWebViews and Websites on iOS
  • Accelerated Rendering in Chrome
  • web performance for the curious
  • Jank Free

相关文章

  • 触发浏览器回流的属性方法一览表

    【转】触发浏览器回流的属性方法一览表转载自 奇舞周刊 何文力@TiffanysBear 下列的所有属性、方法,在读...

  • 「DOM 编程」事件

    DOM 事件事件流事件注册注册事件取消事件触发事件浏览器兼容型兼容低版本代码实现事件对象属性和方法通用属性和方法阻...

  • web性能优化 - 重排与重绘

    重排与重绘 重排 [重构/回流/reflow]:当DOM变化影响了节点的几何属性,浏览器需要重新计算节点的几何属性...

  • 回流与重绘

    回流一定会触发重绘回流: DOM结构的增删改重绘: 颜色,背景, 字体等视觉上页面的改变 重绘不一定触发回流 如何...

  • vue 点击事件获取当前点击元素

    点击子元素,触发父元素方法。获取子元素属性

  • (一)OC语法02(KVO与KVC)

    1、KVO KVO的作用是监听对象的属性的改变。重点之一就是必须是触发了属性的setter方法才会触发KVO,只是...

  • 22,重绘、回流

    1,浏览器渲染机制 2,重绘 3,回流 > 重绘。 4,浏览器优化 5,减少重绘和回流

  • 回流和重绘

    回流 当 Render Tree中部分或全部元素的尺寸,结构,或某些属性发生改变时,浏览器重新渲染文档的过程称为回...

  • web自动化-selenium(二)

    浏览器常用属性和方法 属性 driver.name # 当前浏览器的名字 driver.title # 当前网页的...

  • 类的内建属性

    __getattribute__方法的使用: 使用这个方法可以在调用属性时触发,返回值即为属性值,使用父类的__g...

网友评论

    本文标题:触发浏览器回流的属性方法一览表

    本文链接:https://www.haomeiwen.com/subject/fdzolctx.html