深入讲解 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. 相同权重时

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

相关推荐
用户0595401744622 分钟前
Redis 记忆存储踩坑实录:一个并发写入 Bug 让我排查了 4 小时
前端·css
小徐_23331 小时前
Wot UI 2.3.0 发布:二维码组件来了,Open Wot 与 wot-starter 同步更新
前端·微信小程序·uni-app
kyriewen1 小时前
Claude自己跑出去hack了3家公司——我为什么还在用它写代码
前端·ai编程·claude
IT_陈寒1 小时前
SpringBoot自动配置的坑,这次真踩疼我了
前端·人工智能·后端
子兮曰2 小时前
AI 浏览器 Agent 的安全困局:当自动化工具可以偷走你的登录态
前端·人工智能·后端
程序员黑豆2 小时前
鸿蒙应用开发之@Styles 装饰器:定义可复用的组件样式
前端·harmonyos
程序员码歌2 小时前
我全程用 AI开发了一款微信小游戏,上线了
android·前端·游戏开发
咩咩啃树皮2 小时前
第52篇:前端工程化完整体系精讲——Vite构建、模块化、打包原理、规范体系、面试终极通关
前端·面试·职场和发展
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(四十八):菜单规则管理实现
前端·后端·ai编程
FogLetter2 小时前
当JavaScript学会“分身术”:异步编程的进化简史
前端·javascript·面试