层叠样式表/继承规则
概述
术语CSS 层叠指的是决策过程,即 Web 浏览器中用于确定将哪些层叠样式表 (CSS) 样式应用于网页每个部分的软件。它很复杂,因为样式是在很多地方编写的。存在错误、冲突和重复,更不用说始终存在的浏览器、用户和作者权限的层次结构。尽管如此,浏览器的软件必须决定对页面上的每个格式使用哪个样式,并且即使没有提供任何有用的样式,也必须构建一个合理的页面。
本页提供层叠的基本过程的概述和详细示例,虽然它能够在过程中传达详细的知识,但并非专门用于教授网页或其样式表的制作。
在描述层叠的工作原理之前,它本质上只是浏览器功能的一部分,最好回顾一下浏览器周围环境的基本特征。
- 网页是使用.htm后缀打开特定文本文件的结果。该文件可以使用简单的文本编辑器编写。它位于作为服务器工作的远程计算机上,但也可以位于个人计算机 (PC) 的某个文件夹中。当它的地址提供给浏览器时,该文件将被下载到浏览器缓存,这是 PC 上的一个临时存储位置。.htm 文件有时被称为网页文档。
- 网页文档中包含一些标记,以帮助格式化,Web 浏览器的作用就是应用样式。网页文档包含一对称为标记的标记,它们围绕着要格式化的文本。这些标记通过说明它是哪种页面结构来间接标识格式;例如,列表(<li></li>)、主标题(<h2></h2>)、副标题(<h3></h3>)、普通段落(<p></p>),或者可能是表格单元格(<td></td>)。页面中的所有这些不同的元素都可以有不同的格式。
- 这些标记是HTML(超文本标记语言)语言的一部分,尽管也可以使用其他语言。网页中的标记名称,例如<p>中的p,在样式表中列出,单独或与其他术语一起列出,正是这些样式表选择器列出了预期格式的描述。也就是说,浏览器可以找到用于格式化元素的正确样式表选择器,因为它们的名称是可预测的相似。文档元素被称为该选择器样式的预期目标。列出这些格式的文件类型称为层叠样式表 (CSS)。
- 样式表只是一个带有.css后缀的文本文件,可以使用简单的文本编辑器编写。作者样式表通常位于与网页文档相同的文件夹中,无论它在哪里。无论如何,样式表的名称和地址由网页文档中的一个条目提供,因此它会在文档本身下载到浏览器缓存后不久就下载。事实上,那里可能列出了几个样式表,并且每个样式表都会在处理其样式之前导入和处理,依此类推。
- PC 用户也可以更改样式。但他用户样式表位于本地计算机上。浏览器将此表与所有其他样式合并,因此两组样式可能都会影响页面的某些部分。当然,用户样式仅影响本地显示,其他人看不到。
- 还有其他地方可以找到样式。它们有时被写入网页文档的标题部分,以及页面上标记内的内联样式。浏览器也有自己的样式表,即用户客户端表,在其他样式表丢失时提供基本布局。有时浏览器的默认设置和内置样式表也会影响结果。浏览器会合并所有这些来源的样式。
- 作者样式由三个来源组成。它们是:直接写入网页文档标题部分的样式,标题部分中引用的链接样式表,以及页面主要内容中的内联样式。有时,这些链接样式表中的列表本身会导入更多样式表。
- 某些样式可能比其他样式具有更高的重要性。在任何样式位置(包括文档本身)编写的样式都可以具有特殊的!important标记,以将它们与普通样式区分开来。这些标记允许作者或用户覆盖普通样式。此功能在测试中特别有用,或者用于断言内置浏览器样式优先于其他样式。在!important和普通样式中,还有不同的等级,由它们被发现的位置决定,即它们的来源(稍后详细说明)。
- 某些样式比其他样式具有更高的特异性。样式表选择器缺乏通用性或具有狭窄定义的程度被称为特异性。例如,文档中的一些段落可能只是文档主体的一部分,并且其段落样式适用于一般情况。其他一些段落可能需要特殊格式,因为它们位于例如表格单元格中。浏览器可以检测到这种更具体的标记布局,并优先考虑最匹配它的选择器。特异性在层叠的决策过程中很重要,并且它的规则已经发展到了相当大的程度(稍后详细说明)。
- 样式表格式具有一些共同特征。图 1 显示了样式表中可能存在的典型样式块布局。其中,选择器是样式声明集的主要标签,每个声明都包含一个属性和一个值。在示例中,样式表的选择器称为div ul,它有两个样式声明;一个用于line-height的属性具有1.8em的值;另一个用于background的属性具有darkgreen的值。可能的选择器数量不限于单个标记名称,因为正如示例所示,这些选择器可以被复合以表示一组标记在另一组标记内的嵌套。在示例中,此选择器将其样式应用于嵌套在 division (div) 标记对内的每个无序列表,但不应用于它找到的其他无序列表示例。引入类和id可以为选择器使用添加更大的特异性。
- Web 标准和规范由万维网联盟 (W3C) 和其他人管理。对于 CSS 样式,新的标准会定期作为建议发布。这些标准在浏览器的测试版中进行测试,并收集发现的差异和不足之处。最终发布新的建议。可以在下面的另请参阅链接中找到各种 W3C 教程和规范。
图 1:CSS 术语,用于典型的样式表条目,即样式规则。它描述了格式 用于一对 division (div) 块元素标记中嵌套的任何无序列表。 花括号之间声明的组合称为声明块。 |
本节提供的是对级联过程的直观描述,而不是详细描述。对于已经理解这些内容的人来说,最好直接跳到详细级联示例部分,那里的内容可能更符合他们的口味。无论如何,对于需要学习或提醒自己选择器和特异性的人来说,本节CSS 教程提供了教程。对于想要深入了解 HTML 的人来说,可以参考W3Schools HTML,这是一个广泛的外部参考;对于 CSS,可以参考W3Schools CSS。
继续,浏览器会逐个标签遍历网页,以确定它们的样式。为此,它首先会识别嵌套,即标签所在的文档树的一部分。这有助于浏览器检查它找到的选择器的有效性。然后,它会搜索所有样式来源,包括样式表和文档本身,寻找可能影响目标标签的选择器,同样,还要考虑到标签布局。如果选择器适用,其样式属性将按发现顺序列出,最终将生成一个适用于该特定标签的长属性列表。列表中可能包含许多已声明的样式,也可能一个都没有,具体取决于不同作者的工作情况,很明显,大多数可能为该标签声明的属性仍然不存在。
样式声明可以添加特殊标记,使其优先于普通声明,它们使用!Important关键字来标识。它们被称为重要声明。在排序其列表时,浏览器会将 !important 声明与任何普通声明分开。然后,浏览器会识别图 2 中的五个重要性等级或重要性层级,其中等级 1的优先级最低,等级 5的优先级最高。
等级 1 | 浏览器默认样式 列在用户代理 (UA) 样式表或等效实现中的样式。 |
等级 2 | 用户普通样式声明 用户样式表中没有 !Important 标记的样式。来自特定网站和内置样式表的普通声明也可以合并到这里。 |
等级 3 | 作者普通样式声明 作者集没有 !Important 标记的样式。 它们包括来自文档头部、链接样式表和内联样式的样式。 |
等级 4 | 作者 !Important 样式声明 作者集有 !Important 标记的样式。 它们包括来自文档头部、链接样式表和内联样式的样式。 |
等级 5 | 用户 !Important 样式声明 用户样式表中有 !Important 标记的样式。 来自特定网站和内置样式表的 !Important 声明也可以合并到这里。 |
列表中的每个属性条目都标有一个重要性等级,具体取决于选择器的来源以及它是否是普通声明还是重要声明。这些条目还标有它们的特异性,即反映其应用范围窄度的加权值。会记录每个来源位置,这是一个标记,用于标识其发现位置及其在样式表中的位置。
然后对数据集进行排序,将所有相似的属性分组,然后在找到的任何相似集合中(例如,十个不同的字体大小建议),进一步对其进行排序,以确定最高重要性。在进行这些排序后,对于任何竞争激烈的集合,再次按最高特异性进行排序,以最终隔离列表中每个不同属性的值。如果两个声明仍然匹配,最后决定的排序依据是它们在来源位置中发现的顺序;也就是说,最后考虑用于列表的那个声明将胜出。图 3 的图形描述了级联样式在解析单个段落标签格式时的参与,其细节与后面部分中的详细示例相同。
在确定哪些格式适用于特定标签后,浏览器会对页面上的每个标签重复此过程,然后使用其渲染引擎应用所有格式。
需要强调的重要一点是,在创建其属性列表时,浏览器始终按其从网页顶部到底部、从每个样式表顶部到底部的遍历过程中遇到的确切顺序创建列表。它还会在添加列表项时遵守在网页标题中找到的样式顺序。此方法对浏览器解决来源顺序作为决定因素的冲突具有影响。请再次记住,所有这些列表活动都是针对页面上的每个标签对进行的。
级联后
[edit | edit source]级联完成后,原始已声明样式集将缩减为级联样式集,但许多属性在第一步中根本没有声明。为了使浏览器正常工作,必须为每个被视为必不可少的元素格式属性提供一个值。浏览器通过默认操作来填补这些巨大的空缺。对于每个缺失的必要属性,它首先尝试从父元素(即围绕它的标签)继承一个合适的值;如果由于某种原因无法实现,浏览器会分配一个初始值。属性初始值在设计时预设在属性定义列表中。应用这些默认值的结果是为每个正在考虑的标签生成一组完整的指定值,其中包含每个所需的属性。
下一阶段是通过考虑例如任何相对大小来从指定值生成计算值。例如,1em 的字体大小需要通过将其与某个参考点关联来转换为像素值。对集合进行一些进一步调整后,将生成使用值,然后在页面渲染中进行尝试。这些值可能会进一步调整以适应布局约束或对字体大小进行舍入,此时它们被称为实际值。
级联详情
[edit | edit source]为了更详细地理解级联过程,下面准备了一个示例部分。其中,可以研究来源样式表本身以及用于示例的文档。假定浏览器正在尝试解析文档第一个段落标签的样式。适用于该标签的样式表声明已用绿色突出显示,以帮助读者理解该过程。
该嵌套的所有选定属性,包括它们的优先级、特异性和在来源中的位置,都已输入到此页面上的可排序表格中。读者只需关注各种列表,并使用表格上的按钮对其进行排序,即可看到解决这些选择的过程。
示例的样式来源
[edit | edit source]
|
|
|
|
级联排序表格
[edit | edit source]下表 1 列出了示例文档中第一个段落标签的所有属性,它们按发现的从上到下顺序排列。
- 首先,用户样式表user.css按从上到下顺序排列。(1:1 到 1:6;六个属性作为第一个要考虑的来源)。
- 然后是头部样式,因为它们位于文档上方样式表链接。(2:1 到 2:4)
- 接下来是作者样式表main.css;(这些标记为 2:5 到 2:13)。
- 然后添加了两个内联样式作为项目(2:14 到 2:15)。
- 浏览器的客户端样式表也参与其中,因此它们最后添加。(3:1 和 3:2)。
这 23 个项目可以在表 1 中看到。
要确定这许多竞争样式中的哪些将最终用于第一个段落,可以使用模拟级联行为的排序模型。其作用是对项目进行排序
- 首先按属性名称排序
- 然后按重要性排序
- 然后按特异性排序,分为四个步骤
- 然后,无须排序来源顺序
表 1 以页面自然来源顺序打开,读者可以对它进行排序,以查看每个步骤如何影响级联。
排序完成后,将选择这些项目,就像它们构成集合一样
p{
background:beige;
border:1px solid lightgrey;
color: black;
display: block;
font-family: Tahoma;
font-size: 30px;
font-style: normal;
font-weight: bold;
margin: 1em 0;
padding:1.5em;
}
要将列出的样式集排序为合格的少数样式,首先不使用shift键对属性列进行排序,方法是按下其列标题中的箭头;然后,按照相同的方式对其余可排序列从左到右进行排序,但要按下shift键。这会将选择项带到其不同属性集的底部或顶部,具体取决于用户是升序排序还是降序排序。为了帮助初次使用,将选择项用蓝色标记.
声明 | 权重 | |||||||
---|---|---|---|---|---|---|---|---|
特异性 | ||||||||
属性 | 值 | 选择器 | 重要性 | 样式 属性 |
ID 选择器 |
类 选择器 |
元素 选择器 |
来源 顺序 |
字体大小 | 30px | p | (排名 5) 用户重要 | 0 | 0 | 0 | 1 | 1:1 |
字体系列 | Tahoma | .Tahoma | (排名 5) 用户重要 | 0 | 0 | 1 | 0 | 1:2 |
字体系列 | Times | #para1 | (排名 2) 用户普通 | 0 | 1 | 0 | 0 | 1:3 |
颜色 | 蓝色 | #para1 | (排名 2) 用户普通 | 0 | 1 | 0 | 0 | 1:4 |
字体样式 | 斜体 | #para1 | (排名 2) 用户普通 | 0 | 1 | 0 | 0 | 1:5 |
字体粗细 | 普通 | #para1 | (排名 2) 用户普通 | 0 | 1 | 0 | 0 | 1:6 |
字体大小 | 2em | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:1 |
字体系列 | Courier | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:2 |
背景 | 绿色 | .toppara | (排名 3) 作者普通 | 0 | 0 | 1 | 0 | 2:3 |
边框 | 1px 实线 淡灰色 | .toppara | (排名 3) 作者普通 | 0 | 0 | 1 | 0 | 2:4 |
字体系列 | Calibri | #para1.Tahoma | (排名 4) 作者重要 | 0 | 1 | 1 | 0 | 2:5 |
颜色 | 黑色 | #para1.Tahoma | (排名 4) 作者重要 | 0 | 1 | 1 | 0 | 2:6 |
字体样式 | 普通 | #para1.Tahoma | (排名 4) 作者重要 | 0 | 1 | 1 | 0 | 2:7 |
字体系列 | Garamond | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:8 |
字体大小 | 20px | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:9 |
字体粗细 | 粗体 | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:10 |
背景 | 白色 | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:11 |
填充 | 10px | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:12 |
背景 | 米色 | .mostparas | (排名 3) 作者普通 | 0 | 0 | 1 | 0 | 2:13 |
字体系列 | arial | p 内联 | (排名 3) 作者普通 | 1 | 0 | 0 | 0 | 2:14 |
填充 | 1.5em | p 内联 | (排名 3) 作者普通 | 1 | 0 | 0 | 0 | 2:15 |
显示 | 块级 | p | (排名 1) 浏览器客户端 | 0 | 0 | 0 | 1 | 3:1 |
边距 | 1em 0 | p | (排名 1) 浏览器客户端 | 0 | 0 | 0 | 1 | 3:2 |
- 请注意,在正确排序的表格中,大多数示例都是根据其排名顺序选择的,或者换句话说,是根据其重要性选择的。
- 然而,背景属性并非通过重要性或特指性来解析,因为这些属性对于该集合中的每个背景属性都是相同的。它们仅通过源顺序来选择,也就是说,它们被列出的顺序。
- 另一方面,填充属性的两个列表具有相同的重要性,但在特指性方面有所不同。来自内联样式的那个是根据这个基础选择的。
- 请注意,在上述层次结构中,带有 !Important 关键字标记的用户样式具有最高的优先级,并且它们只能通过省略来失败。也就是说,可以使用其他样式,但仅当那里没有指定格式时才可以使用。一般来说,选择来代表级联中的源级别的样式,只有在比它更重要的源没有设置自己的值时,才能对最终结果产生影响。图 3 的图形以比排序表更直观的方式显示了这一点,但它显示了相同的示例。
- 关于此选择过程,一个不太明显的点可能是,带有!important 标记的声明不需要高特指性来胜出。也就是说,虽然!important 声明在其自身源排名中按特指性排序,但完全有可能一个低特指性的声明会被选择来代表其排名。然后,由于排名源的优先级,低特指性项可以胜过一个特指性更高但优先级更低的项。这为!important 声明提供了非常广泛的范围,而且由于它们确实如此,在使用中尽量缩小它们的特定性至关重要。例如,作者样式表中高特指性的普通声明仍然可以被低特指性声明覆盖
div table tr td p {color:red} /* for a paragraph in a cell of a row of a table in a division block */
除了影响特定示例外,此后一个声明还会对所有具有正常优先级的段落声明产生影响。p{color:green !important} /* for a paragraph wheresoever found on the page */
- 从可能过少的數據中概括而言,可以說,声明的排名位置赋予其越重要的权重,如果它们不想在范围上变得过于霸道,就需要越注意缩小它们的特定性。
下面提供了一些简短的教程。目的是提供一些简短的片段来指导主题基础知识,而不是进行冗长的讨论。有一个关于样式表选择器使用的列表,以及对特指性和其他一些内容的解释。
对于那些打算通过更改样式表和网页内容来学习 CSS 的人来说,最好提醒一下关于文件缓存的标准内容。
- 当浏览器首选项(选项)更改时,通常需要重新启动浏览器才能使其生效。
- 当网页或样式表更改时,除非先清除浏览器缓存并重新加载页面,否则不太可能看到预期的更改。如果忽略这一点,可能会造成很大的混乱。每个浏览器的缓存清除方法都不同,但通常在浏览器的首选项(选项)中有一个功能。有时,下拉菜单项可以提供更快的缓存清除,但在其他情况下,可能需要将选项设置为在关闭时清除缓存,然后重新启动浏览器以显示更改。对于 Opera 浏览器,清空浏览器缓存的最便捷方法是使用下拉菜单项工具/删除私人数据...
|
计算特异性
[edit | edit source]样式声明特异性
[edit | edit source]特异性指的是声明缺乏通用性的程度;它应用于页面上的某个标签的程度,而不是应用于通用标签的程度。确定特异性方法的开发已相当完善。
使用的方法计算一个加权和来表示特异性。计算特异性的方法如下
对于任何给定的样式表条目,检查它的选择器,例如,div.p
。选择器有时很简单,只有一个元素,或者像这样,很复杂,有多个元素。通过以下方式为其特异性构建一个值,并将其添加到总计中
- 对于通用选择器 (*) 或继承的值,将零添加到特异性总计中。
- 对于内联样式,将 1000 添加到总计中。这些样式只存在于文档中。
- 对于每个提到的 ID 选择器,将 100 添加到总计中。
- 对于每个类、伪类或属性,将 10 添加到总计中。.
- 对于每个简单的标签元素和伪元素,将 1 添加到总计中。
在同一级别内,竞争样式声明中特异性最高的值将代表该级别在整体级联中的地位。(参见主页面中的图形)。
特异性 - 计算示例
[edit | edit source]p { }
|
总计=1,因为选择器中只有一个简单的标签元素。 |
div p { }
|
总计=2,因为有两个标签元素 (2)。 |
p.topsection { }
|
总计=11,因为有一个标签元素 (1),加上一个类 (10)。 |
#toppara { }
|
总计=100,因为有一个 ID 选择器 (100) |
div table p#green { }
|
总计=103,因为有三个标签选择器 (3),加上一个 ID (100)。 |
style="float:left;"
|
总计=1000,因为有一个内联样式 (1000) |
a:hover { }
|
总计=11,因为有一个标签元素 (1),加上一个伪类 (10)。 |
p:first-line { }
|
总计=2,因为有一个标签元素 (1),加上一个伪元素(1)。 |
p[title] { }
|
总计=11,因为有一个标签元素 (1),加上一个属性(10)。 |
样式继承
[edit | edit source]
|
|
|
- 层叠样式表级别 2 修订版 1 (CSS 2.1) 规范: 由万维网联盟 (W3C) 提供的关于 CSS 2.1 的 18 章描述。
- CSS 层叠和继承级别 3 : W3C 最后呼吁工作草案 2013 年 7 月 30 日。
- CSS 教程: W3C 的多页 CSS 参考,广泛用于 CSS 语法。
- Web 标准课程目录: 此页面包含资源,可帮助您教授或学习现代 Web 开发。
- Opera 用户客户端样式表: 为版本 10 发布,但似乎此后没有发布。
- Firefox 用户客户端样式表
- Internet Explorer 用户客户端样式表
- Opera Dragonfly 简介: Dragonfly 是 Opera 内置的 Web 开发人员套件。
- Opera 12.16 中的样式演示模式