重绘回流过程

简介: 浏览器渲染流程:解析HTML生成DOM树,CSS生成CSSOM,合并为渲染树,再布局、绘制。DOM树包含所有元素,渲染树仅含可见节点。CSS阻塞渲染但不阻塞DOM解析。重绘因样式变化,回流因布局变化,回流必触发重绘。减少回流重绘可提升性能。
  1. 浏览器的渲染过程,DOM 树和渲染树的区别?

  2. HTML 经过解析生成 DOM树; CSS经过解析生成 Style Rules。 二者一结合生成了Render Tree。

  3. 通过layout计算出DOM要显示的宽高、位置、颜色。
  4. 最后渲染在界面上,用户就看到了
  5. 浏览器的渲染过程
  6. 解析 HTML 构建 DOM(DOM 树),并行请求 css/image/js
  7. CSS 文件下载完成,开始构建 CSSOM(CSS 树)
  8. CSSOM 构建结束后,和 DOM 一起生成 Render Tree(渲染树)
  9. 布局(Layout):计算出每个节点在屏幕中的位置
  10. 显示(Painting):通过显卡把页面画到屏幕上
  11. DOM 树 和 渲染树 的区别?
  12. DOM 树与 HTML 标签一一对应,包括 head 和隐藏元素
  13. 渲染树不包括 head 和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的 css 属性
  14. CSS会阻塞DOM解析吗?
  15. 对于一个HTML文档来说,不管是内联还是外链的css,都会阻碍后续的dom渲染,但是不会阻碍后续dom的解析。
  16. 当css文件放在
