跳转到内容

层叠样式表/重要

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

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 属性的两个规则具有相同的重要性 and 特指性,因此第二个规则获胜,因为它在源代码中出现得更晚。

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方面存在一个 bug。如果在同一个块中,一个重要声明的属性后面跟着一个普通声明的相同属性,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声明现在被正确地视为重要。

许多人建议使用这个 bug 作为一种向 Internet Explorer 传递不同于其他浏览器的值的方法。如果您需要这样做,一个更好的解决方案是使用条件注释.

华夏公益教科书