重绘回流过程

简介: 浏览器解析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
  • 相关文章
    |
    2天前
    |
    数据采集 人工智能 安全
    |
    11天前
    |
    云安全 监控 安全
    |
    3天前
    |
    自然语言处理 API
    万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
    通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
    1006 151
    |
    3天前
    |
    编解码 人工智能 机器人
    通义万相2.6,模型使用指南
    智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
    |
    16天前
    |
    机器学习/深度学习 人工智能 自然语言处理
    Z-Image:冲击体验上限的下一代图像生成模型
    通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
    1699 9
    |
    8天前
    |
    人工智能 自然语言处理 API
    一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
    一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
    643 152
    |
    10天前
    |
    人工智能 安全 前端开发
    AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
    AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
    613 13
    |
    9天前
    |
    人工智能 自然语言处理 API
    Next AI Draw.io:当AI遇见Draw.io图表绘制
    Next AI Draw.io 是一款融合AI与图表绘制的开源工具,基于Next.js实现,支持自然语言生成架构图、流程图等专业图表。集成多款主流大模型,提供智能绘图、图像识别优化、版本管理等功能,部署简单,安全可控,助力技术文档与系统设计高效创作。
    687 151