JS—页面渲染:1分钟掌握页面渲染过程

个人博客:haichenyi.com。感谢关注

一. 目录

  • 一–目录
  • 二–页面渲染过程
  • 三–DOM树和渲染树

二. 页面渲染过程

浏览器的渲染过程可以分解为以下几个关键步骤

2.1 解析HTML,形成DOM树

  • 浏览器从上往下解析HTML文档,将标签转成DOM节点,形成树状结构(DOM tree)
  • 遇到外部资源(CSS,图片)会并行下载,但同步的JavaScript会同步下载,阻塞HTML解析,会导致页面显示的慢,让用户体验变差。(为了解决这个问题,可以使用async或者defer属性,具体的功能之前博客中有讲过)

2.2 解析CSS,生成CSSOM树

  • 解析CSS样式(包括内联样式和外部样式),生成CSSOM,描述样式的层级关系
  • CSSOM树是逐步完成的,浏览器会避免"回溯"以保证效率

2.3 合并DOM和CSSOM,构建渲染树(Render tree)

  • 渲染树仅包含可见的DOM节点(display:none的元素会被排除),并为每个节点匹配对应的CSS样式
  • 伪元素(::after,::before)等,会以独立节点的形式加入渲染树,DOM节点中不包含这些节点

2.4 布局(Layout/Reflow)

  • 结算每个节点的位置和尺寸,确定其在屏幕上的位置
  • 布局过程可能会因为窗口大小发生变化,内容调整等因素触发重排(性能敏感操作)(重排与重绘的区别之前讲过了)

2.5 绘制(Painting)与合成(Compositing)

  • 将布局后的节点转换为屏幕上的像素,包括文本,颜色,边框等等视觉属性的位置
  • 现代浏览器会将页面分层(GPU加速层),分别绘制后,通过合成器合并为最终图像

CSS解析的时候说到了"回溯",什么是"回溯"呢?
简单来说:假设解析器在解析一段CSS的时候,发现某个规则可能与后续规则冲突(例如选择器优先级或继承关系不明确),需要回退到之前解析的状态,尝试另一种解析路径,这种"试错"行为称之为回溯。举个栗子:

/* 假设解析器需要判断 .box 和 .container 的嵌套关系 */
.container .box { color: red; }
.box { color: blue; }

  如果解析器先处理了 .box,但后续发现 .container .box 优先级更高,可能需要回退并重新匹配,导致性能损耗。
  为什么CSS解析器容易引发回溯?

  • 选择器的复杂性:复杂的选择器(嵌套,后代选择器等),可能会导致解析器需要多次确认匹配关系
  • 规则优先级冲突:当多个规则作用于同一个元素时,解析器需要计算优先级,可能需要重新遍历规则
  • 动态性:某些CSS的规则(如@media媒体查询)依赖外部条件(如试图大小),解析需要重新评估

三. DOM树和渲染树

区别点DOM 树渲染树(Render Tree)​
节点范围所有HTML元素仅包含可见的节点(如display:none会被排除)
结构差异严格反应HTML元素的层级关系可能合并或者拆分DOM节点(如表格的复杂结构)
样式处理不存储样式信息,仅表示文档结构每个节点关联样式,确定最终的视觉表现
动态更新影响修改DOM会触发后续的重建,布局和绘制修改样式可能仅触发重绘或重排(颜色变化)

关键总结:

  • 渲染树是 DOM 和 CSSOM 的结合产物,决定了页面的视觉呈现。
  • DOM 树是基础结构,渲染树是优化后的“渲染蓝图”​,两者共同驱动浏览器高效渲染页面。
  • 性能优化:减少重排(如批量 DOM 操作)和重绘(如使用 transform 替代 top/left)可提升渲染效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

niuhe插件, 在 go 中渲染网页内容

思路 niuhe 插件生成的 go 代码是基于 github.com/ma-guo/niuhe 库进行组织管理的, niuhe 库 是对 go gin 库的一个封装,因此要显示网页, 可通过给 gin.Engine 指定 HTMLRender 来实现。 实现 HTMLRender 我们使用 gitee.com/cnmade/pongo2gin 实现 1. main.go …

openEuler24.03 LTS下安装HBase集群

前提条件 安装好Hadoop完全分布式集群,可参考:openEuler24.03 LTS下安装Hadoop3完全分布式 安装好ZooKeeper集群,可参考:openEuler24.03 LTS下安装ZooKeeper集群 HBase集群规划 node2node3node4MasterBackup MasterRegionServ…

LVGL移植说明

https://www.cnblogs.com/FlurryHeart/p/18104596 参考,里面说明了裸机移植以及freeRTOS系统移植。 移植到linux https://blog.csdn.net/sunchao124/article/details/144952514

ubuntu虚拟机裁剪img文件系统

1. 定制文件系统前期准备 将rootfs.img文件准备好,并创建target文件夹2. 挂载文件系统 sudo mount rootfs.img target #挂载文件系统 sudo chroot target #进入chroot环境3. 内裁剪文件系统 增删裁剪文件系统 exit #退出chroot环境 sudo umount target…

