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

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

相关推荐
全栈技术负责人8 小时前
Hybrid应用性能优化实战分享(本文iOS 与 H5为例,安卓同理)
前端·ios·性能优化·html5
xw59 小时前
移动端调试上篇
前端
@菜菜_达9 小时前
Lodash方法总结
开发语言·前端·javascript
YAY_tyy9 小时前
基于 Vue3 + VueOffice 的多格式文档预览组件实现(支持 PDF/Word/Excel/PPT)
前端·javascript·vue.js·pdf·word·excel
Yvonne爱编码9 小时前
AJAX入门-AJAX 概念和 axios 使用
前端·javascript·ajax·html·js
在路上`9 小时前
前端学习之后端java小白(三)-sql外键约束一对多
java·前端·学习
Pu_Nine_910 小时前
10 分钟上手 ECharts:从“能跑”到“生产级”的完整踩坑之旅
前端·javascript·echarts·css3·html5
東雪蓮☆11 小时前
从零开始掌握 Web 与 Nginx:入门详解
运维·服务器·前端·nginx
脑子慢且灵11 小时前
【JavaWeb】一个简单的Web浏览服务程序
java·前端·后端·servlet·tomcat·web·javaee
柯南二号11 小时前
【大前端】 断点续传 + 分片上传(大文件上传优化) 的前端示例
前端