Web前端入门第 23 问:CSS 选择器的优先级

news/2025/4/2 18:52:59/文章来源:https://www.cnblogs.com/linx/p/18803468

任何地方都存在阶级,CSS 选择器也不例外,也会讲一个三六九等。

选择器类别

  • 通配符选择器
  • 标签选择器
  • 类选择器
  • ID选择器
  • 属性选择器
  • 伪类选择器
  • 伪元素选择器
  • 关系选择器

流传已久的阶级划分

选择器 权重
继承父标签的样式、* 通配符选择器 0,0,0,0
标签选择器 0,0,0,1
类选择器、属性选择器、伪类选择器 0,0,1,0
ID 选择器 0,1,0,0
标签的内联样式 style 属性 1,0,0,0
样式后添加 !important 权重无穷大

权重不存在进位

特别注意:权重不存在进位说法。比如 11 个类选择器叠加,那么权重就是 0,0,11,0,并不会变成 0,1,1,0。例如:

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS</title><style>#p {color: red;}.div1 .div2 .div3 .div4 .div5 .div6 .div7 .div8 .div9 .div10 .div11 .p {color: blue;}</style>
</head><body class="body"><div class="div1"><div class="div2"><div class="div3"><div class="div4"><div class="div5"><div class="div6"><div class="div7"><div class="div8"><div class="div9"><div class="div10"><div class="div11"><p class="p" id="p">段落文本</p></div></div></div></div></div></div></div></div></div></div></div>
</body></html>

上面代码中有 .div1 .div2 .div3 .div4 .div5 .div6 .div7 .div8 .div9 .div10 .div11 .p 这么长的类选择器,想要颠覆 id 选择器 #p,然而官大一级压死人,没任何用处,最终还是 #p 占据上风。如:

相同权重,层级越多越大

都使用类选择器,层数越多,权重越大。如:.body .ul .li1 权重为 0,0,3,0.ul .li1 权重为 0,0,2,0.body .ul .li1 优先级就更高,毕竟人多力量大。

示例:

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS</title><style>.body .ul .li1 {color: blue;}.ul .li1 {color: red;}</style>
</head><body class="body"><ul id="ul" class="ul"><li id="li1" class="li1">li 文本 1</li><li id="li2" class="li2">li 文本 2</li><li id="li3" class="li3">li 文本 3</li><li id="li4" class="li4">li 文本 4</li><li id="li5" class="li5">li 文本 5</li></ul>
</body></html>

结果:

相同权重,写在后面的代码优先级高

所谓 长江后浪推前浪,前浪死在岸边上,嗯...css 选择器的权重,就是这个道理,没有先来后到,只有后来居上。

外部样式的 link 和 内部样式的 style 都是一样的道理,谁是后浪谁最大。

此规则也适用于交叉选择相同权重的选择器,如 .body .ul #li2.body #ul .li2,权重计算结果都是 0,1,2,0,谁在后面谁最大。

类选择器、属性选择器、伪类选择器权重相同。所以 ul li.li3ul li[id="li3"]ul li:nth-child(3) 优先级一样,也适用于,谁在后面谁最大。

示例:

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS</title><style>.ul .li1 {color: red;}.ul .li1 {color: blue;}.body .ul #li2 {color: blue;}.body #ul .li2 {color: red;}.ul li.li3 {color: blue;}.ul li[id="li3"] {color: red;}.ul li:nth-child(3) {color: green;}</style>
</head><body class="body"><ul id="ul" class="ul"><li id="li1" class="li1">li 文本 1</li><li id="li2" class="li2">li 文本 2</li><li id="li3" class="li3">li 文本 3</li><li id="li4" class="li4">li 文本 4</li><li id="li5" class="li5">li 文本 5</li></ul>
</body></html>

结果:

干不过的内联样式

内联样式(又称为 行内样式) style 优先级比任何选择优先级都高。

