摘要:类选择器具有更高的专用性,所以将战胜元素选择器。个位在整个选择器中每包含一个元素选择器或伪元素就在该列中加分。选择器六明显地输给了了五,其专用性值为和它在链中少了一个元素选择器。
当有多个选择器作用在一个元素上时,哪个规则最终会应用到元素上?
其实这是通过层叠机制来控制的,这也和样式继承(元素从其父元素那里获得属性值)有关。
元素的最终样式可以在多个地方定义,它们以复杂的形式相互影响。这些复杂的相互作用使CSS变得非常强大,但也使其非常难于调试和理解。
CSS 是 Cascading Style Sheets 的缩写,这暗示层叠(cascade)的概念是很重要的。在最基本的层面上,它表明CSS规则的顺序很重要,但它比那更复杂。什么选择器在层叠中胜出取决于三个因素(这些都是按重量级顺序排列的——前面的的一种会否决后一种):
在CSS中,有一个特别的语法可以让一条规则总是优先于其他规则:!important
。(常见于应用于iconfont图标属性后面)把它加在属性值的后面可以使这条声明有无比强大的力量。
让我们看一下这个例子:
This is a paragraph.
One selector to rule them all!
#winning {
background-color: red;
border: 1px solid black;
}
.better {
background-color: gray;
border: none !important;
}
p {
background-color: blue;
color: white;
padding: 5px;
}
这将生成以下:
让我们一起来看看发生了什么。
你可以看到第三条规则 color
和 padding
被运用了, 但 background-color
没有,为什么?实际上,这三种情况都应该应用,因为在源顺序后面的规则通常会覆盖较早的规则。
然而, 在前面的规则被运用了,因为 IDs/class 选择器优先于element选择器。
这两个元素都有 class
并带有 better
属性, 但是第二个元素有 id
值为winning
。 因为比起class而言id专用性更高(在一个页面上id是唯一的, 但很多元素可以拥有相同的class — ID 选择器在它们的目标中是非常优先的),红色背景色和1pixel的黑色边框都应应用于第二元素,第一个元素获得灰色背景色,没有边框,如类所指定。
第二个元素获得红色背景色,但没有边框。为什么?因为 !important
在第二条规则中的声明——在 border: none
之后写入它意味着尽管id具有更高的优先性,该声明也将优先于前面规则中的边界值声明。
注意: 重载这个 !important
声明的唯一方法是在后面的源码或者是一个拥有更高特殊性的源码中包含相同的 !important
特性的声明。
知道 !important
存在是很有用的,这样当你在别人的代码中遇到它时,你就知道它是什么了。但是!我们建议你千万不要使用它,除非你绝对必须使用它。您可能不得不使用它的一种情况是,当您在CMS中工作时,您不能编辑核心的CSS模块,并且您确实想要重写一种不能以其他方式覆盖的样式。 但是,如果你能避免的话,不要使用它。由于 !important
改变了层叠正常工作的方式,因此调试CSS问题,尤其是在大型样式表中,会变得非常困难。
要注意一个CSS声明的重要性取决于它被指定在什么样式表内——用户可以设置自定义样式表覆盖开发商的样式,例如用户可能有视力障碍,想设置字体大小对所有网页的访问是双倍的正常大小,以便更容易阅读。
相互冲突的声明将按以下顺序适用,后一种将覆盖先前的声明:
Web开发者的样式表覆盖用户的样式表是合理的,所以设计可以保持预期,但是有时候用户有很好的理由来重写web开发人员样式,如上所述,这可以通过在用户的规则中使用!important
。
专用性基本上是衡量选择器的具体程度的一种方法——它能匹配多少元素。如上面所示的示例所示,元素选择器具有很低的专用性。类选择器具有更高的专用性,所以将战胜元素选择器。ID选择器有甚至更高的专用性, 所以将战胜类选择器. 战胜ID选择器的唯一方法是使用 !important
。
一个选择器具有的专用性的量是用四种不同的值(或组件)来衡量的,它们可以被认为是千位,百位,十位和个位——在四个列中的四个简单数字:
style
属性中该列加1分(这样的声明没有选择器,所以它们的专用性总是1000。)否则为0。注意: 通用选择器 (*
), 复合选择器 (+
, >
, ~
, ) 和否定伪类 (:not
) 在专用性中无影响。
下表显示了几个示例。试着通过这些,并确保你理解他们为什么具有我们给予他们的专用性。
选择器 | 千位 | 百位 | 十位 | 个位 | 合计值 |
---|---|---|---|---|---|
h1 |
0 | 0 | 0 | 1 | 0001 |
#important |
0 | 1 | 0 | 0 | 0100 |
h1 + p::first-letter |
0 | 0 | 0 | 3 | 0003 |
li > a[href*="zh-CN"] > .inline-warning |
0 | 0 | 2 | 2 | 0022 |
#important div > div > a:hover , 在一个元素的 属性里 |
1 | 1 | 1 | 3 | 1113 |
在我们继续之前,让我们看看一个行动中的例子。
这是我们将要使用的HTML:
下面是CSS的示例:
/* specificity: 0101 */
#outer a {
background-color: red;
}
/* specificity: 0201 */
#outer #inner a {
background-color: blue;
}
/* specificity: 0104 */
#outer div ul li a {
color: yellow;
}
/* specificity: 0113 */
#outer div ul .nav a {
color: white;
}
/* specificity: 0024 */
div div li:nth-child(2) a:hover {
border: 10px solid black;
}
/* specificity: 0023 */
div li:nth-child(2) a:hover {
border: 10px dashed black;
}
/* specificity: 0033 */
div div .nav:nth-child(2) a:hover {
border: 10px double black;
}
a {
display: inline-block;
line-height: 40px;
font-size: 20px;
text-decoration: none;
text-align: center;
width: 200px;
margin-bottom: 10px;
}
ul {
padding: 0;
}
li {
list-style-type: none;
}
我们从这个代码中得到的结果如下:
这里发生了什么?首先,我们只对本例的前七个规则感兴趣,正如您将注意到的,我们已经在每个注释中包含了它们的专用性值。
如上所述,如果多个相互竞争的选择器具有相同的重要性和专用性,那么第三个因素将帮助决定哪一个规则获胜——后面的规则将战胜先前的规则。例如:
p {
color: blue;
}
/* This rule will win over the first one */
p {
color: red;
}
而在这个例子中的第一个规则将获胜,因为专用性高于源代码顺序:
/* This rule will win */
.footnote {
color: blue;
}
p {
color: red;
}
在考虑所有这些层叠理论和什么样式优先于其他样式被应用时,你应该记住的一件事是,所有这些都发生在属性级别上——属性覆盖其他属性,但你不会让整个规则凌驾于其他规则之上。
当多个CSS规则匹配相同的元素时,它们都被应用到该元素中。只有在这之后,任何相互冲突的属性才会被评估,以确定哪种风格会战胜其他类型。
简记:只有相同的属性应用发生冲突后才会产生覆盖
让我们看一个例子。首先,一些HTML:
I"m important
现在一些CSS风格与它:
/* specificity: 0002 */
p strong {
background-color: khaki;
color: green;
}
/* specificity: 0001 */
strong {
text-decoration: underline;
color: red;
}
Result:
在这个例子中,因为专用性的关系,第一条规则中的color
属性覆盖掉了第二条中的颜色值。但是,对于第一条中的 background-color
和第二条中的text-decoration
的属性都在strong
元素之中得到了体现。你也注意到了这个元素之中的字体是加粗的:这是浏览器默认的样式规则。
CSS继承是我们需要研究的最后一部分,以获取所有信息并了解什么样式应用于元素。
其思想是,应用于某个元素的一些属性值将由该元素的子元素继承,而有些则不会。
例如,对 font-family
和 color
进行继承是有意义的,因为这使得您可以很容易地设置一个站点范围的基本字体,方法是应用一个字体到 元素;然后,您可以在需要的地方覆盖单个元素的字体。如果要在每个元素上分别设置基本字体,那就太麻烦了。
再如,让 margin
padding
,border
和 background-image
不被继承是有意义的。想象一下,如果您将这些属性设置在一个容器元素上,并将它们继承到每个子元素,然后不得不将它们全部放在每个多带带的元素上,那么将会出现的样式/布局混乱。
哪些属性默认被继承哪些不被继承大部分符合常识。如果你想确定,你可以参考CSS参考资料—— 每个多带带的属性页都会从一个汇总表开始,其中包含有关该元素的各种详细信息,包括是否被继承。
注:
font-family
允许您通过给定一个有先后顺序的,由字体名或者字体族名组成的列表来为选定的元素设置字体。 属性的值用逗号隔开。浏览器会选择列表中第一个该计算机上有安装的字体,或者是通过 ‘ @font-face
指定的可以直接下载的字体。
padding
属性设置一个元素的内边距,padding 区域指一个元素的内容和其边界之间的空间,该属性不能为负值。
background-image
属性用于为一个元素设置一个或者多个背景图像。图像在绘制时,以z方向堆叠的方式进行。先指定的图像会在之后指定的图像上面绘制。因此指定的第一个图像最接近用户。
CSS为处理继承提供了四种特殊的通用属性值:
inherit
: 该值将应用到选定元素的属性值设置为与其父元素一样。initial
:该值将应用到选定元素的属性值设置为与浏览器默认样式表中该元素设置的值一样。如果浏览器默认样式表中没有设置值,并且该属性是自然继承的,那么该属性值就被设置为 inherit
。unset
:该值将属性重置为其自然值,即如果属性是自然继承的,那么它就表现得像 inherit
,否则就是表现得像 initial
。revert
:如果当前的节点没有应用任何样式,则将该属性恢复到它所拥有的值。换句话说,属性值被设置成自定义样式所定义的属性(如果被设置), 否则属性值被设置成用户代理的默认样式。注意: initial
和 unset
不被IE支持。
initial
是将属性的初始值( initial value)赋给元素 . initial 适用于所有的css 属性(属性的initial值可在属性表中查到),包括css 简写属性(全局属性)all.
inherit
值是最有趣的——它允许我们显式地让一个元素从其父类继承一个属性值。
让我们看一个例子。首先有以下一段HTML:
现在用CSS给它添加样式:
body {
color: green;
}
.inherit a {
color: inherit;
}
.initial a {
color: initial
}
.unset a {
color: unset;
}
Result:
让我们解释这里发生了什么:
的color
为绿色。color
属性是自然继承的,所有的body子元素都会有相同的绿色。需要注意的是默认情况下浏览器设置链接的颜色为蓝色,而不是自然继承color属性,因此在我们列表中的第一个链接是蓝色的。inherit
的元素内的链接,并从父类继承它的颜色。在这种情况下, 意思是说链接继承了父元素
的颜色,默认情况下
的颜色来自于它的父元素
, 最后
继承自
元素,而
的color
根据第一条规则设置成了绿色。initial
的任意链接然后设置他们的颜色为 initial
。通常, initial
的值被浏览器设置成了黑色,因此该链接被设置成了黑色。unset
的所有链接然后设置它们的颜色为 unset
——即我们不设置值。因为color属性是一个自然继承的属性,它实际上就像把值设置成 inherit
一样。结果是,该链接被设置成了与body一样的颜色——绿色。CSS速写属性 all
能够被应用到每一个继承属性,一次性应用所有的继承属性。这里的值可以是继承属性里的任何一个 (inherit
, initial
, unset
, or revert
)。对于撤销对样式的修改,这是非常方便的一种方式。然后你就可以在开始新的修改之前,返回到一个已知的开始点。
全文摘要自MDN网络开发者网站
end
2018-5-31 周四
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/2195.html
摘要:为了解决冲突,确定哪条规则胜出并最终被应用,提供了三种机制继承层叠和特指。整个检查更新过程结束后,再将每个标签以最终设定的样式显示出来。层叠规则四顺序决定权重。规则三设定的样式胜过继承的样式,此时不用考虑特指度即显式设定优先。 为了解决冲突,确定哪条规则胜出并最终被应用,CSS提供了三种机制:继承、层叠和特指。 1.继承 CSS 中的祖先元素会向后代传递一样东西:CSS属性...
摘要:计算属性的计算值通常包括将相对值转换成绝对值如单位或百分比。返回的解析值可能是计算值或应用值。最后,计算布局尺寸比如或百分数换算为像素值,结果即应用值。继承当元素的一个继承属性没有指定值时,则取父元素的同属性的计算值。 css属性 我觉得大部分学习前端的人应该都没有按照教科书一般的来学习css,可能是类似搭积木一样,需要什么拿什么,所以可能最对一些基本的概念没有很好的理解,这里列出的是...
摘要:相反的,提供了全局作用域和局部作用域。组成界面的分子的样式可以通过元素选择器定位。元素选择器的优先级很低,因此他们不会覆盖任何基于类选择器的样式。使用元素选择器有以下优点避免了的冗长没有冗余的类。 最近学习到CSS的继承属性,正好看到这篇文章,便将它翻译出来。作者的思想,在平时的项目中或多或少都有用过,但是从来没有仔细去思考如何利用这些特性让代码更加优雅。 我热爱模块化设计。长期以来,...
摘要:,高级选择器后代选择器空格表示后代选择器就是的后代所有的。注意是后代,并不一定是儿子空格可以出现多次补充后代选择器中出现的东西很灵活,可以是标签,可以是名,可以是名后代选择器,就是一种平衡共性特性的平衡。 一,选择器 1,基础选择器 1) 标签选择器:div{ } ,选择的所有,而不是一个,用来描述共性。 2) 类选择器:.class名{ } 多个元素可以同时属...
摘要:我们知道字体属性在任意时刻都只能应用一种设定那此时该应用哪种字体呢为解决类似的冲突确定哪条规则胜出并最终被应用提供了三种机制继承层叠和特指。层叠规则层叠规则一找到应用给每个元素和属性的所有声明。层叠规则五设定的永远大于继承的。 在一个较大的样式表中,可能会有很多条规则都选择同一个元素的同一个属性。比 如,一个带有类属性的段落,可能会被一条以标签名作选择符的规则选中并指定一 种字体,而另...
阅读 673·2021-11-15 11:37
阅读 3299·2021-10-27 14:14
阅读 5872·2021-09-13 10:30
阅读 2940·2021-09-04 16:48
阅读 1898·2021-08-18 10:22
阅读 2097·2019-08-30 14:19
阅读 696·2019-08-30 10:54
阅读 1725·2019-08-29 18:40