为什么元素显示的样式跟我设置的不一样?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,也就是子元素定义的样式会覆盖继承来的样式。

相关推荐
Amumu121384 分钟前
Js:内置对象
开发语言·前端·javascript
广州华水科技6 分钟前
2026年单北斗GNSS变形监测系统推荐,助力精准监控与智慧城市建设
前端
鸡吃丸子10 分钟前
如何编写一个高质量的AI Skill
前端·ai
我命由我1234522 分钟前
Element Plus 2.2.27 的单选框 Radio 组件,选中一个选项后,全部选项都变为选中状态
开发语言·前端·javascript·html·ecmascript·html5·js
Luna-player23 分钟前
第3章 Spring Boot的Web应用支持,个人学习笔记
前端·spring boot·学习
bugcome_com24 分钟前
【ASP.NET Web Pages】页面布局核心实战:从复用性到安全性,打造一致化网站界面
前端·后端·asp.net
Sylus_sui24 分钟前
Class 模型 + 跨组件状态(@Observed)+ 网络请求封装 + 本地存储全部是鸿蒙 Next/Stage 模型标准写法
前端
代码栈上的思考28 分钟前
消息队列持久化:文件存储设计与实现全解析
java·前端·算法
踩着两条虫35 分钟前
去“AI味儿”实操手册:从“机器脸”到“高级脸”,只差这三步!
前端·vue.js·ai编程
qq_211387471 小时前
基于LangGraph多agent
开发语言·前端·javascript·agent·langgraph