当前位置: 首页 > news >正文

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

1. 权重计算规则详解

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

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

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

2. 实战代码示例
示例 1:基础权重对比
<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:复合选择器权重计算
<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:伪类和伪元素的权重
<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 的核武器
<style>p { color: blue !important; }  /* 强制最高 */#para { color: red; }          /* (1,0,0) 无效 */
</style><p id="para">Important Text</p>  <!-- 蓝色 -->

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

示例 5:属性选择器的权重
<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. 源码顺序的作用
    权重相同时,后定义的样式生效:

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. 相同权重时
    后定义的样式会覆盖前面的(源码顺序决定)。

相关文章:

  • 【刷题2025】单指针双指针+滑动窗口+二分法三分法+区间问题
  • 如何一键检查网页里的失效链接和废弃域名?
  • 【加密算法】SM2密钥生成与转换详解:从原理到代码实现
  • ecovadis分为哪些类别,要进行ecovadis认证有什么要求
  • 榕壹云场馆预定系统:基于ThinkPHP+MySQL+UniApp打造的全能运动馆智慧运营解决方案
  • 解锁Grok-3的极致潜能:高阶应用与创新实践
  • 多模态大模型文字识别 vs OCR识别模型
  • 【Python进阶】断言(assert)的十大核心应用场景解析
  • RelativeLayout(相对布局)
  • Mac电脑交叉编译iphone设备可以运行的redsocks, openssl, libsevent
  • Rust + WebAssembly 性能剖析指南
  • 辛格迪客户案例 | 厦门三维丝实施SAP系统
  • js ES6箭头函数的作用
  • 0415-批量删除操作
  • ERR_PNPM_DLX_NO_BIN No binaries found in tailwindcss
  • ClickHouse 数据库中的 “超时”
  • 游戏引擎学习第227天
  • Java微服务线程隔离技术对比:线程池隔离 vs 信号量隔离
  • union all 关联查询
  • OpenAI发布GPT-4.1:开发者专属模型的深度解析 [特殊字符]
  • 新闻1+1丨“龟速”行驶要治理,还要治什么?
  • 伊朗外长访华将会见哪些人?讨论哪些议题?外交部回应
  • 2025年度沪惠保参保今开启:保费不变,国内特药种类扩增
  • 国家疾控局局长沈洪兵:将逐步缩小国内免疫规划与国际差距
  • 上海开展数据产品知识产权登记存证试点,243个产品许可收益超20亿元
  • 62岁中国国际商会副会长、康力电梯创始人王友林逝世