从 CSS 到屏幕:揭秘浏览器渲染背后的小秘密

server/2024/9/23 2:21:35/

上文介绍了关于 CSS 属性的计算过程,本文介绍浏览器从 CSS 代码到最终的样式渲染过程中各个阶段的具体细节。

📢:CSS 相关的面试题哦!

1. 解析 (Parsing)

解析是浏览器处理 CSS 的第一个阶段。浏览器会从 CSS 文件或 <style> 标签中读取规则,将这些 CSS 规则转化为内部的 CSSOM(CSS 对象模型)结构。

css">/* 样式表 */
body {font-size: 16px;color: black;
}
p {font-size: 1.5em;color: red;
}

在解析过程中,浏览器将上述 CSS 转换为一个可操作的对象模型(CSSOM),用于后续的计算。

注意事项:

1、无效的 CSS

如果浏览器遇到无法理解的 CSS 规则(例如写错了属性名),它会跳过该规则,并继续处理其他部分。例如 🌰,以下代码中的 colors 是一个无效的属性名,它将被忽略:

css">body {font-size: 16px;colors: red; /* 无效的 CSS 属性 */
}

2、@import 规则

如果在样式表中使用 @import 导入其他样式表,浏览器会先解析导入的文件,再继续解析主文件的其他内容。过多的 @import 可能导致性能问题,因为每个样式表都需要单独请求。

2. 样式层叠 (Cascade) 和继承 (Inheritance)

解析完所有的 CSS 规则后,浏览器会根据 CSS 的层叠规则和继承机制,计算每个元素的最终样式。

详细见:全面介绍 CSS 属性值计算 —— 掌握它就了解大部分 CSS-CSDN博客

3. 样式计算 (Style Calculation)

经过层叠和继承,浏览器会为每个元素计算出具体的样式。这个阶段主要是将相对值转换为绝对值。

百分比 %:许多属性可以使用百分比值(如width: 50%)。这些值通常相对于父元素的大小进行计算。

单位转换:em 和 rem 是相对单位。em 基于父元素的字体大小,而 rem 基于根元素(通常是 html标签)的字体大小。

自动计算:像 auto 这样的值(例如 margin: auto)会根据元素的上下文动态计算,例如用于居中对齐。

4. 布局计算 (Layout)

在计算出样式后,浏览器开始计算页面中每个元素的布局。这一步骤有时也称为“重排 (Reflow)”或“布局 (Layout)”。

🌰

<!DOCTYPE html>
<html lang="en">
<head><style>.container {width: 80%;margin: auto;}</style>
</head>
<body><div class="container">这是一段文本。</div>
</body>
</html>

在这个例子中,container 的 width 是页面宽度的 80%,而 margin: auto 会让它水平居中。浏览器需要计算容器的具体宽度和位置,然后应用到布局中。 

注意事项:

1、重排:当页面中元素的大小、位置或几何结构发生变化时,浏览器需要重新计算布局。这会导致性能问题,特别是在页面有很多元素时。

2、避免强制同步布局:频繁读取和写入布局信息(例如频繁使用 offsetWidth、offsetHeight)会触发浏览器的重排,从而降低页面性能。

5. 绘制 (Painting)

在布局阶段完成之后,浏览器会开始将样式和颜色绘制到屏幕上。绘制是将布局信息转化为可见像素的过程。

🌰

css">div {background-color: lightblue;border: 1px solid black;
}

浏览器会在 div 元素的背景上绘制浅蓝色,并在元素的边缘绘制黑色边框。 

注意事项:

1、重绘 (Repaint):当元素的颜色、背景或边框变化时,浏览器会触发重绘。相比于重排,重绘的开销相对较小。

2、独立图层 (Layers):有时浏览器会为某些元素创建独立图层,特别是涉及 CSS 3D 变换、透明度变化或动画时。独立图层可以优化绘制性能,但也会消耗额外的内存。

6. 合成 (Compositing)

绘制完成后,浏览器会将多个图层合成为最终的页面显示。这个阶段称为合成。

🌰

css">div {transform: translateX(50px);opacity: 0.8;
}