esp826601s固件烧录方法(ch340+面包板)

esp826601s固件烧录方法(ch340面包板) 硬件 stm32f10c8t6,esp826601s,面包板,ch340(usb转ttl),st_link(供电) 接线 烧录时: stm32f10c8t6:gnd->负极, 3.3->正极…

Servlet 点击计数器

Servlet 点击计数器 引言 Servlet 是 Java 企业版(Java EE)技术中的一种服务器端组件,用于处理客户端请求并生成动态内容。本文将详细介绍如何使用 Servlet 实现一个简单的点击计数器,帮助读者了解 Servlet 的基本用法和原理。 …

LangChain vs. LlamaIndex:深入对比与实战应用

目录 引言LangChain 与 LlamaIndex 概述 什么是 LangChain?什么是 LlamaIndex?两者的核心目标与适用场景 架构与设计理念 LangChain 的架构设计LlamaIndex 的架构设计关键技术差异 核心功能对比 数据连接与处理查询与检索机制上下文管理能力插件与扩展性…

【Java中级】10章、内部类、局部内部类、匿名内部类、成员内部类、静态内部类的基本语法和细节讲解配套例题巩固理解【5】

❤️ 【内部类】干货满满,本章内容有点难理解,需要明白类的实例化,学完本篇文章你会对内部类有个清晰的认知 💕 内容涉及内部类的介绍、局部内部类、匿名内部类(重点)、成员内部类、静态内部类 🌈 跟着B站一位老师学习…

内容中台:驱动多渠道营销的关键策略

在数字营销快速发展的今天,企业需要在多个渠道(网站、社交媒体、移动应用等)上同步管理内容。尽管网站仍是品牌展示的核心,但信息分散、多平台重复创建内容的问题,让营销人员面临巨大的管理挑战。 内容中台&#xff0…

SvelteKit 最新中文文档教程(17)—— 仅服务端模块和快照

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …

CMake 中的置变量

在 CMake 中,变量是存储和传递信息的重要方式。以下是一些常用的 CMake 变量,以表格形式列出,包括它们的名称、含义和常见用途: 变量名称含义常见用途CMAKE_CURRENT_SOURCE_DIR当前处理的 CMakeLists.txt 文件所在的源代码目录的…

深入解析C++类:面向对象编程的核心基石

一、类的本质与核心概念 1.1 类的基本定义 类是将**数据(属性)与操作(方法)**封装在一起的用户自定义类型,是面向对象编程的核心单元。 // 基础类示例 class BankAccount { private: // 访问控制string owner; …

介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用及数组讲解

Docker 是一种轻量级的容器化技术,能够让开发者将应用程序和其所有依赖项打包成一个独立的容器,实现快速部署和运行。以下是 Docker 的基本概念和优势: 基本概念: 镜像(Image):镜像是一个只读的…

在msys2里面的mingw64下面编译quickjs

其实非常的简单,就是正常的make 和make install就行了,这里只是简单的做个编译过程记录。 打开开始--程序--里面的msys64里面的mingw64控制台窗口,切换到quickjs下载解压缩后的目录,执行make和make install ndyHP66G5 MINGW64 ~…

el-table实现表头带筛选功能,并支持分页查询

最开始尝试了下面方法,发现这种方法仅支持筛选当前页的数据,不符合产品要求 于是通过查询资料发现可以结合filter-change事件,当表格的筛选条件发生变化的时候会触发该事件,调接口获取符合条件的数据,实现如下 1、表格…

OpenCV 从入门到精通(day_03)

1. ROI切割 ROI:Region of Interest,翻译过来就是感兴趣的区域。什么意思呢?比如对于一个人的照片,假如我们要检测眼睛,因为眼睛肯定在脸上,所以我们感兴趣的只有脸这部分,其他都不care&#xf…

OpenGL进阶系列20 - OpenGL SuperBible - bindlesstex 例子学习

目录 一:概述: 二:相关API介绍 三:代码完整注释 一: 概述: 什么是无绑定纹理(bindless texture)?无绑定纹理是OpenGL的一项技术,旨在消除传统的纹理绑定操作。这项技术允许着色器直接访问纹理而不需要显式地将纹理绑定到某个纹理单元,从而减少了渲染管线中的开销…

Spring Security认证授权深度解析

一 Spring Security简介 Spring Security是Spring生态系统中的一个安全框架,主要用于处理认证(Authentication)和授权(Authorization)。它提供了一套完整的安全解决方案,可以轻松集成到Spring应用中。 二 核心概念 1. 认证(Authentication) 验证用户…

[学成在线]10-课程审核

课程审核 需求分析 根据模块需求分析,课程发布前要先审核,审核通过方可发布。下图是课程审核及发布的流程图: 为什么课程审核通过才可以发布呢? 这样做为了防止课程信息有违规情况,课程信息不完善对网站用户体验也不…

【SpringBoot + MyBatis + MySQL + Thymeleaf 的使用】

目录: 一:创建项目二:修改目录三:添加配置四:创建数据表五:创建实体类六:创建数据接口七:编写xml文件八:单元测试九:编写服务层十:编写控制层十一…