重绘回流过程

简介: 浏览器渲染: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
  • 相关文章
    |
    6月前
    |
    SQL 算法 Java
    MybatisPlus讲义
    本项目基于若依框架与AI技术,打造智慧养老管理系统。涵盖来访、入住、服务、财务等模块,分管理后台与家属端,结合Vue3、SpringBoot、Redis、物联网等技术,融合大模型与AI工具,助力高效开发,响应中国智慧养老发展趋势。
    |
    6月前
    |
    存储 数据采集 搜索推荐
    状态检索:如何快速判断一个用户是否存在?
    本文探讨了高效判断对象是否存在的技术方案,对比有序数组、二叉树和哈希表后,重点介绍位图与布隆过滤器。位图利用bit级存储,大幅节省空间;布隆过滤器通过多哈希函数映射,以极小错误率换取更高空间效率,适用于注册去重、爬虫判重等场景,是时间与空间权衡的典范。
    |
    6月前
    |
    jenkins Java 持续交付
    Jenkins前置配置
    本文介绍Jenkins与GitLab集成的完整配置流程:包括GitLab账号创建、SSH密钥配置、API Token生成,Jenkins中GitLab连接、凭据管理、全局Git信息设置,以及节点服务器环境搭建(JDK、Maven、Node、Docker等),并详细说明Jenkins节点通过SSH方式接入的步骤,实现自动化拉取代码、构建打包与持续集成。
    |
    6月前
    |
    前端开发 API 数据格式
    前端(Cursor)-部门管理
    根据部门管理原型图与接口文档,完成增删改查功能开发,调用后端API实现数据交互,注意替换内网地址并临时关闭登录校验以确保接口连通,前端通过Axios请求数据,实现页面动态渲染与操作响应。
    |
    6月前
    |
    存储 对象存储
    服务端(Cursor)-接口开发(文件上传)
    Sealos开通对象存储服务,首次使用需创建Bucket并填写名称。根据接口文档实现文件上传:POST请求至/upload,参数为file,返回文件访问路径。配置AK/SK及内外网地址,使用指定存储桶。通过ApiFox测试上传,文件将同步至Sealos对象存储。详细操作参考官方指南。
    |
    6月前
    |
    jenkins Java 持续交付
    Jenkins配置编译项目
    Jenkins配置编译任务,实现从GitLab拉取代码,通过Maven/Node编译打包,Docker构建镜像并推送至CCE仓库,kubectl更新服务。支持后台app-web、system-server及前端Vue项目自动化构建与部署,结合86/164服务器特性导出镜像tar包,实现全流程持续集成。
    |
    6月前
    |
    缓存 网络协议 JavaScript
    使用window.performance API
    `window.performance` 是W3C提供的性能API,IE9+支持,用于监控页面加载各阶段耗时。包含navigation、timing等字段,可精确统计DNS查询、TCP连接、DOM解析、白屏、domready等关键性能指标,助力前端性能优化。
    |
    6月前
    |
    缓存
    浏览器缓存
    HTTP缓存依赖Cache-Control和ETag实现。Cache-Control通过public、private、no-cache等指令控制缓存范围与行为,max-age、s-maxage设置缓存时长,must-revalidate控制过期验证;ETag为资源生成唯一标识,客户端通过If-None-Match比对,判断是否返回304,节省带宽,提升性能。
    |
    6月前
    |
    JavaScript 前端开发
    虚拟滚动技术
    插入数万个DOM时,为避免页面卡顿,可采用虚拟滚动技术,仅渲染可视区域内的元素,滚动时动态更新内容,大幅减少DOM数量。相比一次性渲染,性能显著提升,是前端优化的面试加分项。如react-virtualized即为此类解决方案。
    |
    6月前
    |
    监控 前端开发 网络协议
    前端性能监控指标
    前端性能监控指标包括白屏时间、首屏时间、用户可操作时间及总下载时间。通过注入代码或Timing API等方式可量化统计,其中白屏时间常用head前后时间差估算,虽为估值但具参考价值,助力优化用户体验。