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

news2024/9/23 2:31:00

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

📢:CSS 相关的面试题哦!

1. 解析 (Parsing)

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

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

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

注意事项:

1、无效的 CSS

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

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)

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

🌰

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

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

注意事项:

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

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

6. 合成 (Compositing)

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

🌰

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.coloradmin.cn/o/2156366.html

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

相关文章

Python | Leetcode Python题解之第416题分割等和子集

题目&#xff1a; 题解&#xff1a; class Solution:def canPartition(self, nums: List[int]) -> bool:n len(nums)if n < 2:return Falsetotal sum(nums)if total % 2 ! 0:return Falsetarget total // 2dp [True] [False] * targetfor i, num in enumerate(nums…

为什么编程很难?

之前有一个很紧急的项目&#xff0c;项目中有一个bug始终没有被解决&#xff0c;托了十几天之后&#xff0c;就让我过去协助解决这个bug。这个项目是使用C语言生成硬件code&#xff0c;是更底层的verilog&#xff0c;也叫做HLS开发。 项目中的这段代码并不复杂&#xff0c;代码…

24年 九月 刷题记录

1. leetcode997找到小镇的法官 小镇里有 n 个人&#xff0c;按从 1 到 n 的顺序编号。传言称&#xff0c;这些人中有一个暗地里是小镇法官。 如果小镇法官真的存在&#xff0c;那么&#xff1a; 小镇法官不会信任任何人。 每个人&#xff08;除了小镇法官&#xff09;都信任这…

利用QEMU安装一台虚拟机的三种方法

文章目录 宿主机的选择方法一&#xff1a;直接用qemu源码安装步骤1&#xff1a;下载好qemu源码&#xff0c;这里我们用qemu-5.1.0步骤2&#xff1a;编译步骤3&#xff1a;创建一个系统盘步骤4&#xff1a;用步骤2编译的qemu-system-x86_64 启动一台Linux虚拟机步骤5&#xff1a…

问题——IMX6UL的uboot无法ping主机或Ubuntu

主要描述可能的方向&#xff0c;不涉具体过程&#xff0c;详细操作可以查阅网上相关教程 跟随正点原子教程测试以太网端口时&#xff0c;即便按照步骤多次尝试也无法ping通&#xff0c;后补充了些许网络工程基础知识解决了这个问题。 uboot无法ping主机或Ubuntu有多种可能&…

二分查找算法(3) _x的平方根

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 二分查找算法(3) _x的平方根 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 温馨…

简易CPU设计入门:取指令(一),端口列表与变量声明

取指令这一块呢&#xff0c;个人觉得&#xff0c;不太好讲。但是呢&#xff0c;不好讲&#xff0c;我也得讲啊。那就尽量地讲吧。如果讲得不好的话&#xff0c;那么&#xff0c;欢迎大家提出好的意见&#xff0c;帮助我改进讲课的质量。 首先呢&#xff0c;还是请大家去下载本…

面试官:Spring是如何解决循依赖问题?

Spring 的循环依赖一直都是 Spring 中一个很重要的话题&#xff0c;一方面是 Spring 为了解决循环依赖做了很多工作&#xff0c;另一个方面是因为它是面试 Spring 的常客&#xff0c;因为他要求你看过 Spring 的源码&#xff0c;如果没有看过 Spring 源码你基本上是回答不了这个…

pytorch的动态计算图机制

pytorch的动态计算图机制 一&#xff0c;动态计算图简介 Pytorch的计算图由节点和边组成&#xff0c;节点表示张量或者Function&#xff0c;边表示张量和Function之间的依赖关系。 Pytorch中的计算图是动态图。这里的动态主要有两重含义。 第一层含义是&#xff1a;计算图的…

“吉林一号”宽幅02B系列卫星

离轴四反光学成像系统 1.光学系统参数&#xff1a; 焦距&#xff1a;77.5mm&#xff1b; F/#&#xff1a;7.4&#xff1b; 视场&#xff1a;≥56゜&#xff1b; 光谱范围&#xff1a;400nm&#xff5e;1000nm。 2.说明&#xff1a; 光学系统采用离轴全反射式结构&#xff0c;整…

解密的军事卫星图像在各种民用地理空间研究中都有应用

一、美军光学侦察卫星计划概述 国家侦察局 &#xff08;NRO&#xff09; 负责开发和操作太空侦察系统&#xff0c;并为美国国家安全开展情报相关活动。NRO 开发了几代机密锁眼 &#xff08;KH&#xff09; 军事光学侦察卫星&#xff0c;这些卫星一直是美国国防部 &#xff08;D…

人工智能不是人工“制”能

文/孟永辉 如果你去过今年在上海举办的世界人工智能大会&#xff0c;就会知道当下的人工智能行业在中国是多么火爆。 的确&#xff0c;作为第四次工业革命的重要组成部分&#xff0c;人工智能愈发引起越来越多的重视。 不仅仅是在中国&#xff0c;当今世界的很多工业强国都在将…

python爬虫案例——异步加载网站数据抓取,post请求(6)

文章目录 前言1、任务目标2、抓取流程2.1 分析网页2.2 编写代码2.3 思路分析前言 本篇案例主要讲解异步加载网站如何分析网页接口,以及如何观察post请求URL的参数,网站数据并不难抓取,主要是将要抓取的数据接口分析清楚,才能根据需求编写想要的代码。 1、任务目标 目标网…

Win10 安装Node.js 以及 Vue项目的创建

一、Node.js和Vue介绍 1. Node.js Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。它允许你在服务器端运行 JavaScript&#xff0c;使得你能够使用 JavaScript 来编写后端代码。以下是 Node.js 的一些关键特点&#xff1a; 事件驱动和非阻塞 I/O&#xff1a;Node…

list(一)

list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个元素和后一个元素。 支持 -- 但是不支持…

Linux:终端(terminal)与终端管理器(agetty)

终端的设备文件 打开/dev目录可以发现其中有许多字符设备文件&#xff0c;例如对于我的RedHat操作系统&#xff0c;拥有tty0到tty59&#xff0c;它们是操作系统提供的终端设备。对于tty1-tty12使用ctrlaltF*可以进行快捷切换&#xff0c;下面的命令可以进行通用切换。 sudo ch…

校园热捧的“人气新贵”,D 咖智能饮品机器人

在 2024 年的校园中&#xff0c;一股全新的潮流正在悄然兴起。D 咖智能饮品机器人以其独特的魅力&#xff0c;成功入驻多个校园&#xff0c;迅速成为学生们热烈追捧的对象&#xff0c;在长江大学、荆州职业技术学院、中医高专等多个大学校园&#xff0c;都能发现他们靓丽的身姿…

calibre-web报错:File type isn‘t allowed to be uploaded to this server

calibre-web报错&#xff1a;File type isnt allowed to be uploaded to this server 最新版的calibre-web在Upload时候会报错&#xff1a; File type isnt allowed to be uploaded to this server 解决方案&#xff1a; Admin - Basic Configuration - Security Settings 把…

投资学 01 定义,投资

02. 03. 3.1 直接投资&#xff1a;使用方和提供方是一个人

VUE3学习---【一】【从零开始的VUE学习】

目录​​​​​​​ 什么是Vue 渐进式框架 创建一个Vue应用 什么是Vue应用 使用Vue应用 根组件 挂载应用 模板语法 文本插值 原始HTML Attribute绑定 简写 同名简写 布尔型Attribute 动态绑定多个值 使用JavaScript表达式 仅支持表达式 指令 Directives 指令…