层叠、优先级与继承

您所在的位置:网站首页 cssclass选择器有两个一起 层叠、优先级与继承

层叠、优先级与继承

2023-12-20 17:02| 来源: 网络整理| 查看: 265

你会发现在一些情况下,有些规则在最后出现,但是却应用了前面的具有冲突的规则。这是因为前面的有更高的优先级——它范围更小,因此浏览器就把它选择为元素的样式。

就像前面看到的,类选择器的权重大于元素选择器,因此类上定义的属性将覆盖应用于元素上的属性。

这里需要注意虽然我们考虑的是选择器,以及应用在选中对象上的规则,但不会覆盖所有规则,只覆盖相同的属性。

这样可以避免重复的 CSS。一种常见的做法是给基本元素定义通用样式,然后给不同的元素创建对应的类。举个例子,在下面的样式中我给 2 级标题定义了通用样式,然后创建了一些类只修改部分属性的值。最初定义的值应用于所有标题,然后更具体的值通过对应类来实现。

现在让我们来看看浏览器如何计算优先级。我们已经知道一个元素选择器比类选择器的优先级更低,会被其覆盖。本质上,不同类型的选择器有不同的分数值,把这些分数相加就得到特定选择器的权重,然后就可以进行匹配。

一个选择器的优先级可以说是由三个不同的值(或分量)相加,可以认为是百(ID)十(类)个(元素)——三位数的三个位数:

ID:选择器中包含 ID 选择器则百位得一分。 类:选择器中包含类选择器、属性选择器或者伪类则十位得一分。 元素:选择器中包含元素、伪元素选择器则个位得一分。

备注: 通用选择器(*)、组合符(+、>、~、' ')和调整优先级的选择器(:where())不会影响优先级。

否定(:not())和任意匹配(:is())伪类本身对优先级没有影响,但它们的参数则会带来影响。参数中,对优先级算法有贡献的参数的优先级的最大值将作为该伪类选择器的优先级。

下面有几个单独的例子,有空可以看看。试着思考下,理解为什么优先级是这样定的。我们还没有深入介绍选择器,不过你可以在 MDN 的选择器参考页面找到每个选择器的详细信息。

选择器 ID 类 元素 优先级 h1 0 0 1 0-0-1 h1 + p::first-letter 0 0 3 0-0-3 li > a[href*="en-US"] > .inline-warning 0 2 2 0-2-2 #identifier 1 0 0 1-0-0 button:not(#mainBtn, .cta) 1 0 1 1-0-1

在我们继续之前,先看看这个示例。

这里发生了什么?首先,我们先看看最上面的选择器规则,你会发现,我们已经把优先级计算出来放在最前面的注释里。

前面两个选择器都是链接背景颜色的样式——第二个赢了使得背景变成蓝色,因为它多了一个 ID 选择器:优先级 2-0-1 vs. 1-0-1。 第三四个选择器都是链接文本颜色样式——后者赢了使得文本变成白色,因为它虽然少一个元素选择器,但是多了一个类选择器。所以优先级是 1-1-3 vs. 1-0-4。 第 5 到 7 个选择器都是鼠标悬停时链接边框样式。第六个显然输给了第五个,优先级是 0-2-3 vs. 0-2-4——少了个元素选择器。第七个,比第五第六都高——子选择器数量相同,但是有一个元素选择器变成类选择器。所以最后优先级是 0-3-3 vs. 0-2-3 和 0-2-4。

备注: 每一个选择器类编都有它自己的优先级等级,它们不会被具有较低优先级的选择器覆盖。例如,权重为一百万的类选择器不会覆盖权重为一的 ID 选择器。

评估优先级的最佳方法是对不同的优先级等级单独进行评分,并从最高的等级开始,必要时再计算低优先级等级的权重。即,仅当某一列的优先级权重相同时,你才需要评估下一列;否则,你可以直接忽略低等级的选择器,因为它们无法覆盖高优先级等级的选择器。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3