层叠样式表/继承规则
摘要
术语“CSS 层叠”指的是决策过程,即 web 浏览器内部的软件,它决定将许多层叠样式表 (CSS) 样式中的哪一个应用于网页的每个部分。这很复杂,因为样式是在许多地方编写的。存在错误、冲突和重复,更不用说浏览器、用户和作者权利的层次结构了。尽管如此,浏览器的软件必须决定对页面上的每个格式使用哪种样式,并且即使没有提供任何有用的样式,也必须构建一个合理的页面。
本页提供了一个基本层叠过程的概述和详细示例,虽然它能够在过程中传授详细的知识,但并非专门用于教授网页制作或样式表制作。
在描述层叠的工作原理之前,它基本上只是浏览器功能的一个“部分”,最好回忆一下浏览器环境的基本特征。
- 网页是使用具有.htm后缀的特定文本文件打开的结果。 该文件可以使用简单的文本编辑器编写。它驻留在作为服务器的远程计算机上,但也可以驻留在本地个人计算机 (PC) 的某个文件夹中。当它的地址提供给浏览器时,该文件将下载到浏览器缓存,即 PC 上的临时存储位置。.htm 文件有时被称为web 文档。
- web 文档中有一些标记,有助于格式化它, web 浏览器的作用就是应用样式。web 文档包含一对标记,称为标记,它们围绕着要格式化的文本。这些标记通过说明要使用哪种页面结构来间接标识格式;例如,列表(<li></li>)、主要标题(<h2></h2>)、子标题(<h3></h3>)、普通段落(<p></p>),或者可能是表格单元格(<td></td>) 。页面中所有这些不同的元素都可以具有不同的格式。
- 这些标记是HTML语言的一部分,超文本标记语言,尽管可以使用其他语言。web 页面中的标记名称,例如<p>中的p,在样式表中列出,单独或与其他术语一起列出,正是这些样式表选择器列出了预期的格式的描述。也就是说,浏览器可以找到正确的样式表选择器来格式化元素,因为它们的名称可以预测地相似。文档元素被称为该选择器样式的预期目标。列出这些格式的文件类型称为层叠样式表 (CSS)。
- 样式表只是一个具有.css后缀的文本文件,可以使用简单的文本编辑器编写。作者样式表通常位于与 web 文档本身相同的文件夹中,无论它在哪里。无论如何,样式表的名称和地址由 web 文档中的一个条目提供,因此它在文档本身之后不久便会下载到浏览器缓存中。实际上,那里可能列出了几个样式表,每个样式表都会被导入并处理其样式,然后才会进行下一个操作,依此类推。
- PC 用户也可以更改样式。但他的用户样式表驻留在本地计算机上。浏览器将此表与所有其他样式合并,因此两组样式都可能影响页面的某些部分。当然,用户样式仅影响本地显示,而不会被其他人看到。
- 还有其他地方可以找到样式。它们有时会写入 web 文档的头部部分,以及页面标记中的内联样式。浏览器也有自己的样式表,即用户客户端表,在其他样式表丢失时提供基本布局。有时,浏览器的默认设置和内置样式表也会影响结果。浏览器会将所有这些来源的样式合并。
- 作者样式由三个来源组成。 这些是;直接写入 web 文档头部部分的样式,头部部分引用的链接样式表,以及页面主要内容中的内联样式。有时,这些链接样式表中的列表本身可以导入更多样式表。
- 有些样式可能比其他样式具有更高的重要性。 在任何样式位置中编写的样式,包括文档本身上的样式,都可以具有特殊的!important标记,以将其与普通样式区分开来。这些标记允许作者或用户覆盖普通样式。此功能在测试中特别有用,或者用于在其他样式上断言内置浏览器样式。还有!important和普通样式中的不同级别,由它们发现的位置决定,即它们所谓的来源(稍后介绍)。
- 有些样式比其他样式具有更高的特异性。 样式表选择器缺乏普遍性或具有狭窄定义的程度称为特异性。例如,文档中的一些段落可能只是文档主体的一部分,并且它们的段落样式适用于一般情况。其他一些可能需要特殊格式,因为它们是位于表格单元格内的段落。浏览器可以检测到这种更具体的标记布局,并优先考虑最匹配它的选择器。特异性在层叠的决策过程中很重要,它的规则已经发展到相当大的程度(稍后介绍)。
- 样式表格式具有一些共同特征。。图 1 显示了样式表中可能存在的典型样式块布局。在其中,选择器是一组样式声明的主要标签,每个样式声明都包含一个属性和一个值。在示例中,样式表的选择器称为div ul,它有两个样式声明;一个用于line-height的属性具有1.8em的值;另一个用于background的属性具有darkgreen的值。可能选择器的数量并不限于单个标记名称,因为在示例中,这些可以复合以表示一组标记在另一组标记内的嵌套。在示例中,此选择器将其样式应用于嵌套在 div 标签对内的每个无序列表,但不应用于它找到的其他无序列表示例。引入类和ID可以为选择器使用增加更大的特异性。
- Web 标准和规范由万维网联盟 (W3C) 和其他人管理。对于 CSS 样式,新的标准会定期作为建议发布。这些标准在浏览器的测试版中进行测试,并收集到发现的不一致和缺陷。最终将发布新的建议。各种 W3C 教程和规范可以在下面的参见链接中找到。
图 1:CSS 术语,用于描述典型的样式表条目,即样式规则。它描述了格式 用于嵌套在划分块元素标签对内的任何无序列表。 花括号之间的声明分组称为声明块。 |
本节提供了层叠过程的直观描述,而不是详细描述。对于那些已经了解这些内容的人来说,最好直接跳到部分详细的层叠示例,在那里他们可能会更喜欢这项工作。无论如何,对于那些需要学习或提醒自己有关选择器和特异性的人来说,教程已在部分CSS 教程中提供。对于那些希望了解有关 HTML 更多内容的人来说,有一个广泛的外部参考可在W3 Schools HTML中找到,而对于 CSS,则可在W3 Schools CSS中找到。
为了继续,浏览器会逐个标签地遍历网页,以确定它们的样式。为此,它首先要识别标签所在的嵌套或文档树的一部分。这有助于浏览器检查它找到的选择器的有效性。然后,它会搜索所有样式来源,包括样式表和文档本身,以查找可能影响所讨论标签的选择器,同样,要记住标签布局。如果选择器适用,则会按发现顺序列出其样式属性,结果是适用于该特定标签的属性长列表。该列表中可能包含许多这样的声明样式,也可能没有,具体取决于各种编写者的工作,很明显,大多数可能已为该标签声明的属性仍然缺失。
样式声明可以有特殊的标记,以使它们比普通声明具有更高的优先级,它们使用!important关键字来标识。它们被称为重要声明。在排序其列表时,浏览器会将!important声明与任何普通声明隔离开来。然后,浏览器会识别图 2 中的五个重要性等级或重要性层级,其中等级 1的优先级最低,等级 5的优先级最高。
等级 1 | 浏览器默认样式 在用户代理 (UA) 样式表中或一些等效的实现中列出的样式。 |
等级 2 | 用户普通样式声明 用户样式表中没有!important 标记的那些样式。来自特定于网站和内置样式表的普通声明也可以合并到这里。 |
等级 3 | 作者普通样式声明 作者集合中没有!important 标记的那些样式。 它们包括来自文档头部、链接的样式表和内联样式的样式。 |
等级 4 | 作者!important 样式声明 作者集合中有!important 标记的那些样式。 它们包括来自文档头部、链接的样式表和内联样式的样式。 |
等级 5 | 用户!important 样式声明 用户样式表中有!important 标记的那些样式。 来自特定于网站和内置样式表的!important 声明也可以合并到这里。 |
列表上的每个属性条目都标记着五个重要性等级之一,具体取决于选择器的来源以及它是否为普通或重要声明。这些项目还标记着它们的特异性,这些特异性是反映其应用范围有多窄的加权值。每个来源位置都做了标记,该标记会标识发现的位置及其在样式表中的位置。
然后,对数据集进行排序,以对所有类似的属性进行分组,然后在找到的任何类似集合内(例如,十个不同的字体大小建议),进一步对它们进行排序,以获得最高的重要性。对于这些排序后的任何密切竞争的集合,再次按最高特异性对它们进行排序,以最终隔离列表中每个不同属性的值。如果两个声明仍然匹配,则最后一个决定性的排序是来源位置,它们是在其中找到的;也就是说,最后考虑用于列出的那个将胜出。图 3 的图形描绘了级联样式在解析单个段落标签格式时所涉及的级联,其详细信息与后面部分中的详细示例相同。
在确定了哪些格式适用于特定标签后,浏览器会对页面上的每个标签重复此过程,然后使用其渲染引擎应用所有格式。
需要注意的重要一点是,在创建其属性列表时,浏览器始终按从网页顶部到底部以及从它遇到的每个样式表顶部到底部的遍历顺序精确地创建列表。它还会在添加列表时遵循在网页标题中找到的样式序列。这种方法对浏览器解决来源顺序是决定性因素的冲突具有影响。请再次记住,所有这些列表活动都针对页面上的每个标签对进行。
级联运行完毕后,最初的声明样式集将被缩减为一个级联样式集,但许多属性最初并未声明。为了使浏览器正常运行,必须为每个被认为对该元素格式化必不可少的属性提供单个值。浏览器会使用其默认操作填补这些大的空缺。对于每个缺少的必不可少属性,它首先尝试从父元素(即,从围绕它的标签)继承合适的值;如果由于某种原因无法这样做,则浏览器会分配一个初始值。属性初始值是在设计时在属性定义列表中预设的。应用这些默认值的结果是创建了一个全面的指定值集,其中包括每个标签需要考虑的每个属性。
下一阶段是从指定值创建计算值,方法是考虑例如任何已引用的相对大小。例如,1em 的字体大小需要通过将其与某个参考点相关联来转换为像素值。对集合进行一些进一步的调整后,会生成使用值,这些值会在渲染页面时进行尝试。这些值可能会进一步调整以适应布局中的约束或对字体大小进行舍入,此时它们被称为实际值。
为了更详细地了解级联过程,下面准备了一个示例部分。在其中,可以研究源样式表本身和用于示例的文档。假设浏览器正在尝试解析文档中第一个段落标签的样式。应用于该标签的样式表声明以绿色突出显示,以帮助读者跟踪过程。
所有为此嵌套选择的选择属性、它们的重要性等级、特异性和在来源中的位置都已输入到此页面的一个可排序表格中。读者只需跟踪各种列表并使用表格上的按钮对其进行排序,即可了解解析这些选择的过程。
|
|
|
|
下面的表 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)。
可以在表 1 中看到这 23 个项目。
要解决这些众多竞争样式中的哪些将最终用于第一个段落,可以使用一个模拟级联行为的排序模型。它的作用是对项目进行排序
- 首先按属性名称
- 然后按重要性
- 然后按特异性,分四个步骤
- 然后,不必要地,按来源顺序
表 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 选择器 |
类 选择器 |
元素 选择器 |
来源 顺序 |
font-size | 30px | p | (排名 5) 用户重要 | 0 | 0 | 0 | 1 | 1:1 |
font-family | Tahoma | .Tahoma | (排名 5) 用户重要 | 0 | 0 | 1 | 0 | 1:2 |
font-family | Times | #para1 | (排名 2) 用户普通 | 0 | 1 | 0 | 0 | 1:3 |
color | blue | #para1 | (排名 2) 用户普通 | 0 | 1 | 0 | 0 | 1:4 |
font-style | italic | #para1 | (排名 2) 用户普通 | 0 | 1 | 0 | 0 | 1:5 |
font-weight | normal | #para1 | (排名 2) 用户普通 | 0 | 1 | 0 | 0 | 1:6 |
font-size | 2em | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:1 |
font-family | Courier | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:2 |
background | green | .toppara | (排名 3) 作者普通 | 0 | 0 | 1 | 0 | 2:3 |
border | 1px solid lightgrey | .toppara | (排名 3) 作者普通 | 0 | 0 | 1 | 0 | 2:4 |
font-family | Calibri | #para1.Tahoma | (排名 4) 作者重要 | 0 | 1 | 1 | 0 | 2:5 |
color | black | #para1.Tahoma | (排名 4) 作者重要 | 0 | 1 | 1 | 0 | 2:6 |
font-style | normal | #para1.Tahoma | (排名 4) 作者重要 | 0 | 1 | 1 | 0 | 2:7 |
font-family | Garamond | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:8 |
font-size | 20px | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:9 |
font-weight | bold | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:10 |
background | white | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:11 |
padding | 10px | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:12 |
background | beige | .mostparas | (排名 3) 作者普通 | 0 | 0 | 1 | 0 | 2:13 |
font-family | arial | p inline | (排名 3) 作者普通 | 1 | 0 | 0 | 0 | 2:14 |
padding | 1.5em | p inline | (排名 3) 作者普通 | 1 | 0 | 0 | 0 | 2:15 |
Display | Block | p | (排名 1) 浏览器客户端 | 0 | 0 | 0 | 1 | 3:1 |
Margin | 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 浏览器,清空浏览器缓存最方便的方法是使用下拉菜单项工具 / 删除私人数据...
|
特指性是指声明缺乏普遍性的程度;它们适用于页面上的标签而不是适用于一般标签的程度。决定此类问题的 method 已得到相当大的发展。
使用的 method 计算一个加权总和来表示特指性。计算特指性的方法如下
对于任何给定的样式表条目,检查其选择器,例如,div.p
。选择器有时很简单,只有一个元素,或者像这样,很复杂,包含多个元素。通过以下方式将总计加起来,为其特指性构造一个值
- 对于通用选择器 (*) 或继承值,将零添加到特指性总计中。
- 对于内联样式,将 1000 添加到总计中。这些只在文档中找到。
- 对于提到的每个 ID 选择器,将 100 添加到总计中。
- 对于每个类、伪类或属性,将 10 添加到总计中.
- 对于每个简单标签元素和伪元素,将 1 添加到总计中。
在任何一个级别内,竞争样式声明中特指性的最高值会导致它代表该级别在总体级联中。(请参见主页面内的图形)。
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)。 |
|
|
|
- 层叠样式表级别 2 修订版 1 (CSS 2.1) 规范: 世界范围的网页联盟 (W3C) 对 CSS 2.1 的 18 章描述。
- CSS 级联和继承级别 3 : W3C 最后呼吁工作草案 2013 年 7 月 30 日。
- CSS 教程: W3C 的多页 CSS 参考,被广泛用于 CSS 语法。
- 网页标准课程目录: 此页面包含帮助你教授或学习现代网页开发的资源。
- Opera 用户客户端样式表: 发布用于版本 10,但似乎此后不再发布。
- Firefox 用户客户端样式表
- Internet Explorer 用户客户端样式表
- Opera Dragonfly 简介: Dragonfly 是 Opera 的内置网页开发者工具集。
- Opera 12.16 中的样式呈现模式