transform 和 opacity 会触发浏览器的 GPU 合成阶段, 而不会引发重排和重绘。GPU 合成可以提升页面的渲染性能。 

注意事项:

1、GPU 加速:浏览器会对某些 CSS 动画和变换(如 transform 和 opacity)进行硬件加速。如果过度使用这些属性,可能会导致 GPU 负载过大。

2、图层的数量:创建过多的独立图层会带来额外的内存开销。

7. 性能优化建议

1、减少重排和重绘:避免频繁操作 DOM 或改变布局。对于复杂的布局操作,可以使用 requestAnimationFrame。

2、合理使用 GPU 加速:transform 和 opacity  是能够触发 GPU 加速的属性,可以用来优化动画性能。避免过度使用 GPU 加速,导致性能瓶颈。

3、异步加载样式:可以使用 media 属性或 preload 来优化样式表的加载顺序,避免阻塞渲染。

总结

浏览器从 CSS 代码到最终样式渲染的过程经过了多个阶段,包括解析、样式层叠与继承、样式计算、布局计算、绘制和合成。理解这些过程有助于我们优化页面性能和构建网页应用。


http://www.ppmy.cn/server/120581.html

相关文章

JVM的CMS、G1以及ZGC对比

一、JVM回收器大比拼&#xff1a;CMS、G1与ZGC深度剖析 在Java的广袤宇宙中&#xff0c;JVM&#xff08;Java虚拟机&#xff09;是每位开发者不可或缺的伙伴。而垃圾回收器&#xff0c;作为JVM的“清洁工”&#xff0c;更是决定了我们应用的性能和响应速度。今天&#xff0c;就…

『功能项目』窗口可拖拽脚本【59】

本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目&#xff0c; 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本&#xff1a;DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…

Vue 依赖注入组件通信:provide / inject 使用详解

引言 在 Vue.js 中&#xff0c;我们经常会遇到组件之间需要共享数据的情况。一种常见的解决方案是通过 props 和 $emit 事件来进行数据传递&#xff0c;但对于多层嵌套的组件结构或共享状态的场景&#xff0c;这种方式显得繁琐而不直观。 幸运的是&#xff0c;Vue.js 提供了一…

探索视频美颜SDK与直播美颜工具的开发实践方案

直播平台的不断发展&#xff0c;让开发出性能优异、效果自然的美颜技术&#xff0c;成为了技术团队必须面对的重要挑战。本篇文章&#xff0c;小编将深入讲解视频美颜SDK与直播美颜工具的开发实践方案。 一、视频美颜SDK的核心功能 视频美颜SDK是视频处理中的核心组件&#xf…

计算机专业的就业方向

计算机专业的就业方向 亲爱的新生们&#xff0c;欢迎你们踏上计算机科学的旅程&#xff01;作为一名计算机专业的学生&#xff0c;你们即将进入一个充满无限可能的领域。今天&#xff0c;我将为大家介绍计算机专业的一些主要就业方向&#xff0c;帮助你们了解未来的职业选择。…

基于SpringBoot+Vue+MySQL的家乡特色推荐系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今数字化时代&#xff0c;随着旅游业的蓬勃发展和人们对本土文化探索的热情日益增长&#xff0c;一个基于SpringBoot、Vue.js与MySQL的家乡特色推荐系统应运而生。该系统旨在通过现代互联网技术&#xff0c;深度挖掘并展示各…

智能BI项目第五期

本期主要内容 系统问题分析异步化业务流程分析线程池讲解&#xff08;入门 原理 实战&#xff09;系统异步化改造开发 1.系统问题分析 当系统面临大量用户请求时&#xff0c;我们后端的 AI 处理能力有限&#xff0c;例如服务器的内存、CPU、网络带宽等资源有限&#xff0c…

python 检索与该查询最相似的句子 使用库hflayers和sentence_transformers来实现遇到的问题

此篇文章总结遇到三个问题(3. OSError: We couldn’t connect to ‘https://huggingface.co’ to load this file, couldn’t find it in the cached files and it looks like sentence-transformers/all-mpnet-base-v2 is not the path to a directory containing a file nam…