示例:

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS</title><style>#li1 {color: red;}</style>
</head><body class="body"><ul id="ul" class="ul"><li id="li1" class="li1" style="color: blue;">li 文本 1</li><li id="li2" class="li2">li 文本 2</li><li id="li3" class="li3">li 文本 3</li><li id="li4" class="li4">li 文本 4</li><li id="li5" class="li5">li 文本 5</li></ul>
</body></html>

结果:

外挂般的 !important

功夫再高,也怕菜刀,!important 就是这菜刀外挂。css 的优先级里面,只要有了 !important,它比任何选择器都高,包括内联样式。

!important 可以写在任何 css 属性后面,给其附加外挂,如果都有外挂,那么又到了比较权重的时候了。

示例:

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS</title><style>#li1 {color: red !important;}#li2 {color: red !important;}</style>
</head><body class="body"><ul id="ul" class="ul"><li id="li1" class="li1" style="color: blue;">li 文本 1</li><li id="li2" class="li2" style="color: blue !important;">li 文本 2</li><li id="li3" class="li3">li 文本 3</li><li id="li4" class="li4">li 文本 4</li><li id="li5" class="li5">li 文本 5</li></ul>
</body></html>

结果:

神奇的伪元素选择器

伪元素选择器如流氓一般,跳出三界外,不在五行中,!important 也拿它没办法。

