

层叠性是 CSS 中的基本概念之一。它描述了当多个 CSS 规则应用到同一个 HTML 元素时,如何处理这些规则的冲突。换句话说,就是当多个选择器定义了相同的属性时,哪些属性会被最终采用。层叠性的核心在于 解决样式冲突,特别是在大型项目中,有多个 CSS 文件或多层次样式的情况下。

层叠性是指当多个相同选择器为同一个元素指定了相同的样式属性时,这些样式属性会发生覆盖,也就是所谓的"层叠"。层叠性主要解决样式冲突的问题,这意味着我们可以为一个元素设置多个样式,并且根据一些特定规则来决定最终应用的样式。
层叠性决定了 CSS 如何处理样式冲突,以及它如何处理不同来源的样式,比如行内样式、外部样式表、以及浏览器默认样式之间的冲突。就近原则是层叠性的重要原则之一,即哪个样式离元素最近,就会覆盖其他相同属性的样式。

当元素的样式发生冲突时,遵循以下层叠性原则来决定哪个样式生效:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>层叠性示例</title>
<style>
p {
color: blue;
}
</style>
</head>
<body>
<p style="color: red;">这是一个段落。</p>
</body>
</html>在上面的例子中,我们为 <p> 元素设置了两个不同的 color 样式,一个来自于 <style> 标签(外部样式),另一个是行内样式(style 属性)。根据层叠性原则,行内样式优先级更高,因此段落文本将显示为红色,而不是蓝色。

在实际开发中,经常会有多个 CSS 文件。例如,您可能有一个通用的 base.css,用于定义网站的基础样式;然后有一个 component.css,用于定义具体组件的样式;最后可能还有一个 page.css,用于定义页面的特定样式。层叠性让这些文件可以彼此协作,最终形成页面的整体样式。
层叠性也允许开发人员通过 “逐渐改进” 的方式开发 CSS。例如,可以为所有元素设置一个默认样式,然后为特定元素覆盖这些默认样式。通过这种方式,层叠性使 CSS 更具灵活性和可维护性。

继承性是 CSS 中的另一个重要特性。它描述了元素可以从其父元素中继承某些样式属性的能力。继承性的概念非常类似于现实生活中的继承,例如:我们继承了父母的一些特征。在 CSS 中,继承性使我们可以避免为相同的属性重复编写样式,从而简化代码。

在 CSS 中,某些属性是可以继承的,这意味着一个元素可以继承其父元素的某些样式属性,例如文本颜色(color)和字体(font)等。通过使用继承性,我们可以更加轻松地管理和维护我们的样式代码。
继承性使得 CSS 更加模块化。例如,如果我们为 <body> 设置了字体和文本颜色,则所有子元素都将继承这些样式,除非我们在子元素中进行了明确的覆盖。

不是所有的属性都是可继承的。以下是一些常见的可继承和不可继承的属性:
color:文本颜色font-family:字体家族font-size:字体大小line-height:行高text-align:文本对齐方式margin:外边距padding:内边距border:边框width 和 height:宽度和高度
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>继承性示例</title>
<style>
body {
font-family: Arial, sans-serif;
color: #333;
}
.child {
font-size: 18px;
}
</style>
</head>
<body>
<div class="parent">
<p class="child">这是一个继承父级样式的段落。</p>
</div>
</body>
</html>在这个例子中,<p> 元素继承了 body 的 font-family 和 color 属性,但同时又具有了自己独立的 font-size 样式属性。

行高是一个非常典型的可继承属性,可以使用百分比或单位进行定义。
body {
font: 14px/1.6 "Microsoft YaHei", sans-serif;
}在上面的例子中,line-height 使用了一个不带单位的数字 1.6,这意味着子元素将继承父元素的相对行高。在这种情况下,子元素的行高将根据自己的 font-size 动态调整,而不会固定继承一个具体的数值。

