为什么元素显示的样式跟我设置的不一样?CSS优先级详解

一、什么是CSS中的选择器优先级?

在CSS中,选择器优先级是指确定应用于元素的最相关CSS声明的算法。这个优先级决定了哪个样式规则将被应用到元素上。根据选择器的类型和特定性,CSS规定了不同的优先级,例如ID选择器比类选择器具有更高的优先级。在CSS中,选择器的优先级决定了最终应用到元素的样式。

二、选择器的优先级计算

1、根据CSS中的优先级规则,以下是选择器的优先级顺序:

!important > 内联样式 style > ID 选择器 > 伪类选择器 > 属性选择器 = class 选择器 > 伪元素 > 元素(类型)选择器 > 关系选择器 > 通配符选择器

这些所有的选择器都可以归为以下三种选择器:IDCLASSTYPE,它们对应三列值,分别表示选择器的三个权重类别。这三列由匹配元素的选择器中每个权重类别的选择器组件数量确定。优先级从高到低的顺序如下:

  1. ID列:只包括ID选择器,例如#example。对于匹配选择器中的每个ID,将1-0-0添加到权重值中。

  2. CLASS列:包括类选择器,例如.myClass,属性选择器,如[type="radio"]和[type|="fr"],以及伪类,例如:hover、:nth-of-type(3n)和:required。对于匹配选择器中的每个类、属性选择器或伪类,将0-1-0添加到权重值中。

  3. TYPE列:包括类型选择器,例如p、h1和td,以及伪元素,例如::before、::placeholder和所有其他带有双冒号表示法的选择器。对于匹配选择器中的每个类型或伪元素,将0-0-1添加到权重值中。

2、计算权重

在计算权重时,通用选择器(*)和继承值的优先级为0,它们不影响优先级权重值。组合符号,例如+、>、~、空格和||,可能使选择器更具体,但不会增加优先级权重。

当具有相同优先级权重的竞争选择器时,将比较每列中的选择器组件数量,从左到右进行比较。如果ID列中的数字相同,则比较CLASS列,如果CLASS列中的数字也相同,则比较TYPE列。如果所有三列中的数字都相同,则最后声明的样式将具有优先权。

根据权重为样式设值:

  • 内联样式(权重值为1000)
  • ID选择器(权重值为100)
  • 类选择器、属性选择器和伪类选择器(权重值为10)
  • 元素选择器和伪元素选择器(权重值为1)
    举个例子:
html 复制代码
<!DOCTYPE html>
<html>
<head>
  <style>
    p {color: red;} /* Specificity: 1 */
    .test {color: green;} /* Specificity: 10 */
    #demo {color: blue;} /* Specificity: 100 */
  </style>
</head>
<body>
  <p id="demo" class="test" style="color: pink;">Hello World!</p>
</body>
</html>

在示例中,p元素应用了内联样式,ID选择器和类选择器。根据特定性算法,内联样式的权重值为1000,ID选择器的权重值为100,类选择器的权重值为10。因此,内联样式的权重值最高,所以文本颜色将是粉红色。

三、父子组件样式

在CSS中,当子元素定义了样式时,它的样式会覆盖继承来的样式,即使父元素样式的权重很高,被子元素继承时,子元素定义的样式会具有更高的优先级。这是因为在嵌套结构中,子元素的样式优先级会覆盖继承的样式。
即不管父元素样式的权重多大,被子元素继承时,他的权重都为0,也就是子元素定义的样式会覆盖继承来的样式。

相关推荐
love530love5 小时前
Scoop 完整迁移指南:从 C 盘到 D 盘的无缝切换
java·服务器·前端·人工智能·windows·scoop
王码码20356 小时前
Flutter for OpenHarmony:Flutter 三方库 bluez 玩转 Linux 风格的蓝牙操作(蓝牙底层互操作)
linux·运维·服务器·前端·flutter·云原生·harmonyos
chilavert3189 小时前
技术演进中的开发沉思-371:final 关键字(中)
java·前端·数据库
2301_816997889 小时前
Vite构建工具
前端
yuki_uix10 小时前
深入理解 reduce:从面试题到设计思维
前端
凌云拓界10 小时前
TypeWell全攻略(二):热力图渲染引擎,让键盘发光
前端·后端·python·计算机外设·交互·pyqt·数据可视化
coding随想10 小时前
TypeScript 高级类型全攻略:从“可表达性”到“类型体操”的实践之路
前端·javascript·typescript
大时光10 小时前
gsap -滚动插件 ScrollTrigger 简单demo
前端