网站

CSS 层叠与继承 | MDN

CSS 优先级

引入

在实际开发中,一个元素可能会被多条 CSS 规则同时选中,这些规则可能设置了相同的属性但不同的值。

例如,一个段落可能被元素选择器 p、类选择器 .text、ID 选择器 #intro 同时选中,它们都设置了文字颜色,那么最终应该显示哪个颜色?

CSS 优先级规则就是用来解决这种冲突的。

正文

定义

内联、内部、外部优先级和选择器优先级

内联 内部 外部样式

内联样式优先级最高,内部和外部样式其次,例如:

<head>
	<style>
		p {
			color: orange;
		}
	</style>
	<link rel="stylesheet" href="优先级.css">
</head>
<body>
	<p style="color: red;">color</p>
</body>

优先级.css

p
{
	color: green;
}

最后看到的文本颜色为 red

选择器优先级

ID 选择器优先级最高,类、伪类、属性选择器其次,元素选择器最低

通过添加 !important 赋予最高优先级,如 color: red !important;,写在分号前

继承

CSS 继承是指设置在父元素上的某些样式,会自动“传递”给它的子元素。

可以继承的(通常是文字相关的):

  • color(颜色)
  • font-family / font-size / font-weight(字体相关)
  • line-height(行高)
  • text-align(对齐方式)
  • visibility(可见性)

不可继承的(通常是布局相关的):

  • width / height(宽高)
  • margin / padding(间距)
  • border(边框)
  • background(背景)
  • position(定位)

属性

  1. inherit:强制继承。让原本不继承的属性也从父元素那拿值
  2. initial:重置。不管父元素是什么,直接变回浏览器默认的样子
  3. unset:不确定。如果该属性默认能继承就继承,不能继承就变回默认

特点

  • 内联样式(写在 style 属性中)优先级最高
  • ID 选择器优先级高于类选择器
  • 类选择器优先级高于元素选择器
  • !important 可以提升优先级,但不建议滥用
  • 相同优先级时,后写的样式会覆盖先写的样式
  • 继承的样式优先级最低,任何直接设置的样式都会覆盖继承的样式
  • 选择器越具体,优先级越高

注意事项

  • 尽量避免使用 !important,它会让优先级规则变得混乱
  • 如果样式冲突,先检查选择器优先级,再检查书写顺序
  • 内联样式虽然优先级高,但会让样式和 HTML 耦合,不利于维护
  • 继承的样式优先级很低,可以被任何直接设置的样式覆盖
  • 通配符选择器 * 的优先级为 0,最低
  • 优先级计算可以用 (内联, ID, 类/伪类/属性, 元素) 四元组表示,例如 (0, 1, 2, 1)

理解

可以把 CSS 优先级理解为”样式冲突的裁判规则”。

当多条 CSS 规则同时作用到一个元素时,浏览器需要知道应该听谁的。优先级规则就像一套等级制度:内联样式是最高级别,ID 选择器是高级别,类选择器是中级别,元素选择器是低级别。

如果两条规则的级别相同,那就按照”后来居上”的原则,后写的样式会覆盖先写的样式。

继承的样式优先级最低,因为它不是直接设置给这个元素的,而是从父元素那里”借来的”。

理解优先级的核心是:越具体的选择器,优先级越高#header .nav aa 更具体,所以优先级更高。

但也要注意,不要过度追求高优先级。如果发现需要频繁使用 !important 才能让样式生效,可能是选择器设计有问题,应该重新思考样式结构。

引出

理解了优先级之后,可以继续学习:

也可以学习 CSS 预处理器(例如 Sass、Less),它们提供了更灵活的样式组织方式,减少优先级冲突。