CSS【详解】样式选择器的优先级(含提升优先级的方法)

数值越大,优先级越高,尽量保持较低的优先级,以便使用更高优先级的选择器重置样式

  • 0级------通配选择器、选择符和逻辑组合伪类。逻辑组合伪类有:not()、:is()和:where等,这些伪类本身并不影响CSS优先级,影响优先级的是括号里面的选择器。

    css 复制代码
    :not() {}
  • 1级------标签选择器

  • 2级------类选择器、属性选择器和伪类

  • 3级------ID选择器

  • 4级------style内联

  • 5级------!important

    css 复制代码
    .foo { color: #fff !important; }

    !important是顶级优先级,可以重置JavaScript设置的样式,唯一推荐使用的场景就是使JavaScript设置无效。

继承的样式优先级最低。

写在后面的样式会覆盖写在前面的同类样式。

数值计算法

每一段CSS语句的选择器都可以对应一个具体的数值,数值越大优先级越高,

  • 一个0级选择器,优先级数值+0;

  • 一个1级选择器,优先级数值+1;

  • 一个2级选择器,优先级数值+10;

  • 一个3级选择器,优先级数值+100。

选择器 计算值 计算细则
* {} 0 1个0级通配选择器,优先级数值为0
dialog {} 1 1个1级标签选择器,优先级数值为1
ul > li {} 2 2个1级标签选择器,1个0级选择符,优先级数值为1+0+1
li > ol + ol {} 3 3个1级标签选择器,2个0级选择符,优先级数值为1+0+1+0+1
.foo {} 10 1个2级类名选择器,优先级数值为10
a:not([rel=nofollow]) {} 11 1个1级标签选择器,1个0级否定伪类,1个2级属性选择器,优先级数值为1+0+10
a:hover {} 11 1个1级标签选择器,1个2级伪类,优先级数值为1+10
ol li.foo {} 12 1个2级类名选择器,2个1级标签选择器,1个0级空格选择符,优先级数值为1+0+1+10
li.foo.bar {} 21 2个2级类名选择器,1个1级标签选择器,优先级数值为10×2+1
#foo {} 100 1个3级ID选择器,优先级数值为100
#foo .bar p {} 111 1个3级ID选择器,1个2级类名选择器,1个1级标签选择器,优先级数值为100+10+11

实战范例

html 复制代码
<div class="lightblue">
    <div class="darkblue">
        <p>1. 颜色是?</p>
    </div>
</div>
<div class="darkblue">
    <div class="lightblue">
        <p>2. 颜色是?</p>
    </div>
</div>

当css如下时,1和2都是深蓝色,因为两个后代选择器优先级相同,深蓝色的样式在后,会覆盖之前的样式。

css 复制代码
.lightblue p { color: lightblue; }
.darkblue p { color: darkblue; }

css 复制代码
:not(.darkblue) p { color: lightblue; }
.darkblue p { color: darkblue; }

但当css如下时,1和2都是浅蓝色,因为.lightblue.lightblue p的优先级更高。

css 复制代码
.lightblue.lightblue p { color: lightblue; }
.darkblue p { color: darkblue; }

提升优先级的方法

  1. 重复选择器自身(不了解的人可能以为是写错了)
css 复制代码
.foo.foo {}
  1. 添加属性选择器【推荐】
css 复制代码
.foo[class] {}
#foo[id] {}
  1. 使用!important【不推荐】
css 复制代码
.foo { color: #fff !important; }

自测题

最终页面效果是?

答案

解析

css 复制代码
    /* css 权重 101 */ /* 影响内容 100  200  300*/  
    #container p { color: blue; }
    /* css 权重 101 */ /* 影响内容 100  200 */  
    div #p1, div #p2 { color: red; }
    /* css 权重 111 */     /* 影响内容 100 */  
    #container p.yellow-text { color: yellow; font-weight: bold; }
    /* css 权重 12 */  /* 影响内容 200 */  
    div p.green-text { color: green; font-weight: bold; }
    /* css 权重 2 */  /* 影响内容 100  200  300*/ 
    div p { color: gray; }
  • 影响100的样式有
css 复制代码
    /* css 权重 101 */ /* 影响内容 100  200  300*/  
    #container p { color: blue; }
    /* css 权重 101 */ /* 影响内容 100  200 */  
    div #p1, div #p2 { color: red; }
    /* css 权重 111 */     /* 影响内容 100 */  
    #container p.yellow-text { color: yellow; font-weight: bold; }
    /* css 权重 2 */  /* 影响内容 100  200  300*/ 
    div p { color: gray; }

最高权重为

css 复制代码
    /* css 权重 111 */     /* 影响内容 100 */  
    #container p.yellow-text { color: yellow; font-weight: bold; }

所以 100 是黄色

  • 影响200的样式有
css 复制代码
    /* css 权重 101 */ /* 影响内容 100  200  300*/  
    #container p { color: blue; }
    /* css 权重 101 */ /* 影响内容 100  200 */  
    div #p1, div #p2 { color: red; }
    /* css 权重 12 */  /* 影响内容 200 */  
    div p.green-text { color: green; font-weight: bold; }
    /* css 权重 2 */  /* 影响内容 100  200  300*/ 
    div p { color: gray; }

最高权重为

css 复制代码
    /* css 权重 101 */ /* 影响内容 100  200  300*/  
    #container p { color: blue; }
    /* css 权重 101 */ /* 影响内容 100  200 */  
    div #p1, div #p2 { color: red; }

权重相同时,写在后面的样式会覆盖前面的,所以最终 200 的颜色是红色

  • 影响300的样式有
css 复制代码
    /* css 权重 101 */ /* 影响内容 100  200  300*/  
    #container p { color: blue; }
    /* css 权重 2 */  /* 影响内容 100  200  300*/ 
    div p { color: gray; }

最高权重为

css 复制代码
    /* css 权重 101 */ /* 影响内容 100  200  300*/  
    #container p { color: blue; }

所以300的颜色是蓝色

相关推荐
掘金安东尼17 分钟前
前端周刊第421期(2025年7月1日–7月6日)
前端·面试·github
摸鱼仙人~20 分钟前
深入理解 classnames:React 动态类名管理的最佳实践
前端·react.js·前端框架
未来之窗软件服务22 分钟前
chrome webdrive异常处理-session not created falled opening key——仙盟创梦IDE
前端·人工智能·chrome·仙盟创梦ide·东方仙盟·数据调式
kymjs张涛22 分钟前
零一开源|前沿技术周报 #6
前端·ios·harmonyos
玲小珑26 分钟前
Next.js 教程系列(十)getStaticPaths 与动态路由的静态生成
前端·next.js
天天鸭32 分钟前
写个vite插件自动处理系统权限,降低99%重复工作
前端·javascript·vite
蓝婷儿36 分钟前
每天一个前端小知识 Day 23 - PWA 渐进式 Web 应用开发
前端
无奈何杨1 小时前
CoolGuard风控中新增移动距离和移动速度指标
前端·后端
恋猫de小郭1 小时前
Google I/O Extended :2025 Flutter 的现状与未来
android·前端·flutter
江城开朗的豌豆1 小时前
Vue-router方法大全:让页面跳转随心所欲!
前端·javascript·vue.js