中时,虽然css解析也会阻塞后续dom的渲染,但是在解析css的同时也在解析dom,所以等到css解析完毕就会逐步的渲染页面了。
  • 重绘和回流(重排)的区别和关系?
  • 重绘:当渲染树中的元素外观(如:颜色)发生改变,不影响布局时,产生重绘
  • 回流:当渲染树中的元素的布局(如:尺寸、位置、隐藏/状态状态)发生改变时,产生重绘回流
  • 注意:JS 获取 Layout 属性值(如:offsetLeft、scrollTop、getComputedStyle 等)也会引起回流。因为浏览器需要通过回流计算最新值
  • 回流必将引起重绘,而重绘不一定会引起回流
    5.1 触发reflow
  • width/height/border/margin/padding的修改,如width=778px;
  • 动画,:hover等伪类引起的元素表现改动,display=none等造成页面回流;
  • appendChild等DOM元素操作;
  • font类style的修改;
  • background的修改,注意着字面上可能以为是重绘,但是浏览器确实回流了,经过浏览器厂家的优化,部分background的修改只触发repaint,当然IE不用考虑;
  • scroll页面,这个不可避免;
  • resize页面,桌面版本的进行浏览器大小的缩放,移动端的话,还没玩过能拖动程序,resize程序窗口大小的多窗口操作系统。
  • 读取元素的属性(这个无法理解,但是技术达人是这么说的,那就把它当做定理吧):读取元素的某些属性(offsetLeft、offsetTop、offsetHeight、offsetWidth、scrollTop/Left/Width/Height、clientTop/Left/Width/Height、getComputedStyle()、currentStyle(in IE));
    5.2 触发repaint
  • color的修改,如color=#ddd;
  • text-align的修改,如text-align=center;
  • a:hover也会造成重绘。
  • :hover引起的颜色等不导致页面回流的style变动。
  • 如何最小化重绘(repaint)和回流(reflow)?
    6.1 性能问题
    以下操作会导致性能问题:
  • 改变 window 大小
  • 改变字体
  • 添加或删除样式
  • 文字改变
  • 定位或者浮动
  • 盒模型
    3.2 解决方法
  • 需要要对DOM元素进行复杂的操作时,可以先隐藏(display:"none"),操作完成后再显示
  • 需要创建多个 DOM 节点时,使用 DocumentFragment 创建完后一次性的加入 document,或使用字符串拼接方式构建好对应HTML后再使用innerHTML来修改页面
  • 缓存 Layout 属性值,如:var left = elem.offsetLeft; 这样,多次使用 left 只产生一次回流
  • 避免用 table 布局(table 元素一旦触发回流就会导致 table 里所有的其它元素回流)
  • 避免使用 css 表达式(expression),因为每次调用都会重新计算值(包括加载页面)
  • 尽量使用 css 属性简写,如:用 border 代替 border-width, border-style, border-color
  • 批量修改元素样式:elem.className 和 elem.style.cssText 代替 elem.style.xxx
  • 相关文章
    |
    5月前
    |
    JavaScript 前端开发 测试技术
    Angular框架
    本文深入解析Angular核心概念,涵盖ng-show与ng-if的性能差异、$rootScope与$scope的关系、表达式机制、Digest周期、定时器与监听器的取消方法。同时探讨Directive的restrict属性、作用域绑定方式及模块间通信策略。此外,介绍性能优化技巧、单元测试实践、Angular 2生命周期钩子、路由机制、事件发射器、AOT编译、安全防护与Shadow DOM等高级主题,全面提升开发技能。
    |
    1月前
    |
    传感器 人工智能 运维
    BIM与数字孪生融合架构:智慧楼宇运维系统技术解析
    本文以浦东世博滨江智慧楼宇改造为范例,阐述BIM与数字孪生融合架构在建筑运维数字化转型中的工程实践:通过867个传感器构建感知层,28万智能组件打造动态数字孪生体,零代码平台赋能非技术人员快速配置,AI引擎实现92%故障预测准确率,支撑能源优化、智能照明、安防预警等场景落地,推动楼宇向可感知、会思考、自进化的智慧生命体演进。(239字)
    |
    4月前
    |
    API Android开发 iOS开发
    PicGo:为高效创作者而生的终极图片上传工具
    PicGo是一款跨平台开源图片上传工具,能大幅简化创作中的图片处理流程。它支持拖拽、粘贴、快捷键等多种上传方式,自动生成Markdown/HTML链接,兼容主流图床和插件。开发者友好,提供API和命令行支持,可与VS Code、Obsidian等编辑器无缝集成。通过一键上传和智能链接处理,PicGo让图片管理变得无感高效,适合技术博主、文档工程师等创作者使用。
    1002 17
    PicGo:为高效创作者而生的终极图片上传工具
    |
    3月前
    |
    Web App开发 网络协议 应用服务中间件
    阿里云免费SSL证书申请指南:从申请、下载到部署安装全流程,2026年最新教程
    阿里云免费SSL证书申请指南(2026最新):三步完成申请、验证与部署。支持自动DNS验证,证书90天有效期,适用于Nginx/Apache等主流服务器。需实名认证并开放443端口。官方入口直达,图文详解,零基础可操作。
    |
    5月前
    |
    缓存 前端开发 JavaScript
    雅虎14条Web性能优化规则
    雅虎军规总结了23条前端性能优化最佳实践,涵盖减少HTTP请求、使用CDN、资源压缩、缓存配置、JS/CSS优化、图片处理等方面,旨在提升网页加载速度与用户体验,是前端性能优化的经典指南。
    |
    5月前
    |
    缓存
    浏览器缓存
    HTTP缓存通过Cache-Control和ETag实现。Cache-Control控制缓存行为,如public/private、no-cache/no-store,以及max-age等时效与验证机制;ETag则用于对比资源是否变更,配合If-None-Match实现304协商缓存。结合内容哈希文件名可优化静态资源更新策略,确保用户获取最新版本。
    |
    5月前
    |
    JavaScript
    虚拟滚动技术
    插入几万个DOM时,为避免页面卡顿,可采用虚拟滚动技术,仅渲染可视区域内的元素,滚动时动态更新内容,大幅减少DOM数量。相比requestAnimationFrame分批插入,虚拟滚动性能更优,推荐使用react-virtualized等库实现,有效提升渲染效率。(238字)
    |
    5月前
    |
    缓存 监控 JavaScript
    前端性能监控指标
    前端性能指标包括白屏时间、首屏时间、DOM可操作时间和页面总加载时间。可通过注入代码或`window.performance` API进行量化统计,后者基于浏览器标准接口,提供精确的网络、解析与渲染各阶段耗时数据,助力性能优化。
    |
    5月前
    |
    域名解析 缓存 边缘计算
    CDN加速
    CDN(内容分发网络)通过在全球部署节点服务器,将源站内容缓存至边缘节点,用户访问时由最近节点提供服务。基于DNS重定向与智能调度,实现就近加速,降低延迟,提升访问速度与网站可用性,有效应对高并发、带宽不足等问题。
    |
    5月前
    |
    存储 JavaScript 前端开发
    XSS攻击
    XSS(跨站脚本攻击)是攻击者通过网站漏洞注入恶意脚本,用户访问时执行,窃取数据、Cookie或劫持会话。主要分反射型和存储型,危害大。防御措施包括输入转义、白名单过滤及CSP内容安全策略,有效防止脚本注入。