跳转到内容

层叠样式表/重要

来自维基教科书,开放的书籍,开放的世界

important 关键字使声明优先于普通声明 - 那些没有标记 important 关键字的声明。所以 “p { color: red ! important }” 优先于 “p { color: green }”。

重要声明的语法是

属性: 值 ! important

规则的相对重要性也取决于它的来源: 是来自文档作者指定的样式表、用户指定的样式表还是用户代理指定的样式表。

声明从最不重要到最重要的顺序

  1. 用户代理声明
  2. 用户普通声明
  3. 作者普通声明
  4. 作者重要声明
  5. 用户重要声明

用户重要声明优先于其他所有声明。这允许用户覆盖页面设计者的演示以满足他们的需求。例如,用户可以将文本颜色覆盖为黑色背景上的黄色,并使用较大的字体以使文本更易阅读。

确定来自一个或多个样式表中的哪个规则适用于给定元素的过程称为级联,因此得名层叠样式表

级联的例子

[编辑 | 编辑源代码]

用于此示例的 HTML 文档是

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
 <head>
  <title>'!important' CSS declarations</title>
  <link rel="stylesheet" type="text/css" href="style.css">
 </head>
 <body>
  <p>Paragraph 1.</p>
  <p id="para2">Paragraph 2.</p>
  <p>Paragraph 3.</p>
 </body>
</html>

该文档使用样式表 style.css 进行样式设置

p {
  background-color:#fff ;
  color:#000 ! important
}

#para2 {
  background-color:#fc9 ;
  color:#00f ;
  border:1px solid black
}

p {
  background-color:#9cf ;
  color:#f00
}

这三段将如何呈现?

第一段

[编辑 | 编辑源代码]

考虑第一个段落元素 (

段落 1。

).

