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

转载自 奇舞周刊 何文力

@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实现)

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

  • 上面的数据是通过阅读 Blink 源码所得,对于 Chrome, Opera 以及大多数安卓浏览器来说是可用的
    Tony Gentilcore's Layout Triggering List 的文章针对遇 2011 年的 WebKit 并且与上述数据基本一致

  • 现代 WebKit 中出现强制布局的情况是基本上一致的 updateLayoutIgnorePendingStylesheets - GitHub search - WebKit/WebKit

  • Gecko 内核的回流请求通过 FrameNeedsReflow 进行 FrameNeedsReflow - mozilla-central search

  • 对于 Edge / IE 没有很好的数据支持,但是基本上都是应该一致的,因为这些返回值内容都已经由标准所限制。对于最终结果,可能由于优化方法不同而不同。

Chromium 源码

  • 强制布局(以及样式的重新计算)UpdateStyleAndLayoutIgnorePendingStylesheets - Chromium Code Search
  • 强制样式重新计算UpdateStyleAndLayoutTreeIgnorePendingStylesheets - Chromium Code Search

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

转载于:https://www.cnblogs.com/tiffanybear/p/11231872.html

触发浏览器回流的属性方法一览表相关推荐

  1. form的submit()方法不能触发onsubmit事件的解决方法,兼容各版本浏览器。

    form的submit()方法不能触发onsubmit事件的解决方法,兼容各版本浏览器. 参考文章: (1)form的submit()方法不能触发onsubmit事件的解决方法,兼容各版本浏览器. ( ...

  2. 【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )

    文章目录 一. 代码生成控件 1. 创建设置项目 ( 1 ) 创建项目 ( ① 选择 Create a new Xcode project | ② 创建 Single View Application ...

  3. html 自动 浏览器窗口,一种html文件实现显示浏览器窗口内容的方法

    一种html文件实现显示浏览器窗口内容的方法 [技术领域] [0001]本发明涉及html领域,特别涉及一种html文件实现显示浏览器窗口内容的方法. [背景技术] [0002]-般的浏览器窗口显示需 ...

  4. ES6语法~解构赋值、箭头函数、class类继承及属性方法、map、set、symbol、rest、new.target、 Object.entries......

    2015年6月17日 ECMAScript 6发布正式版本 前面介绍基本语法,  后面为class用法及属性方法.set.symbol.rest等语法. 一.基本语法:  1.         定义变 ...

  5. 分针网——Javascript不同浏览器差异及兼容方法

    Javascript不同浏览器差异及兼容方法 javascript的各种兼容就是为了解决不同浏览器的差异性,了解其中的差异能够帮助你更快的解决问题,提高代码的使用质量,编写更优秀的javascript ...

  6. 【Android 应用开发】Android UI 设计之 TextView EditText 组件属性方法最详细解析

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...

  7. Python- 反射 及部份内置属性方法

    @property 类的静态属性,封装内部具体实现细节,调用的时候类似调用数据属性.既可以访问类属性,也可以访问实例属性 ![](https://s1.51cto.com/images/blog/20 ...

  8. asp.net如何在用户关闭浏览器时执行Session_End方法

      查看文章     asp.net如何在用户关闭浏览器时执行Session_End方法 2009-12-02 16:35 1.建两个页面king.aspx,leave.aspx,和一个Global. ...

  9. iOS对UIViewController生命周期和属性方法的解析

    iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有 ...

最新文章

  1. GPU 机器学习开箱即用
  2. 机器学习(七)——规则化和模型选择
  3. C++数组与指针概念
  4. 面试时如何介绍自己的项目经验
  5. activemq主从配置_使用ActiveMQ –具有故障转移协议的“主/从”配置
  6. (43)Xilinx RAM IP核配置(四)(第9天)
  7. leetcode----------Excel Sheet Column Number
  8. 恒丰银行助手提示注册表异常但修复不了的解决方法
  9. React骚操作——jsx遇到template-directive
  10. python笔记(求100偶数的和)
  11. 管理感悟:忙的真正含义是没心思
  12. 微信公众账号开发入门准备
  13. java自定义表单系统_java自定义表单
  14. matlab多元二次分析,Matlab篇----常用的回归分析Matlab命令(regress篇)
  15. 折腾修改SQLCipher静态库的符号表
  16. 红黑树时间复杂度为什么是O(logn)?
  17. 5.里氏代换原则依赖倒置原则
  18. IT企业职业道德的反思
  19. [LeetCode] 871. Minimum Number of Refueling Stops @ python
  20. 关于多项目的资源管理方法[范文学习]

热门文章

  1. vue 传base64到后台后台传到oss的java实现
  2. 每日一思(2022.5.6)——非理性行为
  3. 拆除联想一体机M7131z无线网卡
  4. 北京工作居住证续签收紧_收紧网站的安全带:HTTP安全标题
  5. 【Mac 教程系列第 7 篇】最小化时程序统一在程序坞右侧缩小,很占地方怎么办?
  6. amd6800h安装ubuntu22.04 笔记本休眠花屏解决办法
  7. ThreeJS逐步实现室内概念图的效果(渲染,交互)
  8. 千万不要用Lightly去写代码!!!!踩大坑!!!!数据全没!!一个月都恢复不了!!!!
  9. 10 个 VSCode 超级摸鱼神器,确定不试一下?
  10. Cris 小哥哥的大数据项目之 HBase 模拟微博核心功能