重绘回流过程

简介: 浏览器渲染: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
  • 相关文章
    |
    8月前
    |
    SQL 算法 Java
    MybatisPlus讲义
    本项目基于若依框架与AI技术,打造智慧养老管理系统。涵盖来访、入住、服务、财务等模块,分管理后台与家属端,结合Vue3、SpringBoot、Redis、物联网等技术,融合大模型与AI工具,助力高效开发,响应中国智慧养老发展趋势。
    |
    8月前
    |
    Java 开发工具 Maven
    服务端(DevBox)-项目创建
    使用Sealos在DevBox中创建SpringBoot项目zxyf-management,配置Java环境与Docker容器,通过Cursor智能开发工具一键启动云端应用。无需手动输入命令,自动下载依赖并部署,结合云端域名快速访问服务,实现高效开发与运行。
    |
    8月前
    |
    应用服务中间件 Shell nginx
    11-Dockerfile
    Dockerfile是构建Docker镜像的脚本,包含一系列指令,每条指令创建一个镜像层。从基础镜像开始,按顺序执行FROM、RUN、CMD等命令,最终生成可运行容器的镜像。支持环境变量、工作目录设置、端口暴露、数据卷挂载等功能。CMD与ENTRYPOINT定义启动命令,ADD/COPY复制文件,EXPOSE开放端口。构建时用`docker build`生成镜像,虚悬镜像(无名无标签)可被清理。
    |
    8月前
    |
    jenkins Java 持续交付
    Jenkins前置配置
    本文介绍Jenkins与GitLab集成的完整配置流程:包括GitLab账号创建、SSH密钥配置、API Token生成,Jenkins中GitLab连接、凭据管理、全局Git信息设置,以及节点服务器环境搭建(JDK、Maven、Node、Docker等),并详细说明Jenkins节点通过SSH方式接入的步骤,实现自动化拉取代码、构建打包与持续集成。
    |
    8月前
    |
    存储 对象存储
    服务端(Cursor)-接口开发(文件上传)
    Sealos开通对象存储服务,首次使用需创建Bucket并填写名称。根据接口文档实现文件上传:POST请求至/upload,参数为file,返回文件访问路径。配置AK/SK及内外网地址,使用指定存储桶。通过ApiFox测试上传,文件将同步至Sealos对象存储。详细操作参考官方指南。
    |
    8月前
    |
    前端开发 API 数据格式
    前端(Cursor)-部门管理
    根据部门管理原型图与接口文档,完成增删改查功能开发,调用后端API实现数据交互,注意替换内网地址并临时关闭登录校验以确保接口连通,前端通过Axios请求数据,实现页面动态渲染与操作响应。
    |
    8月前
    |
    缓存 网络协议 JavaScript
    使用window.performance API
    `window.performance` 是W3C提供的性能API,IE9+支持,用于监控页面加载各阶段耗时。包含navigation、timing等字段,可精确统计DNS查询、TCP连接、DOM解析、白屏、domready等关键性能指标,助力前端性能优化。
    |
    8月前
    |
    缓存 前端开发 JavaScript
    头条面经
    涵盖前端、网络、JS核心、框架及算法等多方面知识,包括深拷贝、双向绑定、HTTP缓存、跨域、Vue原理、TCP/UDP、设计模式、事件循环、类型判断、闭包、原型链、性能优化等高频面试题,全面考察技术深度与综合能力。
    |
    8月前
    |
    前端开发 Java
    项目上线
    本教程介绍项目前后端部署全流程:编写entrypoint.sh启动脚本,通过devbox发版后端并上线,配置CPU、内存等参数,部署成功后获取公网IP验证接口;前端需替换内网地址为新后端地址,执行npm install打包,再发版上线。最终通过公网访问前端页面,完成整体部署。
    |
    8月前
    |
    设计模式 前端开发 JavaScript
    写在最后
    本文整理全网前端面试高频考点,系统涵盖JavaScript、框架原理、网络协议、算法、数据结构等核心知识,助力求职者高效备战。附18条进阶建议,助你斩获Offer,前程似锦。(239字)

    热门文章

    最新文章