CSS(层叠样式表)的运行机制如下:
1. 加载
- HTML 解析:浏览器解析 HTML 时,遇到
<link>
或<style>
标签会加载 CSS 文件或内联样式。 - 外部 CSS:通过
<link>
标签引入外部 CSS 文件。 - 内联 CSS:通过
<style>
标签或style
属性直接写在 HTML 中。
2. 解析
- 构建 CSSOM:浏览器将 CSS 解析为 CSSOM(CSS 对象模型),表示样式规则及其层级关系。
- 规则匹配:CSSOM 与 DOM 结合,确定每个元素的样式。
3. 渲染
- 生成渲染树:结合 DOM 和 CSSOM 生成渲染树,包含所有可见元素及其样式。
- 布局(重排):计算每个元素在页面中的位置和大小。
- 绘制(重绘):将元素绘制到屏幕上。
4. 层叠与继承
- 层叠:根据优先级(重要性、来源、特异性、顺序)解决样式冲突。
- 继承:某些样式属性会从父元素继承到子元素。
5. 动态更新
- JavaScript 操作:通过 JavaScript 动态修改样式,触发重排和重绘。
- 伪类和伪元素:如
:hover
和::before
,动态应用样式。
CSSOM的工作原理
CSSOM(CSS Object Model,CSS对象模型)是浏览器用来表示和交互网页的样式信息的一种结构。它与DOM(文档对象模型)类似,但专门针对CSS。CSSOM允许JavaScript访问和操作网页上的样式信息,就像DOM允许脚本访问和操作HTML内容一样。
- 构建过程:当浏览器开始加载网页时,它会解析HTML文档并构建DOM树。同时,对于页面中包含的所有CSS(包括内联样式、内部样式表和外部样式表),浏览器也会进行解析,并为这些样式构建CSSOM树。CSSOM树与DOM树相似,但它只关注于样式规则,而不是文档结构。
- 结构:CSSOM是一个树状结构,每个节点代表一个元素的样式。根节点通常对应着整个文档的默认样式,而其他节点则对应着具体的HTML元素。每个节点都包含了应用于该元素的所有CSS属性及其值。
- 作用:CSSOM的主要作用是帮助浏览器确定如何根据给定的CSS对页面进行布局和渲染。浏览器使用CSSOM来计算哪些样式应该应用到DOM中的各个元素上,这一过程被称为样式计算。
- 性能影响:CSSOM的构建和样式计算可能会对网页性能产生影响,特别是当CSS文件很大或者样式规则很复杂的时候。这是因为浏览器必须在渲染任何内容之前完成CSSOM的构建和样式计算。
- 与JavaScript的交互:通过JavaScript,开发者可以访问和修改CSSOM。例如,可以使用
document.querySelector()
或getComputedStyle()
等方法来获取元素的样式信息,也可以直接修改元素的style
属性来动态改变样式。 - 关键帧动画和过渡:CSSOM也支持CSS动画和过渡效果,允许开发者创建平滑的视觉变化,而无需依赖JavaScript进行每一帧的手动控制。
DOM的基本概念
DOM,全称为文档对象模型(Document Object Model),是HTML和XML文档的编程接口。它将文档表示为节点和对象的树形结构,使得编程语言可以与页面进行交互。通过DOM,JavaScript能够访问和操作网页的内容、结构及样式。
- 节点(Node):在DOM中,文档的所有部分都被视为节点。例如,整个文档是一个文档节点,HTML元素是元素节点,一段文本是文本节点等。
- 元素(Element):HTML文档中的标签被视作元素节点,它们构成了页面的基础结构。
- 属性(Attribute):元素的属性也是DOM的一部分,如
<img>
标签的src
属性或<a>
标签的href
属性。 - 树状结构:DOM把文档描绘成一个倒立的树,文档的顶级是
document
对象,代表整个HTML文档。每个HTML元素都是树的一个分支,而文本内容则作为叶子存在。
总结
CSS 通过加载、解析、渲染、层叠与继承等步骤,将样式应用到 HTML 元素上,最终呈现页面。
示例
CSS 运行 代码示例:
<!DOCTYPE html>
<html>
<head>
<title>CSS 示例</title>
<style>
/* 改变整个页面背景颜色 */
body {
background-color: #f0f0f0;
}
/* 设置标题的颜色为红色 */
h1 {
color: red;
}
/* 使用类选择器改变文字颜色为蓝色 */
.blue-text {
color: blue;
}
/* 改变id为container的div内的所有段落的文字大小 */
#container p {
font-size: 20px;
}
</style>
</head>
<body>
<h1>欢迎来到找找网</h1>
<p class="blue-text">这是一个段落,文字颜色是蓝色。</p>
<div id="container">
<p>这是在div中的段落。</p>
</div>
</body>
</html>