CSS(层叠样式表)的继承性和层叠性是 CSS 的核心特性,理解它们对于编写高效、可维护的样式表至关重要。下面详细说明这两个概念:
1. CSS 的继承性(Inheritance)
1.1 什么是继承性?
继承性是指子元素会继承父元素的一些样式属性。
1.2 可继承的属性
以下是一些常见的可继承属性:
- 字体相关属性:
font-familyfont-sizefont-weight
- 文本相关属性:
text-aligntext-indentline-heightcolor
- 列表相关属性:
list-stylelist-style-typelist-style-position
- 其他属性:
visibilitycursor
1.3 不可继承的属性
以下是一些常见的不可继承属性:
- 盒模型相关属性:
widthheightmarginpaddingborder
- 定位相关属性:
positiontopleftrightbottom
- 背景相关属性:
background-colorbackground-image
1.4 继承性的应用
<div class="parent">
<p>这是一个段落。</p>
</div>
.parent {
color: blue; /* 可继承属性 */
font-size: 16px; /* 可继承属性 */
border: 1px solid red; /* 不可继承属性 */
}
<p>元素会继承color和font-size,因此文本颜色为蓝色,字体大小为 16px。<p>元素不会继承border,因此不会有边框。
1.5 强制继承
如果希望某个不可继承的属性也能继承父元素的值,可以使用 inherit 关键字:
.child {
border: inherit; /* 强制继承父元素的 border */
}
2. CSS 的层叠性(Cascading)
2.1 什么是层叠性?
层叠性是指当多个 CSS 规则作用于同一个元素时,浏览器会根据一定的优先级规则来决定最终应用的样式。层叠性是 CSS 的核心特性之一,它使得样式表可以灵活地覆盖和组合。
2.2 层叠性的规则
层叠性的优先级由以下因素决定(优先级从高到低):
- 来源(Origin):
- 用户代理样式(浏览器默认样式) < 用户样式 < 作者样式(开发者写的样式)。
!important可以提升优先级。
- 选择器权重(Specificity):
- 选择器的权重越高,优先级越高。
- 权重计算规则:
- 内联样式(
style=""):1000 - ID 选择器(
#id):100 - 类选择器(
.class)、属性选择器([type="text"])、伪类(:hover):10 - 元素选择器(
div)、伪元素(::before):1 - 通配符(
*)、组合符(+,~,>):0
- 内联样式(
- 源代码顺序(Order):
- 如果权重相同,后定义的样式会覆盖前面的样式。
2.3 层叠性的应用
<div id="box" class="container" style="color: green;">Hello, World!</div>
/* 规则 1 */
#box {
color: red; /* 权重:100 */
}
/* 规则 2 */
.container {
color: blue; /* 权重:10 */
}
/* 规则 3 */
div {
color: yellow; /* 权重:1 */
}
- 最终文本颜色为 绿色,因为内联样式的优先级最高。
- 如果没有内联样式,文本颜色为 红色,因为 ID 选择器的权重高于类选择器和元素选择器。
2.4 !important 的作用
!important 可以提升样式的优先级,覆盖其他规则:
.container {
color: blue !important; /* 优先级最高 */
}
- 即使有内联样式或更高权重的选择器,
!important也会强制应用该样式。
3. 继承性和层叠性的综合应用
3.1 继承性与层叠性的结合
- 继承性决定了某些样式是否可以从父元素传递到子元素。
- 层叠性决定了当多个样式规则冲突时,哪个规则会被应用。
3.2 示例
<div class="parent">
<p class="child">这是一个段落。</p>
</div>
.parent {
color: blue; /* 可继承属性 */
font-size: 16px; /* 可继承属性 */
}
.child {
color: red; /* 覆盖继承的 color */
font-size: inherit; /* 显式继承 font-size */
}
<p>元素的color为红色(覆盖了继承的蓝色)。<p>元素的font-size为 16px(显式继承了父元素的值)。
4. 总结
-
继承性:
- 某些属性会从父元素传递到子元素。
- 可继承属性包括字体、文本、列表等。
- 不可继承属性包括盒模型、定位、背景等。
- 使用
inherit可以强制继承不可继承的属性。
-
层叠性:
- 多个样式规则冲突时,浏览器会根据优先级规则决定最终样式。
- 优先级由来源、选择器权重和源代码顺序决定。
!important可以提升优先级。
内联样式(
style="")> ID 选择器(#id)> 类选择器(.class)> 元素选择器(div)> 通配符
继承性对优先级造成的影响
- 如果不能直接选中子元素,而是通过继承性影响子元素的话,遵循就近原则,谁描述的近听谁的。
- 如果描述的一样近,比较选择器权重,如果权重一样重,谁写在后面听谁的。
组件渲染顺序对优先级造成的影响
- 组件的加载顺序是自上而下的,也就是先加载父组件,再递归地加载其所有的子组件。
- 组件渲染顺序是按照深度优先遍历的方式,也就是先渲染最深层的子组件,再依次向上渲染其父组件。
- 选择器权重相同时,父组件样式的优先级高。
scoped对优先级的影响
- 选择器权重相同时,加scoped的优先级更高。