当前位置: 首页 > news >正文

CSS 工作原理

CSS 工作原理

原文链接:https://www.yangoogle.com/keep-learning/

css 在浏览器中,主要执行的加载、解析、渲染三个阶段。

  1. 加载阶段
  • 发起网络请求
  • 获取 css 文件
  • 并行下载: 浏览器通常使用并行下载的方式,同时请求多个资源,提高页面加载性能。(浏览器通常使用多线程执行,并行下载是其中的一项优化策略)
  1. 解析阶段
  • 构建 CSSOM(Object Model): 浏览器开始构建 CSSOM,它是一个样式信息树的结构,包含了所有样式规则和其对应的层级关系。CSSOM 的构建是异步的,不会阻塞 HTML 解析。
  • 构建 DOM 树:在构建 CSSOM 的同时,浏览器还在构建 DOM 树,表示 HTML 文档的结构。DOM 树和 CSSOM 树将合并构成一个渲染树(render tree)
  • 样式计算(Style Calculation): 浏览器根据 DOM 树和 CSSOM 树的结合来计算每个元素的最终样式。
  1. 渲染阶段
  • 生成布局(Layout): 浏览器使用计算后的样式结果来生成布局,也就是确定每个DOM元素在页面上的位置和大小。此阶段也称为布局或回流(Reflow)。
  • 绘制(Painting): 浏览器使用生成的布局信息,将页面的每个元素绘制成像素。此阶段也称为绘制(Painting)。
  • 合成(Composite): 浏览器将绘制好的像素按照正确的顺序合成到页面上,形成最终渲染结果。此过程称为合成。

CSSOM 构建过程

CSSOM 是表示样式信息的树状结构

它在浏览器中的构建过程如下:

  1. Tokenization(词法分析)
    - 将 CSS 代码解析成一个个的 token(标记)。
    - Token 是 CSS 语法的最小单元,包括选择器、属性、值等。
  2. Parsing(语法分析)
    - 将 token 转换为抽象语法树(Abstract Syntax Tree,AST)。
    - AST 是一种树状结构,表示了 CSS 语法的层次结构。
  3. 构造 CSSOM
    - 通过遍历 AST,构建 CSSOM。
    - 在 CSSOM 中,每个节点表示一个样式规则或样式声明。
  4. Cascade(重叠)
    - 对于每个元素,浏览器需要考虑多个样式来源(用户样式、作者样式、浏览器默认样式等)的层叠规则,决定最终生效的样式。
    - 层叠的结果是元素应用的最终样式规则。
  5. Computed Style(计算样式)
    - 将最终的样式规则转换为元素的计算样式。
    - 计算样式是一个键值对的集合,表示元素最终应用的样式属性及其值。

CSSOM 数据结构类型

常见数据结构类型包括:

  1. CSSStyleRule
    - 表示 CSS 样式规则
    - 包含选择器和声明块
p {color: red;font-size: 16px;
}

CSSOM 数据结构

{type: 'rule',selectorText: 'p',style: {color: 'red',fontSize: '16px'}
}
  1. CSSMediaRule
    - 表示媒体查询规则,包含在 @media 块内的样式规则。
@media screen and (min-width: 600px) {body {background-color: lightblue;}
}

CSSOM 数据结构

{type: 'media',media: 'screen and (min-width: 600px)',cssRules: [{type: 'rule',selectorText: 'body',style: {backgroundColor: 'lightblue'}}]
}

补充说明

  1. 重排与重绘: 布局和绘制的过程中,如果修改了元素的几何属性(大小、位置等信息),会触发回流和重绘。
  • 回流(Reflow): 当渲染树中的部分或全部元素的尺寸、结构或布局发生变化时,浏览器需要重新计算元素的几何属性,然后构建渲染树,这个过程就叫做回流。回流会导致性能开销,特别是在大型复杂的页面上。
  • 重绘(Repaint): 当元素的样式发生改变,但不影响其布局时,浏览器只需重新绘制元素,而不需要重新计算其布局,这个过程叫做重绘。重绘的性能开销相对较小。
  1. 渲染优化
    - 避免使用复杂的选择器(避免增加样式匹配的计算成本)
    - 使用更具体的选择器,减少匹配元素的数量
    - 使用复用性高的类名,减少重复定义相似样式
    - 懒加载非必要样式,提高首屏加载速度
    - 利用 GPU 加速优化复杂样式和动画效果。通过 transformopacity 实现硬件加速
具体来说,transform 属性主要用于实现元素的平移、旋转、缩放和倾斜等变换效果。当应用这些变换时,元素的位置和大小在屏幕上发生了变化,但这些变化对文档流没有影响,因此不会触发回流
http://www.dtcms.com/a/305767.html

相关文章:

  • Qt知识点2『Ubuntu24.04.2安装Qt5.12.9各种报错』
  • git报failed to connect to github.com port 443 after 21064
  • 项目文档太多、太混乱怎么解决
  • Qt 在 ARM 平台上的移植与优化
  • 中国高铁从追赶到领跑的破壁之路
  • 15.11 单卡训练770M参数模型!DeepSpeed ZeRO-3实战:RTX 4090显存直降6.8GB
  • 接口自动化测试
  • 深入剖析 StarRocks 与 Hive 的区别、使用场景及协同方案实践
  • 【IDEA】JavaWeb自定义servlet模板
  • 手机定位和IP属地究竟有何不同
  • 【Lambda】flatMap使用案例
  • Redis 面试全解析:从数据结构到集群架构(含实战解决方案)
  • 《Java 程序设计》第 10 章 - 接口与 Lambda 表达式
  • #C语言——学习攻略:深挖指针路线(四续)——函数指针数组--转移表
  • 【支持Ubuntu22】Ambari3.0.0+Bigtop3.2.0——Step4—时间同步(Chrony)
  • 从0开始学习R语言--Day62--RE插补
  • STL学习(?、常用的算数算法和集合算法)
  • 跳跃表可视化深度解析:动态演示数据结构核心原理
  • 数据结构第3问:什么是线性表?
  • 数据结构-Set集合(一)Set集合介绍、优缺点
  • 基于 Rust 和土木工程、设备故障诊断、混凝土养护、GPS追踪、供应链物流跟踪系统、地下水监测等领域的实例
  • CouchDB 从入门到精通:构建高效的分布式文档数据库
  • cpp实现音频重采样8k->16k及16k->8k
  • 2025年华为HCIA-AI认证是否值得考?还是直接冲击HCIP?
  • c++函数返回值完整总结
  • GaussDB 数据库架构师(十二) 数据库对象修改审计设置
  • (RedmiBook)上禁用触摸板或自带键盘
  • 【LangGraph技术深度解析】构建下一代AI工作流的革命性框架
  • 数据赋能(358)——数据分析——可解释性原则
  • ZKMall商城开源本地部署指南