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

如何计算 CSS 的优先级?

CSS 优先级(也称为特异性Specificity)决定了当多个样式规则应用于同一个元素时,哪一个规则会生效。

计算 CSS 优先级的核心规则如下:

1. 优先级计算权重(特异性)

CSS 选择器的优先级通常用一个四位数的向量(a, b, c, d)来表示,数值越大,优先级越高。

  • a (行内样式): 元素标签的style属性中的样式。
    • 例如:<div style="color: red;">
    • 权重:1, 0, 0, 0
  • b (ID 选择器): 选择器中 ID 的数量。
    • 例如:#header,#nav #menu
    • 权重:0, 1, 0, 0(每个 ID 加 1)
  • c (类、属性、伪类): 选择器中类选择器 (.class)、属性选择器 ([type="text"]) 和伪类 (:hover,:nth-child()) 的数量。
    • 例如:.btn,div.container,a:hover,[disabled]
    • 权重:0, 0, 1, 0(每个类/属性/伪类加 1)
    • 注意:伪元素(如::before,::after)算作 d 类,不计入 c。
  • d (标签、伪元素): 选择器中标签选择器 (div,p) 和伪元素 (::before,::after) 的数量。
    • 例如:div,p::first-line
    • 权重:0, 0, 0, 1(每个标签/伪元素加 1)

通配符选择器 (*)、组合器 (+,>,~, 空格) 和:not()伪类本身不增加优先级(但:not()内部的参数会计算优先级)。

2. 计算示例

让我们计算几个选择器的优先级:

  1. div

    • 1 个标签
    • 权重:(0, 0, 0, 1)
  2. .container

    • 1 个类
    • 权重:(0, 0, 1, 0)
  3. #main .box div

    • 1 个 ID (#main)
    • 1 个类 (.box)
    • 1 个标签 (div)
    • 权重:(0, 1, 1, 1)
  4. div#header .nav-item:hover

    • 1 个 ID (#header)
    • 1 个类 (.nav-item)
    • 1 个伪类 (:hover)
    • 2 个标签 (div, 隐含在结构中,但这里只算显式的div) -> 实际上选择器是div#header(1标签) 和.nav-item:hover(0标签)
    • 修正:div#header(1标签, 1ID) +.nav-item:hover(1类, 1伪类)
    • 权重:(0, 1, 2, 1)
  5. style="color: blue;"(行内样式)

    • 权重:(1, 0, 0, 0)

比较结果
(1, 0, 0, 0) > (0, 1, 2, 1) > (0, 1, 1, 1) > (0, 0, 1, 0) > (0, 0, 0, 1)
即:行内样式 > ID 选择器 > 类选择器 > 标签选择器

3. 特殊情况:!important

!important是一个特殊的标记,它可以覆盖正常的优先级计算规则。

  • 带有!important的声明优先级最高(除了行内样式中的!important)。
  • 如果多个规则都有!important,则按照上述的优先级规则(特异性)进行比较。
  • 建议:尽量避免使用!important,因为它会破坏 CSS 的层叠机制,使代码难以维护。只有在需要覆盖第三方库样式或处理极其复杂的特殊情况时才使用。

4. 优先级相同怎么办?

如果两个选择器的优先级(特异性)完全相同,那么后定义的样式会覆盖先定义的样式(即“后声明者优先”)。

/* 优先级相同 (0, 0, 1, 0) */.box{color:red;}.container{color:blue;}/* 如果元素同时匹配 .box 和 .container,颜色将是 blue,因为 .container 定义在后 */

总结口诀

  1. 行内样式老大(权重最高)。
  2. ID 选择器老二。
  3. 类/属性/伪类老三。
  4. 标签/伪元素老四。
  5. 通配符/组合器不计分。
  6. !important是外挂(慎用)。
  7. 权重相同看先后(后写的生效)。

理解这些规则有助于你编写更清晰、可维护的 CSS 代码,避免样式冲突。

http://www.jsqmd.com/news/533275/

相关文章:

  • 【杂记-浅谈IPv6过渡技术之6to4网络技术】
  • 火狐+Burp Suite代理配置全攻略:从零搭建Pikachu靶场测试环境
  • Cortex-M3 数据端(大小端)深度剖析:默认配置与修改的设计权衡
  • CSS 中可继承与不可继承属性有哪些?
  • nlp_structbert_sentence-similarity_chinese-large实战案例:政务热线工单语义聚类分析
  • 基于AI多因子定价模型的“乱世买黄金”被打破?黄金1500美元回撤的因子归因分析
  • 手把手教你用BQ34Z100评估板搭建电池管理系统(附接线图与寄存器配置)
  • NES游戏开发实战:从VS Code编写6502汇编到一键生成.nes文件的完整流水线
  • Loop窗口管理工具深度指南:提升Mac多任务效率的完整方案
  • Youtu-Parsing模型单片机项目文档处理:自动化生成数据手册摘要
  • 优麒麟20.04 LTS换源实战:为什么华为云镜像比官方源快这么多?
  • 从‘异或’难题到神经网络革命:感知机模型被‘嫌弃’的那段历史
  • RexUniNLU零样本NLP系统保姆级教程:日志分析与常见错误码解读
  • Dify+ECharts:打造企业级智能报表自动化流水线
  • C语言高级编程技巧:非常规用法解析
  • 基于Qwen3-ASR的语音爬虫:音频内容自动化采集与分析
  • 社区API网关开发:bbs-go统一入口实现指南
  • 【小沐学GIS】基于C++构建三维地球交互应用(QT、OpenGL、glfw、glut)
  • Electron应用打包神器:NSIS从入门到精通(Windows平台保姆级教程)
  • YOLOv7完整指南:如何快速上手最先进的实时目标检测模型
  • 解决PyTorch性能瓶颈:Intel Extension for PyTorch的4个实战技巧
  • nli-distilroberta-base效果展示:模型对否定词、程度副词、隐含前提的鲁棒性案例
  • 算法教学中的交互式可视化实验平台研究的技术6
  • Graphiti:构建时态感知知识图的创新框架
  • 构建自动化Kubernetes集群健康检查的终极工作流:Popeye与CI/CD的完美集成指南
  • B端拓客号码核验:困境审视与技术升级的行业思考氪迹科技法人股东号码筛选核验系统、阶梯式价格
  • ALLEN BRADLEY罗克韦尔1756-M08SE 伺服模块
  • 3步终结3D打印材料参数调试难题:OrcaSlicer全材料工艺优化指南
  • 位段操作(Bit-Banding)深度剖析:原子标志与信号量实现的本质
  • Materialize:3分钟快速生成PBR材质的终极开源工具