CSS 继承与层叠是 CSS 中最重要的概念之一,它们决定了样式如何应用到元素上。理解继承与层叠对于掌握 CSS 至关重要。
继承是指子元素自动继承父元素的某些样式属性。继承可以减少代码重复,提高代码的可维护性。
某些 CSS 属性是可以继承的,包括:
/* 文本相关属性 */
color {
color: #333;
}
font-size {
font-size: 16px;
}
font-family {
font-family: Arial, sans-serif;
}
line-height {
line-height: 1.6;
}
text-align {
text-align: center;
}
某些 CSS 属性是不可继承的,包括:
/* 盒模型属性 */
width {
width: 100%;
}
height {
height: 100px;
}
padding {
padding: 20px;
}
margin {
margin: 20px;
}
border {
border: 1px solid #333;
}
/* 背景属性 */
background-color {
background-color: #f5f5f5;
}
/* 继承的实际应用 */
body {
color: #333;
font-size: 16px;
font-family: Arial, sans-serif;
line-height: 1.6;
}
/* 子元素继承父元素的样式 */
.container p {
/* 继承 body 的 color、font-size、font-family、line-height */
}
.container h1 {
/* 继承 body 的 color、font-family、line-height */
/* 但 font-size 可能被覆盖 */
}
层叠是指当多个样式规则应用到同一个元素时,浏览器如何确定最终应用的样式。层叠考虑了样式的来源、优先级和特异性。
CSS 样式有三个来源:
/* 浏览器默认样式 */
/* 浏览器自动应用 */
/* 用户样式 */
/* 用户通过浏览器设置自定义样式 */
/* 作者样式 */
/* 网页开发者编写的样式 */
body {
color: #333;
}
样式的优先级从高到低为:
/* !important - 最高优先级 */
.text {
color: red !important;
}
/* 内联样式 */
<p style="color: blue;">文本</p>
/* ID 选择器 */
#text {
color: green;
}
/* 类选择器 */
.text {
color: yellow;
}
/* 标签选择器 */
p {
color: orange;
}
/* 通配符选择器 */
* {
color: purple;
}
特异性是指选择器的权重,用于确定当多个选择器应用到同一个元素时,哪个选择器的样式优先级更高。
特异性的计算规则:
/* 内联样式 - 特异性 1000 */
<p style="color: red;">文本</p>
/* ID 选择器 - 特异性 100 */
#text {
color: blue;
}
/* 类选择器 - 特异性 10 */
.text {
color: green;
}
/* 标签选择器 - 特异性 1 */
p {
color: yellow;
}
/* 通配符选择器 - 特异性 0 */
* {
color: orange;
}
/* 特异性 1 */
p {
color: red;
}
/* 特异性 10 */
.text {
color: blue;
}
/* 特异性 11 */
p.text {
color: green;
}
/* 特异性 100 */
#text {
color: yellow;
}
/* 特异性 101 */
p#text {
color: orange;
}
/* 特异性 110 */
#text.text {
color: purple;
}
/* 样式冲突 */
.text {
color: red;
}
.text {
color: blue;
}
/* 最终应用 blue,因为后定义的样式优先级更高 */
/* 特异性计算 */
p {
color: red; /* 特异性 1 */
}
.text {
color: blue; /* 特异性 10 */
}
p.text {
color: green; /* 特异性 11 */
}
#text {
color: yellow; /* 特异性 100 */
}
/* 最终应用 yellow,因为特异性最高 */
/* !important 的使用 */
.text {
color: red !important;
}
#text {
color: blue;
}
/* 最终应用 red,因为 !important 优先级最高 */
/* 不推荐 - 过度使用 !important */
.text {
color: red !important;
font-size: 16px !important;
}
/* 推荐 - 使用选择器提高特异性 */
.container .text {
color: red;
font-size: 16px;
}
/* 不推荐 - 使用标签选择器 */
p {
color: #333;
}
/* 推荐 - 使用类选择器 */
.text {
color: #333;
}
/* 不推荐 - 选择器过于复杂 */
.container .sidebar .menu .item .link {
color: #333;
}
/* 推荐 - 使用简单的类选择器 */
.link {
color: #333;
}
/* 推荐 - 利用继承 */
body {
color: #333;
font-size: 16px;
font-family: Arial, sans-serif;
line-height: 1.6;
}
/* 不推荐 - 重复设置样式 */
p {
color: #333;
font-size: 16px;
font-family: Arial, sans-serif;
line-height: 1.6;
}
h1 {
color: #333;
font-size: 32px;
font-family: Arial, sans-serif;
line-height: 1.6;
}
CSS 继承与层叠是 CSS 中最重要的概念之一:
记住以下几点: