CSS样式优先级的数学模型_掌握属性计算的最终结果

6次阅读

!important 有时压不住内联样式,因优先级按来源类型分层判定,内联样式属最高来源档位;css自定义属性不参与特异性计算,仅按作用域链查找最近有效声明。

CSS样式优先级的数学模型_掌握属性计算的最终结果

为什么 !important 有时压不住内联样式?

因为优先级不是简单叠加,而是分层判定:浏览器先按「来源类型」分档(用户代理 !important。内联样式的来源层级天然高于外部 CSS 文件里的 !important,所以它赢在第一轮,根本没机会比后面。

实操建议:

  • 遇到内联样式压不倒,别硬加 !important,先查是不是 js 动态写了 element.style.color = "red"
  • 想覆盖内联样式,只能用更高来源层级(如浏览器扩展注入的 CSS)或直接改 element.style 属性
  • !important 在同源 CSS 中生效,但跨源时受层级压制,不是“绝对最高”

specificity 的三位数怎么算?别背公式,看实际匹配

所谓“100-10-1”模型只是助记:ID 选择器算 100,类/属性/伪类算 10,标签/伪元素算 1。但它不支持进位——#nav .item:hover div 是 100+10+10+1 = 121,不是 131;而 div#main.content[role="banner"] 是 100+10+10+10+1 = 131,不是 141。

常见错误现象:

立即学习前端免费学习笔记(深入)”;

  • 以为 .a.b.c.d(四个类)能干掉 #id —— 实际是 40
  • :not(.x) 包裹时,括号里算特异性::not(#id) 整体算 100,:not(.cls) 算 10
  • *{} 特异性为 0,但会匹配所有元素,容易被误认为“没效果”,其实是被更高特异性规则盖掉了

行内样式、<style></style> 和外部 .css 的优先级谁先谁后?

来源顺序决定初始档位:外部文件 <link><style></style> 同属“作者样式”,行内样式是“作者样式(内联)”,属于更高子档位。所以三者排序是:行内 > <style></style> ≈ 外部 CSS(按加载顺序后写的覆盖前写的)。

使用场景注意点:

  • 组件库常用 <style scoped></style> 或 CSS-in-JS,本质是生成带唯一属性的选择器(如 [data-v-abc123]),靠增加一个属性选择器(+10)提升特异性
  • @import 加载的 CSS,其声明顺序以 @import 出现位置为准,不是文件物理位置
  • Vite / webpack 的 CSS 提取插件可能把 <style></style> 内联内容抽成外部文件,此时它就降级为普通外部 CSS,不再优先于 <link>

CSS Custom Properties 能绕过优先级计算吗?

不能绕过,但改变了计算时机:自定义属性本身不参与渲染,只在 var(--color) 被引用时,才去当前作用域链上查找最近的有效声明。这个查找过程**不看特异性,只看作用域和继承链**。

所以:

  • :root { --c: red; } div { --c: blue; } p { color: var(--c); }p 从父级 div 拿到 blue,哪怕 :root 有更高特异性
  • 如果 p 自己设了 --c: green,那就用 green,跟父级或全局无关
  • 自定义属性可以被 JS 动态修改:document.documentElement.style.setProperty('--c', 'orange'),这会实时影响所有引用处,且无需重新计算选择器优先级

复杂点在于嵌套引用和 fallback:比如 color: var(--x, var(--y, black)),fallback 里又套 var(),这时每一层都独立查作用域,不是一次性算完。

text=ZqhQzanResources