重绘回流过程

简介: 浏览器渲染流程:解析HTML生成DOM树,解析CSS生成CSSOM,结合生成渲染树。布局(回流)计算元素位置,绘制(重绘)渲染界面。DOM树含所有元素,渲染树仅含可见节点。CSS阻塞渲染但不阻塞DOM解析。回流因布局变化触发,必导致重绘;重绘仅外观变。避免频繁操作样式、使用DocumentFragment、缓存属性值可优化性能。

重绘回流过程

  1. 浏览器的渲染过程,DOM 树和渲染树的区别?
    HTML 经过解析生成 DOM树; CSS经过解析生成 Style Rules。 二者一结合生成了Render Tree。
    通过layout计算出DOM要显示的宽高、位置、颜色。
    最后渲染在界面上,用户就看到了
  2. 浏览器的渲染过程
    解析 HTML 构建 DOM(DOM 树),并行请求 css/image/js
    CSS 文件下载完成,开始构建 CSSOM(CSS 树)
    CSSOM 构建结束后,和 DOM 一起生成 Render Tree(渲染树)
    布局(Layout):计算出每个节点在屏幕中的位置
    显示(Painting):通过显卡把页面画到屏幕上
  3. DOM 树 和 渲染树 的区别?
    DOM 树与 HTML 标签一一对应,包括 head 和隐藏元素
    渲染树不包括 head 和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的 css 属性
  4. CSS会阻塞DOM解析吗?
    对于一个HTML文档来说,不管是内联还是外链的css,都会阻碍后续的dom渲染,但是不会阻碍后续dom的解析。
    当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
  • 相关文章
    |
    1天前
    |
    数据采集 人工智能 安全
    |
    10天前
    |
    云安全 监控 安全
    |
    2天前
    |
    自然语言处理 API
    万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
    通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
    911 150
    |
    15天前
    |
    机器学习/深度学习 人工智能 自然语言处理
    Z-Image:冲击体验上限的下一代图像生成模型
    通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
    1647 8
    |
    6天前
    |
    人工智能 前端开发 文件存储
    星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择
    星哥带你玩转飞牛NAS,部署开源笔记TriliumNext!支持树状知识库、多端同步、AI摘要与代码高亮,数据自主可控,打造个人“第二大脑”。高效玩家的新选择,轻松搭建专属知识管理体系。
    365 152
    |
    7天前
    |
    人工智能 自然语言处理 API
    一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
    一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
    605 152
    |
    9天前
    |
    人工智能 安全 前端开发
    AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
    AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
    571 13
    |
    2天前
    |
    编解码 人工智能 机器人
    通义万相2.6,模型使用指南
    智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话