示例:

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS</title><style>/* 匹配第一个文字 */::first-letter {color: #990099;}/* 匹配第一行文本 */::first-line {color: green;}</style>
</head><body class="body"><ul id="ul" class="ul"><li id="li1" class="li1" style="color: red !important;">标签 li 文本 1 <br> 第二行</li><li id="li2" class="li2">标签 li 文本 2</li><li id="li3" class="li3">标签 li 文本 3</li><li id="li4" class="li4">标签 li 文本 4</li><li id="li5" class="li5">标签 li 文本 5</li></ul>
</body></html>

::first-line 命中第一行文本,::first-letter 命中第一个字符,style="color: red !important;" 强制设为红色。

然而就算是内联样式,并且有 !important 存在,也没打赢 ::first-line

然而就算 ::first-line 写在后面,也输给了前面的 ::first-letter

结果:

可以理解为伪元素选择器直接作用于独立的渲染实体(比如第一行文本、第一个字符),而其他选择器命中的规则是设置在元素之上,内部文本其实是继承了元素的样式,由于继承的样式权重最低,所以就算元素上带有 !important 规则,也无法覆盖伪元素选择器的样式。

关系选择器如小透明一般

.ul > .li1.ul .li1 好像多了一层,然而两者权重相同,写在后面的优先级高。

示例:

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS</title><style>.ul > .li1 {color: red;}.ul .li1 {color: blue;}</style>
</head><body class="body"><ul id="ul" class="ul"><li id="li1" class="li1">标签 li 文本 1</li><li id="li2" class="li2">标签 li 文本 2</li><li id="li3" class="li3">标签 li 文本 3</li><li id="li4" class="li4">标签 li 文本 4</li><li id="li5" class="li5">标签 li 文本 5</li></ul>
</body></html>

结果:

总结

!important > 行内样式 > ID选择器 > 类选择器/属性选择器/伪类选择器 > 标签选择器/伪元素选择器 > 通配符选择器。关系选择器本身不单独存在,它们的优先级取决于其中的各个选择器的组合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/909372.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握设计模式--状态模式

状态模式(State Pattern) 状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,看起来像是改变了其类。这种模式通常用于解决对象在运行时状态多变且行为复杂的问题。 核心思想:将状态与行为绑定,每种状态对应一个具体类有独立的行为逻…

MySQL 主从复制:数据库的克隆军团

MySQL 主从复制:数据库的"克隆军团" 👯‍♂️ 如果说数据库世界也有科幻电影,那么 MySQL 的主从复制绝对堪比《星球大战》中的克隆人军队,一个原版,无数复制品,却保持着惊人的同步... 什么是主从复制?🤔 MySQL 主从复制是一种数据库技术,允许将一台 MySQL…

必看!Spring Boot 项目新老版本 Controller 低侵入式切换实战秘籍

在当今快速迭代的软件开发环境中,项目的迁移重构是许多开发团队都绕不开的工作。最近,业务方的一个项目就面临着这样的挑战,而在迁移重构的过程中,如何确保下游系统对接无感知成为了重中之重。具体来说,他们需要实现这样一个需求:读请求访问老版本 Controller 时,能够无…

第6章 异步原理

第6章 异步原理 6.1 生成代码的结构 异步模式的实现原理是基于 状态机 的,它负责追踪 async 方法当前的执行进度。从逻辑上讲,可以分为以下 4 种状态:未启动 正在执行 暂停 完成(成功或 faulted)Eureka 这里的“暂停”,指程序运行至 await 处,任务未完成时,当前方法在此…

用Arduino开发STM32

参考文档: https://blog.csdn.net/weixin_42880082/article/details/121619101 qq:505645074

【重点】文件摆渡系统如何简化跨平台跨网络的文件传输?

在当今数字化时代,企业数据的流动性和安全性变得愈发重要。随着业务规模的扩大和全球化协作的深入,跨平台、跨网络的文件传输需求日益增长。然而,传统的文件传输方式往往面临效率低下、安全性不足、兼容性差等问题。文件摆渡系统作为一种专门设计用于简化跨平台、跨网络文件…

想让你多爱自己一些的开源计时器

我用过 Pomotroid、Reminders MenuBar、Timer 等众多优秀、开源的番茄时钟和计时工具,它们帮我更高效地管理时间,让我更专注地投入工作。 但有一个问题始终困扰着我:每当计时结束时,我总是习惯性地忽略休息提醒,继续沉浸在手头的事情中,直到第二天身体不适才追悔莫及。 最…

VMware ESXi 8.0U3d macOS Unlocker OEM BIOS 标准版和厂商定制版,已适配主流品牌服务器

VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 标准版和厂商定制版,已适配主流品牌服务器VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 标准版和厂商定制版 ESXi 8.0U3d 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日…

AMS1117-LDO(线性稳压器)稳压电路

AMS1117-LDO(线性稳压器)稳压电路 原理图引脚说明编号 名称 功能描述1 GND GND2 VOUT 输出3 VIN 输入4 VOUT 输出拓展C8和C7为输出滤波电容,用于抑制自激振荡。如果这两个电容不接,线性稳压器的输出通常会是一个振荡波形。 电容C5和C6是输入电容。对于交流电压整流输入,它…

Avalonia 界面效果 滚动的渐变矩形边框

本文将和大家介绍一个 Avalonia 界面效果,制作一个滚动的渐变矩形边框本文代码基于 Avalonia 11.2.x 版本实现,预期在其他 Avalonia 版本也能正常使用 本文效果由 晓嗔戈 提供,我只是记录此实现方法的工具人 界面效果如下图所示,录制的gif中颜色存在一些偏差,动画有些卡顿…

Avalonia 界面效果 三个圆实现模糊界面动效背景

本文将和大家介绍一个 Avalonia 动效界面效果,由三个圆带模糊效果实现的模糊界面动效背景,适合用在各种 AIGC 主题的应用里面本文代码基于 Avalonia 11.2.x 版本实现,预期在其他 Avalonia 版本也能正常使用 本文效果由 晓嗔戈 提供,我只是记录此实现方法的工具人 界面效果如…

儿子的画

昨天儿子在幼儿园学习了自制小册子,并在上面画画。 晚上睡觉前,心血来潮想要再展示一下他在学校是怎么弄的,于是又一顿操作起来,动作还算麻利,只是完成之后都已过十点了,非要我们帮他配上文字,我一开始不明就理,以为写个标题就好了..., 但最后终于搞懂他是要我帮忙下一…