任何地方都存在阶级,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选择器 > 类选择器/属性选择器/伪类选择器 > 标签选择器/伪元素选择器 > 通配符选择器。关系选择器本身不单独存在,它们的优先级取决于其中的各个选择器的组合。

Web前端入门第 23 问:CSS 选择器的优先级的更多相关文章

  1. Web前端面试指导(十三):css样式的优先级是怎么样的?

    题目点评 CSS样式的优先级规则给人的感觉总是摸不透,更不用说怎么去表达了,在网络上流传着很多版本,描述的都很复杂也不全面,看了之后还是不满意.我来给大家介绍一个比较系统.全面有比较容易记住的规则吧! ...

  2. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  3. 进击的Python【第十三章】:Web前端基础之HTML与CSS样式

    进击的Python[第十四章]:Web前端基础之HTML与CSS样式 一.web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客 ...

  4. 好程序员web前端分享18个用CSS制作出来的东西

    好程序员web前端分享18个用CSS制作出来的东西,与流行的看法相反,CSS不仅仅是用来提供一个WEB页面的基本风格,以使它看起来更有吸引力.还有很多其他的事情,CSS也可以做的很好.由于它创建动画和 ...

  5. 好程序员web前端分享值得参考的css理论:OOCSS、SMACSS与BEM

    好程序员web前端分享值得参考的css理论:OOCSS.SMACSS与BEM 最近在The Sass Way里看到了Modular CSS typography一文,发现文章在开头部分就提到了OOCS ...

  6. Android零基础入门第23节:ImageButton和ZoomButton使用大全

    原文:Android零基础入门第23节:ImageButton和ZoomButton使用大全 上一期我们学习了ImageView的使用,那么本期来学习ImageView的两个子控件ImageButto ...

  7. CSS选择器以及优先级与匹配原理

    最常用的五类CSS选择器 准确而简洁的运用CSS选择器会达到非常好的效果.我们不必通篇给每一个元素定义类(class)或ID,通过合适的组织,可以用最简单的方法实现同样的效果.在实际工作中,最常用的选 ...

  8. 详解CSS选择器、优先级与匹配原理

    原文链接:http://polaris1119.javaeye.com/blog/764428 作为一个Web开发者,掌握必要的前台技术也是很重要的,特别是在遇到一些实际问题的时候.这里给大家列举一个 ...

  9. 转载:详解CSS选择器、优先级与匹配原

    转载网址:http://polaris1119.javaeye.com/blog/764428 文章就CSS选择器的优先级问题做了一些总结,严格来讲,选择器的种类可以分为三种:标签名选择器.类选择器和 ...

  10. CSS选择器、优先级和匹配原理

    作为一个Web开发者,掌握必要的前台技术也是很重要的,特别是在遇到一些实际问题的时候.这里给大家列举一个例子: 给一个p标签增加一个类(class),可是执行后该class中的有些属性并没有起作用.通 ...

随机推荐

  1. Python串口实现dk-51e1单相交直流标准源通信

    Python实现dk-51e1单相交直流标准源RS232通信 使用RS232,信号源DK51e1的协议帧格式如下: 注意点 配置串口波特率为115200 Check异或和不需要加上第一个0x81的字段 ...

  2. BigTable-列族存储

    BigTable 其实就是 Google 设计的分布式结构化数据表. Bigtable 的设计动机: 需要存储的数据种类繁多,包括URL.网页内容.用户的个性化设置在内的数据都是Google需要经常处 ...

  3. C#NPOI示例

    主程序要添加NPOI的库.代码如下 static void Main(string[] args) { Export(); } public static void Export() { // 创建新 ...

  4. centos8网络配置问题

    由于RHEL8与centos8基本一样,所以以下方法同样适用于RHEL8 在centos8上进行网络配置时,出现以下问题: 意思是无法找到network.service 出现错误的原因是centos8 ...

  5. 寻找AI新势力!“天翼云息壤杯”高校AI大赛火热报名中!

    各位高校开发者们, AI舞台已就位,你准备好了吗? 为加快落实"人工智能+"行动,中国电信集团有限公司充分发挥央企在人工智能领域主力军作用,联合华为技术有限公司共同举办" ...

  6. 天翼云重磅升级边缘WAF能力,助力企业高效应对Web安全威胁!

    "2022年,网络高危漏洞数量同比增长了13%:Q2遭受攻击的API数量月均超过了25万:物联网的普及大大降低了DDoS的攻击成本,大流量攻击指数显著提升:恶意Bot流量仍在持续增长,202 ...

  7. Calcite 获取jdbc连接流程

    一.类调用 简介:calcite可以连接各数据源,做查询.可以收口查询权限,查询多引擎需求 二. 获取Connection发送的请求 请求介绍文档:https://calcite.apache.org ...

  8. Luogu P1777 帮助 题解 [ 紫 ] [ 线性 dp ] [ 状压 dp ]

    帮助:大毒瘤!!!调了我2h,拍了我2h,最后没调出来,重写才AC.wdnmd. 思路 这题主要是线性 dp ,而状压 dp 只是最后在统计答案时的一个辅助. 首先定义 \(dp[i][j][k]\) ...

  9. 用 just 简化项目命令管理

    在软件开发过程中,高效管理项目命令是提升开发效率的关键, 它们可以帮助我们自动化重复的任务,简化项目管理流程,提高效率. 今天,我们来介绍一个名为 just 的任务运行器. 它由 Casey 发起,用 ...

  10. MySQL - [01] 安装部署

    题记部分 一.Windows安装部署 1.1.下载 (1)官网下载 MySQL的安装包,点此访问官网.[注意:MySQL不要安装到系统盘] (2)点击 DOWNLOADS > MySQL Com ...