line-height: 1.5 时,子元素会继承 1.5 这个比例,然后根据其自身的 font-size 来计算行高。line-height: 150% 时,子元素继承的将是父元素计算后的实际行高值,而不是一个比例,因此改变子元素的字体大小不会影响到它的行高。
line-height1.5和line-height:150%的区别父元素设置line-height:1.5会直接继承给子元素,子元素根据自己的font-size再去计算子元素自己的line-height。 父元素设置line-height:150%是计算好了line-height值,然后把这个计算值给子元素继承,子元素继承拿到的就是最终的值了。此时子元素设置font-size就对其line-height无影响了。



特殊性是 CSS 中最复杂的部分之一,它决定了当元素有多个选择器匹配时,究竟哪个样式会应用到元素上。特殊性通过一种类似 “权重” 的概念来衡量不同选择器的优先级。

CSS 特殊性的计算涉及一个 “四位数值” 的系统,这个系统通过不同的选择器类型给每个选择器赋予一个权重,从而帮助计算优先级。
* 通配符的贡献值为 0,0,0,0。div)和伪元素(如 ::before)的贡献值为 0,0,0,1。.class)、伪类(如 :hover)的贡献值为 0,0,1,0。#id)的贡献值为 0,1,0,0。style="color: red;")的贡献值为 1,0,0,0。!important 声明的贡献值无穷大,通常用于强制覆盖其他样式。
0,1,0,1,每一位表示一个选择器类型的权重,不会有进位。0。1。10。100。1000。!important 权重无穷大,用于覆盖所有其他样式。
如果一个选择器由多个部分组成,特殊性就会叠加。例如:
div ul li { /* 特殊性为 0,0,0,3 */
}
.nav ul li { /* 特殊性为 0,0,1,2 */
}
a:hover { /* 特殊性为 0,0,1,1 */
}
.nav a { /* 特殊性为 0,0,1,1 */
}
#nav p { /* 特殊性为 0,1,0,1 */
}
div#box { /* 特殊性为 0,1,0,1 */
}在上面的例子中,可以看出复合选择器的权重是通过多个简单选择器的权重叠加而得到的。权重越高,优先级越大。

!important 声明可以用来强制应用某个样式,而不考虑正常的权重计算规则。例如:
div {
color: blue !important;
}在这个例子中,无论其他选择器的特殊性如何,只要存在 !important,这个样式的优先级都是最高的。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>特殊性示例</title>
<style>
#box {
color: red;
}
.box {
color: green;
}
p {
color: blue;
}
</style>
</head>
<body>
<p id="box" class="box">特殊性示例文本</p>
</body>
</html>在这个例子中,<p> 元素具有 id="box" 和 class="box",而 #box 的特殊性为 0,1,0,0,大于 .box 的 0,0,1,0 和 p 的 0,0,0,1,因此文本最终会显示为红色。

为了更好地理解 CSS 的三大特性,我们来一个综合的例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>综合示例</title>
<style>
body {
font-family: Arial, sans-serif;
color: #333;
}
#main {
background-color: lightgray;
padding: 20px;
}
.highlight {
color: blue;
}
p {
line-height: 1.8;
}
p#special {
color: red;
font-size: 20px;
}
</style>
</head>
<body>
<div id="main">
<p class="highlight" id="special">这段文本继承了父元素的字体,但由于其具有 ID 选择器,文本颜色为红色。</p>
<p class="highlight">这段文本是蓝色的,因为类选择器优先级高于标签选择器。</p>
</div>
</body>
</html>在这个例子中,展示了继承性、特殊性和层叠性之间的综合作用。通过多个选择器的组合,我们可以看到不同的样式如何相互影响,并最终形成页面的样式效果。

理解和掌握 CSS 的三大特性是构建复杂、可维护和高效的样式表的关键。希望这篇文章能够帮助您更好地理解这些概念,并在实际项目中加以灵活应用。