第一个和第三个选择器 (p 选择器) 匹配该元素。第二个选择器 (#para2) 不匹配该元素。与该元素匹配的两个选择器的规则将应用于该元素。规则按它们在源代码中出现的顺序列出,如下所示:

声明 选择器 权重
特异性
属性 重要性* 样式
属性
ID
选择器

选择器
元素
选择器
来源
顺序**
background-color #fff p 作者普通
(排名 3)
0 0 0 1 1
color #000 p 作者重要
(排名 4)
0 0 0 1 2
background-color #9cf p 作者普通
(排名 3)
0 0 0 1 6
color #00f p 作者普通
(排名 3)
0 0 0 1 7
* 重要性的排名从 1 (最不重要) 到 5 (最重要)。此页面的后续示例展示了其他排名。
** 来源顺序列是声明在文件中的位置,例如 background-color:#9cf 是文件中的第六个声明。

应用于该元素的规则按属性排序。对于每个属性,规则按重要性升序排序,然后按特异性 (样式属性、ID 选择器、类选择器、元素选择器) 排序,最后按来源顺序排序。排序列表中的最后一个属性值获胜 (即,最重要的、最具体的规则的值)。

声明 选择器 权重
特异性
属性 重要性 样式
属性
ID
选择器

选择器
元素
选择器
来源
顺序
background-color #fff p 作者普通
(排名 3)
0 0 0 1 1
background-color #9cf p 作者普通
(排名 3)
0 0 0 1 6
color #00f p 作者普通
(排名 3)
0 0 0 1 7
color #000 p 作者重要
(排名 4)
0 0 0 1 2
使用的声明以粗体显示,以及决定规则之间决胜负的获胜者。

background-color 设置为 #9cf (浅蓝色)。background-color 属性的两个规则具有相同的权重和特异性,因此第二个规则获胜,因为它在源代码中出现得更晚。

color 设置为 #000 (黑色)。color 属性的规则具有不同的权重,因此最重要的规则获胜。

第一段渲染为

段落 1。

第二段

[编辑 | 编辑源代码]

考虑第二个段落元素 (

段落 2。

).

第一个和第三个选择器 (p 选择器) 匹配该元素。第二个选择器 (#para2) 也匹配该元素。所有三个选择器的规则都应用于该元素。规则按它们在源代码中出现的顺序列出,如下所示:

声明 选择器 权重
特异性
属性 重要性 样式
属性
ID
选择器

选择器
元素
选择器
来源
顺序
background-color #fff p 作者普通
(排名 3)
0 0 0 1 1
color #000 p 作者重要
(排名 4)
0 0 0 1 2
background-color #fc9 #para2 作者普通
(排名 3)
0 1 0 0 3
color #00f #para2 作者普通
(排名 3)
0 1 0 0 4
border 1px solid black #para2 作者普通
(排名 3)
0 1 0 0 5
background-color #9cf p 作者普通
(排名 3)
0 0 0 1 6
color #00f p 作者普通
(排名 3)
0 0 0 1 7

对规则进行排序得到

声明 选择器 权重
特异性
属性 重要性 样式
属性
ID
选择器

选择器
元素
选择器
来源
顺序
background-color #fff p 作者普通
(排名 3)
0 0 0 1 1
background-color #9cf p 作者普通
(排名 3)
0 0 0 1 6
background-color #fc9 #para2 作者普通
(排名 3)
0 1 0 0 3
border 1px solid black #para2 作者普通
(排名 3)
0 1 0 0 5
color #00f #para2 作者普通
(排名 3)
0 1 0 0 4
color #00f p 作者普通
(排名 3)
0 0 0 1 7
color #000 p 作者重要
(排名 4)
0 0 0 1 2

background-color 设置为 #fc9 (浅橙色)。具有 ID 选择器的规则的特异性高于其他两个规则,因此它获胜。

border 属性只有一个规则,因此它设置为 1px solid black

color 设置为 #000 (黑色)。color 属性的规则具有不同的权重,因此最重要的规则获胜。

第二段渲染为

段落 2。

第三段

[编辑 | 编辑源代码]

第三段与第一段匹配完全相同的选择器,因此应用完全相同的值。

第三段渲染为

段落 3。

段落 1。

段落 2。

段落 3。

带有用户样式表的例子

[编辑 | 编辑源代码]

在这个例子中,我们将检查当以下用户样式表 user.css 与前一个示例中的样式表组合时,前一个示例中文档的外观是如何改变的。(有关如何设置用户样式表的更多信息,请参见章节 用户样式表。)

p {
  color:#ff0 ! important ;
  background-color:#808080 ;
  font-family:cursive
}

考虑第一个段落元素。用户样式表中的单个选择器匹配该元素。来自 style.css 的第一个和第三个选择器 (p 选择器) 也匹配该元素。来自 style.css 的第二个选择器 (#para2) 不匹配该元素。应用于该元素的规则按它们在源代码中出现的顺序列出,如下所示:

声明 选择器 权重
特异性
属性 重要性* 样式
属性
ID
选择器

选择器
元素
选择器
来源
顺序**
color #ff0 p 用户重要
(排名 5)
0 0 0 1 1:1
background-color #808080 p 用户普通
(排名 2)
0 0 0 1 1:2
font-family cursive p 用户普通
(排名 2)
0 0 0 1 1:3
background-color #fff p 作者普通
(排名 3)
0 0 0 1 2:1
color #000 p 作者重要
(排名 4)
0 0 0 1 2:2
background-color #9cf p 作者普通
(排名 3)
0 0 0 1 2:6
color #00f p 作者普通
(排名 3)
0 0 0 1 2:7
* 重要性的排名从 1 (最不重要) 到 5 (最重要)。请注意,来自用户样式表的规则的排名要么是普通声明的 2,要么是重要声明的 5。
** 来源顺序列中的第一个数字表示包含该规则的文件加载的顺序。在本例中,user.cssstyle.css 之前加载。第二个数字是声明在文件中的位置。例如,background-color:#9cf 是第二个文件中的第六个声明。

对规则进行排序得到

声明 选择器 权重
特异性
属性 重要性* 样式
属性
ID
选择器

选择器
元素
选择器
来源
顺序**
background-color #808080 p 用户普通
(排名 2)
0 0 0 1 1:2
background-color #fff p 作者普通
(排名 3)
0 0 0 1 2:1
background-color #9cf p 作者普通
(排名 3)
0 0 0 1 2:6
color #00f p 作者普通
(排名 3)
0 0 0 1 2:7
color #000 p 作者重要
(排名 4)
0 0 0 1 2:2
color #ff0 p 用户重要
(排名 5)
0 0 0 1 1:1
font-family cursive p 用户普通
(排名 2)
0 0 0 1 1:3

background-color 属性有两个规则具有相同的最高权重。这两个规则也具有相同的特异性,因此它们按来源顺序拆分。背景颜色设置为作者的选择,而不是用户的选择。

用户样式表中 color 的重要声明对于此属性具有最高的权重,因此使用用户选择的文本颜色,而不是页面作者的选择。

font-family 只有一个规则,那就是用户的规则,因此使用用户的选择。

这些段落渲染为

段落 1。

段落 2。

段落 3。

Internet Explorer !important 错误

[编辑 | 编辑源代码]

此错误已知在 Windows XP 上的 Internet Explorer 6.0 和 7.0 版本中出现;但 8.0 版本不受影响。

Internet Explorer 处理 !important 存在一个错误。如果一个属性的重要声明紧随一个相同属性的普通声明,并且都在同一个块中,Internet Explorer 会将这两个声明都视为普通声明。例如,在 IE v6.0 中,以下样式表错误地将段落渲染为黄色在红色上。段落应该是白色在黑色上,因为前两个声明是重要的。

p {
  background-color: black ! important ;
  color: white ! important;
  background-color: red ;
  color: yellow
}

您可以通过在样式表中添加一个额外的规则来验证声明是否恢复为普通。

p {
  background-color: black ! important ;
  color: white ! important;
  background-color: red ;
  color: yellow
}

p {
  color: green
}

在 IE v6.0 中,这将产生绿色在红色上,表明所有 color 声明都被视为普通声明。

如果您从第一个块中删除第二个 color 声明

p {
  background-color: black ! important ;
  color: white ! important;
  background-color: red ;
}

p {
  color: green
}

段落将变为白色在红色上。这表明第一个块中的 color 声明现在正确地被视为重要声明。

许多人建议利用这个错误来传递不同的值给 Internet Explorer,与传递给其他浏览器的值不同。如果您需要这样做,一个更好的解决方案是使用条件注释

华夏公益教科书