重绘回流过程

简介: 浏览器渲染:HTML解析为DOM树,CSS生成CSSOM,合并为渲染树,再布局、绘制。DOM树含所有标签,渲染树仅含可见元素。CSS阻塞渲染但不阻塞DOM解析。回流(布局变动)必触发重绘(外观变动),优化可减少回流重绘,提升性能。

. 浏览器的渲染过程,DOM 树和渲染树的区别?

  1. HTML 经过解析生成 DOM树; CSS经过解析生成 Style Rules。 二者一结合生成了Render Tree。
  2. 通过layout计算出DOM要显示的宽高、位置、颜色。
  3. 最后渲染在界面上,用户就看到了
  4. 浏览器的渲染过程
  5. 解析 HTML 构建 DOM(DOM 树),并行请求 css/image/js
  6. CSS 文件下载完成,开始构建 CSSOM(CSS 树)
  7. CSSOM 构建结束后,和 DOM 一起生成 Render Tree(渲染树)
  8. 布局(Layout):计算出每个节点在屏幕中的位置
  9. 显示(Painting):通过显卡把页面画到屏幕上
  10. DOM 树 和 渲染树 的区别?
  11. DOM 树与 HTML 标签一一对应,包括 head 和隐藏元素
  12. 渲染树不包括 head 和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的 css 属性
  13. CSS会阻塞DOM解析吗?
  14. 对于一个HTML文档来说,不管是内联还是外链的css,都会阻碍后续的dom渲染,但是不会阻碍后续dom的解析。
  15. 当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
  • 相关文章
    |
    2月前
    |
    Java 开发工具 Maven
    服务端(DevBox)-项目创建
    使用Sealos在DevBox中创建SpringBoot项目zxyf-management,配置Java环境与Docker容器,通过Cursor智能开发工具一键启动云端应用。无需手动输入命令,自动下载依赖并部署,结合云端域名快速访问服务,实现高效开发与运行。
    |
    2月前
    |
    存储 数据采集 搜索推荐
    状态检索:如何快速判断一个用户是否存在?
    本文探讨了高效判断对象是否存在的技术方案,对比有序数组、二叉树和哈希表后,重点介绍位图与布隆过滤器。位图利用bit级存储,大幅节省空间;布隆过滤器通过多哈希函数映射,以极小错误率换取更高空间效率,适用于注册去重、爬虫判重等场景,是时间与空间权衡的典范。
    |
    2月前
    |
    数据安全/隐私保护
    服务端(Cursor)-接口开发(登录认证)
    根据接口文档,完成员工登录功能开发,实现POST /login接口。员工通过用户名密码登录,验证成功后返回包含JWT令牌的响应,后续请求需在header中携带token,否则返回401。已完成接口测试与权限校验集成。
    |
    2月前
    |
    前端开发
    前端(Cursor)-员工管理
    根据页面原型与接口文档,完成员工管理功能开发,实现增删改查及分页查询。新增表单宽800px,按要求布局六行字段,工作经历支持动态增删,每项含时间、公司、职位,确保界面与交互符合设计。
    |
    2月前
    |
    存储 对象存储
    服务端(Cursor)-接口开发(文件上传)
    Sealos开通对象存储服务,首次使用需创建Bucket并填写名称。根据接口文档实现文件上传:POST请求至/upload,参数为file,返回文件访问路径。配置AK/SK及内外网地址,使用指定存储桶。通过ApiFox测试上传,文件将同步至Sealos对象存储。详细操作参考官方指南。
    |
    2月前
    |
    JavaScript 前端开发
    虚拟滚动技术
    插入数万个DOM时,为避免页面卡顿,可采用虚拟滚动技术,仅渲染可视区域内的元素,滚动时动态更新内容,大幅减少DOM数量。相比一次性渲染,性能显著提升,是前端优化的面试加分项。如react-virtualized即为此类解决方案。
    |
    2月前
    |
    缓存 前端开发 JavaScript
    雅虎14条Web性能优化规则
    雅虎14条Web性能优化规则,涵盖减少HTTP请求、使用CDN、压缩资源、合理缓存、优化CSS/JS加载、图片处理、Cookie管理及移动端适配等,全面提升网页加载速度与用户体验。
    |
    2月前
    |
    缓存 网络协议
    网络优化方案
    通过合并资源、压缩文件、合理利用缓存和DNS预解析,减少HTTP请求数与资源大小,提升页面加载速度。采用哈希命名实现缓存更新,确保用户获取最新资源,优化整体网络性能。(239字)
    |
    2月前
    |
    缓存 网络协议 JavaScript
    使用window.performance API
    `window.performance` 是W3C提供的性能API,IE9+支持,用于监控页面加载各阶段耗时。包含navigation、timing等字段,可精确统计DNS查询、TCP连接、DOM解析、白屏、domready等关键性能指标,助力前端性能优化。
    |
    2月前
    |
    监控 网络协议 JavaScript
    前端性能监控指标
    前端性能指标包括白屏时间、首屏时间、用户可操作时间(DOM Ready)和总下载时间(onload)。可通过注入代码或使用 `window.performance` API 进行量化统计。传统方法依赖代码埋点,数据为估值;而 `performance.timing` API 可精准获取DNS、TCP、请求、解析等各阶段耗时,进而计算出各项性能指标,是现代浏览器推荐的性能监控方案。