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

上文介绍了关于 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.xdnf.cn/news/146992.html

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

相关文章

使用Properties

a.特点 i.它的Key-Value一般都是String-String类型的&#xff0c;可以用Map<String, String>表示。 ii.Java标准库提供Properties来表示一组“配置”。 iii.读写Properties时&#xff0c;使用getProperty()和setProperty()方法&#xff0c;不要调用继承自HashTabled的ge…

开始场景的制作+气泡特效的添加

3D场景或2D场景的切换 1.新建项目时选择3D项目或2D项目 2.如下图操作&#xff1a; 开始前的固有流程 按照如下步骤进行操作&#xff0c;于步骤3中更改Company Name等属性&#xff1a; 本案例分辨率可以如下设置&#xff0c;有能力者可根据需要自行调整&#xff1a; 场景制作…

轻掺杂漏极(LDD)技术

轻掺杂漏极&#xff08;LDD&#xff09;是一种低能量、低电流的注入工艺&#xff0c;通过该工艺在栅极附近形成浅结&#xff0c;以减少靠近漏极处的垂直电场。对于亚微米MOSFET来说&#xff0c;LDD是必需的&#xff0c;以便抑制热电子效应&#xff0c;这种效应会导致器件退化并…

Python进阶学习笔记(一)对象

1.对象模型 在面向对象理论中类和对象是不同的概念&#xff0c;而在python中类也是对象&#xff0c;叫做类型对象。 所以python中的类&#xff0c;实例对象&#xff0c;类型都是对象。 元类型&#xff1a; 在python中实例对象的类型为对应类型的对象&#xff0c;而类型的对象…

14. PEFT:在大模型中快速应用 LoRA

如果你对LoRA还没有一个直观的概念&#xff0c;可以回看这篇文章&#xff1a;《3. 认识 LoRA&#xff1a;从线性层到注意力机制》。 我们将在这里进一步探讨如何快速地在大型预训练模型中应用 LoRA&#xff0c;并解答可能存在的问题&#xff0c;包括&#xff1a; peft 和 lora …

博途TIA v18下载时,需要重启才能安装下载路径是灰色改不了

一、需要重启才能安装 删除下面注册表P开头的文件&#xff1a; 二、下载路径是灰色改不了 注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion里找到C:\Program Files或者C:\Program Files&#xff08;x86&#xff09;&#xff0c;具体哪个看安装的时候对应…

TikTokDownloader 开源项目操作教程

TikTokDownloader TikTokDownloader 是一个开源的多功能视频下载工具&#xff0c;它专门用于从抖音和TikTok平台下载无水印的视频、图集和直播内容。这个工具支持批量下载账号作品、收藏内容&#xff0c;并可以采集详细数据。它提供了命令行和Web界面&#xff0c;具有多线程下…

arm-硬件

一、ARM体系与架构 ARM芯片组成 -- arm 体系中&#xff0c;一般讲到的芯片由两大部分组成&#xff1a;arm的内核、外设 arm内核&#xff1a; -- 其内核主要由&#xff1a;寄存器、指令集、总线、存储器映射规则、中断逻辑主调试组件构成。ARM公司只设计内核&#xff0c;授权给…

java intellij idea开发步骤,使用指南,工程创建与背景色字体配置,快捷键

intellij idea2021 配置背景色&#xff0c;字体大小&#xff0c;主题 快捷键

网站建设模板选择哪种

在选择网站建设模板时&#xff0c;需要考虑多个因素&#xff0c;包括网站的目的、受众、内容类型以及个性化需求等。以下是一些常见的网站建设模板类型&#xff0c;以及它们的特点&#xff0c;希望对你的选择有所帮助。 企业/商务模板&#xff1a; 企业和商务网站通常需要专业、…

14、主机、应用及数据安全解读

数据来源&#xff1a;14.主机、应用及数据安全解读_哔哩哔哩_bilibili

leetcode第十一题:盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例…

简单题101. 对称二叉树 (python)20240922

问题描述&#xff1a; python: # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right rightclass Solution(object):def isSymm…

Windows内网穿透远程桌面操作指南

1、登录NatCross官网https://www.natcross.com 账密登录或手机验证码登录。 2、点击左侧场景映射&#xff0c;选择【3389远程桌面】点击添加。 3、检查本地ip&#xff1a;127.0.0.1为本机&#xff0c;本地端口默认&#xff1a;3389&#xff0c;点击保存&#xff0c;系统生产成外…

【LeetCode】每日一题 2024_9_22 找到小镇的法官(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;找到小镇的法官 代码与解题思路 func findJudge(n int, trust [][]int) int {// 我当时的思路就是&#xff1a;每个人&#xff08;除了小镇法官&#xff09;都信任这位小镇法官。// 直接…

黑马头条day2-2 freemaker minio

其实就是freemaker生成一个静态页面 然后存储到minio上 返回一个链接在表里 最后直接通过url访问minio里边的动态页面 freemaker和minio 就是一个展示一个存储 下边这个弹幕感觉说的很清楚 遇到的问题 1 依赖报错 引不到依赖 一直没找到问题出在哪里 明明在pom文件里边引入了…

Docker配置代理解决pull超时问题

操作系统: CentOS Linux 8 Docker版本: 26.1.3 前置&#xff1a;你需拥有&#x1f431; 1. 配置 proxy.conf 1.1 创建配置文件目录 创建 docker.service.d&#xff0c;进入到 docker.service.d 中打开 proxy.conf (没有文件打开会自动创建)。 注意&#xff1a;每个人的路径可…

GRE隧道协议学习笔记

使用场景 分布在不同地理位置的总公司和分公司怎么通过网络连接起来&#xff1f; 可以使用ISP网络连接。在豆包中可以看到如下回答通俗的讲就是运营商收费提供网络服务&#xff0c;有个人的有企业的&#xff0c;企业的很贵 为什么要使用GRE隧道 当然你也可以用其他隧道协议…

C++_22_异常

文章目录 异常概念&#xff1a;**抛出异常&#xff1a;**关键字&#xff1a; **捕获异常&#xff1a;****栈解旋&#xff1a;****异常的接口声明&#xff1a;****异常对象的生命周期&#xff1a;**1 传递异常对象【不使用】2 传递异常对象指针【不使用】3 传递异常对象引用【**…

论 JAVA 集合框架中 接口与类的关系

前言 这是笔者在学习过程中的一篇"备忘录",其目的是能用最EZ最粗鄙的语言口述出 JAVA集合框架中 所有类与接口的关系 本人在不断地学习中,总会混淆集合框架中的类和接口,以及它们的作用关系,虽然不影响我的使用,但是我也不想一直糊涂下去,故而趁知识还没混淆之际,赶…