深入讲解 CSS 选择器权重及实战

1. 权重计算规则详解

CSS 选择器的优先级由 三元组 (x, y, z) 决定,比较规则如下:

选择器类型 权重值 (x, y, z) 示例
ID 选择器 x + 1 #header → (1,0,0)
类/伪类/属性 y + 1 .active, :hover
元素/伪元素 z + 1 div, ::before

比较规则 :从左到右逐级比较。例如 (1,0,0) > (0,10,10)(ID 优先级最高)。

2. 实战代码示例
示例 1:基础权重对比
html 复制代码
<style>
  div { color: blue; }         /* (0,0,1) */
  .title { color: green; }     /* (0,1,0) */
  #title { color: red; }       /* (1,0,0) */
</style>

<div class="title" id="title">Hello World</div>

效果:文字为红色(ID 选择器权重最高)。

示例 2:复合选择器权重计算
html 复制代码
<style>
  .container p { color: blue; }       /* (0,1,1) */
  div p.special { color: green; }     /* (0,1,2) */
  #main .content p { color: red; }    /* (1,1,1) */
</style>

<div id="main" class="container">
  <div class="content">
    <p class="special">Text</p>  <!-- 最终为红色 -->
  </div>
</div>

解析:

  • #main .content p → (1,1,1)(最高优先级)

  • div p.special → (0,1,2)

  • .container p → (0,1,1)

示例 3:伪类和伪元素的权重
html 复制代码
<style>
  a:hover { color: purple; }          /* (0,1,1) */
  .nav li::before { content: "★"; }   /* (0,1,2) */
  #menu li.active { color: orange; }  /* (1,1,1) */
</style>

<ul id="menu" class="nav">
  <li class="active">Item</li>  <!-- 文字为橙色,★ 仍显示 -->
</ul>

解析:

  • #menu li.active 控制颜色((1,1,1))。

  • .nav li::before 控制伪元素内容(独立作用)。

示例 4:!important 的核武器
html 复制代码
<style>
  p { color: blue !important; }  /* 强制最高 */
  #para { color: red; }          /* (1,0,0) 无效 */
</style>

<p id="para">Important Text</p>  <!-- 蓝色 -->

注意 :!important 会破坏权重规则,应尽量避免使用!

示例 5:属性选择器的权重
html 复制代码
<style>
  input[type="text"] { border: 1px solid blue; }  /* (0,1,1) */
  .form-input { border: 2px dashed green; }       /* (0,1,0) */
</style>

<input type="text" class="form-input">  <!-- 蓝色实线边框 -->

解析 :属性选择器 [type="text"] 的权重 (0,1,1) > 类选择器 (0,1,0)。

3. 权重的常见误区
  1. 通配符 * 的权重 :
    * { color: black; } 的权重是 (0,0,0),低于所有其他选择器。

  2. 继承的样式 :

    继承的样式(如 font-family)不参与权重计算,优先级最低。

  3. 源码顺序的作用 :

    权重相同时,后定义的样式生效:

css 复制代码
p { color: red; }
p { color: blue; }  /* 最终蓝色 */

4. 关键知识点

  1. 优先级排序(从高到低):

    • !important(强制最高,但避免滥用)

    • 行内样式 (如 <div style="color: red;">)

    • ID 选择器 (#id)

    • 类/伪类/属性选择器 (.class, :hover, [type="text"])

    • 元素/伪元素选择器 (div, ::before)

  2. 权重不进位 :
    (1, 0, 0) 的优先级高于 (0, 100, 100)(ID 选择器权重最大)。

  3. 相同权重时 :

    后定义的样式会覆盖前面的(源码顺序决定)。

相关推荐
陈随易21 分钟前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
福兮说2 小时前
canvas 旋转图片的六个坑:四角被裁、Math.ceil 多出 1px 黑边、JPG 角发黑、翻转方向反了
前端·javascript·图像处理·canvas
传人once3 小时前
多图片上传预览功能如何写
前端·css·html·jquery·html5
Eric.463 小时前
Wan‑Animate+MiniMax-H3 本地部署 AI 漫剧流水线:8G 显存动作迁移与动态分镜工程实战
前端·人工智能·comfyui·ai漫剧
传人once5 小时前
悬停旋转放大和位移效果如何写
javascript·css·动画
库拉镜像AI牛牛5 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别
律宏阔5 小时前
Flutter 列表图片内存优化:CachedNetworkImage 与 ClipRRect 的取舍
前端·flutter
行者全栈架构师5 小时前
【鸿蒙心迹】相册文搜图工程化落地:HarmonyOS 7.0 端侧 AI 检索全链路实战与 5 个踩坑解法
前端
律宏阔5 小时前
Dart 3 Record:解决 Future.wait 异构返回值的类型问题
前端·flutter
Seraphina365 小时前
DVWA(XSS Reflected/Stored High,CSRF Low)
前端·xss·csrf