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

相关推荐
MegatronKing2 分钟前
一个有意思的问题引起了我的反思
前端·后端·测试
鹤归时起雾.14 分钟前
CSS属性继承与元素隐藏全解析
前端·css
火星数据-Tina20 分钟前
让电竞数据实时跳动:Spring Boot 后端 + Vue 前端的完美融合实践
前端·vue.js·spring boot
fruge31 分钟前
前端可视化家庭账单:用 ECharts 实现支出统计与趋势分析
前端·javascript·echarts
IT_陈寒1 小时前
Vue3性能优化实战:5个被低估的Composition API技巧让你的应用快30%
前端·人工智能·后端
嘻嘻哈哈猿人1 小时前
从 0 到 1 实现一个支持 @ 提及用户的输入框组件(Vue3 实战)
前端·vue.js
东土也1 小时前
Vue 项目 Nginx 部署路径差异分析与部署指南
前端
云枫晖1 小时前
Vue3 响应式原理:手写实现 ref 函数
前端·vue.js
合作小小程序员小小店1 小时前
web网页开发,在线%宠物销售%系统,基于Idea,html,css,jQuery,java,ssh,mysql。
java·前端·数据库·mysql·jdk·intellij-idea·宠物
荔枝吖1 小时前
html2canvas+pdfjs 打印html
前端·javascript·html