CSS优先级的两种理解方式
方式一:值相加
我们先去MDN看看官方的解释:
优先级是如何计算的?
优先级就是分配给指定的 CSS 声明的一个权重,它由 匹配的选择器中的 每一种选择器类型的 数值 决定。而当优先级与多个 CSS 声明中任意一个声明的优先级相等的时候,CSS 中最后的那个声明将会被应用到元素上。
当同一个元素有多个声明的时候,优先级才会有意义。因为每一个直接作用于元素的 CSS 规则总是会接管/覆盖(take
over)该元素从祖先元素继承而来的规则。
我们从上面一段描述中得到个很重要的信息:权重
我们再来看选择器优先级关系:ID选择器 > 类选择器 = 属性选择器 = 伪类选择器 > 标签选择器 = 伪元素选择器。
看来真相已经呼之欲出了。
我们只要给不同类型的选择器设定一个权重值,然后在根据选择器的数量进行相加,就很容易得出优先级,例如:
ID选择器的权重值设为 1000
类选择器 、属性选择器 、伪类选择器的权重值设为 100
标签选择器、伪元素选择器的权重值设为 10
我们可以很快速的计算出下面这段CSS的权重值并作出正确的判断。
//权重值1110
#app .menu .item{}
//权重值210
.menu.menu .item{}
//权重值30
.item.item.item{}
可是。。。细心的你可能会发现只要低优先级的选择器数量足够多(例如: .item...x200 {}),那么低优先级的权重值就可以超过高优先级的权重值,但实际效果其实还是以高优先级样式为准。当出现这种情况时可能用现在的权重值计算方式就无法解释了!
当然可以通过限制选择器的最大数量及拉大选择器的权重值数值还是可以解释的,但我总觉得这不是一种好的实现方式。
方式二:bit位存储
我们假设权重值是用unsigned int变量存储,那么该变量的bit位一共有32位(4字节),我们从高位按字节展开如下:
字节1:00000000
字节2:00000000
字节3:00000000
字节4:00000000
按字节和选择器对应:
字节1:00000000
字节2:00000000 ;ID选择器
字节3:00000000 ;类选择器 、属性选择器 、伪类选择器
字节4:00000000 ;标签选择器、伪元素选择器
相同类型选择器直接进行个数相加,并填入到指定字节内。
例1:
#app .menu .item{}
得到的权重值bit位如下:
00000000 00000001 00000001 00000001
结果为:65793
例2:
.menu.menu .item{}
得到的权重值bit位如下:
00000000 00000000 00000010 00000001
结果为:513
例3:
.item.item.item{}
得到的权重值bit位如下:
00000000 00000000 00000000 00000011
结果为:3
上面示例中位存储容量只有8位,所以选择器的最大限制为255,当然我们可以提高bit位来提高选择器的最大值。
总结
这里介绍了2种CSS优先级理解方式,你觉得那种更适合你呢?
CSS优先级的两种理解方式的更多相关文章
- css 水平垂直居中两种常用方式
- 原生js更改css样式的两种方式
下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3 &quo ...
- 【javascript】原生js更改css样式的两种方式
下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3 &quo ...
- css中两种居中方式text-align:center和margin:0 auto 的使用场景
关于使用text-align:center和margin:0 auto 两种居中方式的比较 前言:最近由于要学习后端,需要提前学习一部分前端知识,补了补css知识,发现狂神在讲这一部分讲的不是特别清楚 ...
- JavaScript 函数的两种声明方式
1.函数声明的方式 JavaScript声明函数有两种选择:函数声明法,表达式定义法. 函数声明法 function sum (num1 ,num2){ return num1+num2 } 表达式定 ...
- 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解
1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...
- Android四大组件之服务的两种启动方式详解
Service简单概述 Service(服务):是一个没有用户界面.可以在后台长期运行且可以执行操作的应用组件.服务可由其他应用组件启动(如:Activity.另一个service).此外,组件可以绑 ...
- Android中BroadcastReceiver的两种注册方式(静态和动态)详解
今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...
- Android中Fragment与Activity之间的交互(两种实现方式)
(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...
随机推荐
- 【漫画】ES原理 必知必会的倒排索引和分词
倒排索引的初衷 倒排索引,它也是索引.索引,初衷都是为了快速检索到你要的数据. 我相信你一定知道mysql的索引,如果对某一个字段加了索引,一般来说查询该字段速度是可以有显著的提升. 每种数据库都有自 ...
- SXSSFWorkbook的简单使用
在工作中使用到SXSSFWorkbook来导出Excel,写一篇博客记录一下SXSSFWorkbook的使用方法 1.介绍 SXSSFWorkbook是属于apache基金会的Excel导出工具类,从 ...
- 【Oracle】CentOS7/CentOS8命令行安装Oracle 11G R2
写在前面 很长一段时间内,国内互联网公司都在提倡"去IOE",但是很多企业还是愿意为昂贵的Oracle数据库买单,不少读者所在的公司也在用Oracle,很多读者自行安装Oracle ...
- PHP 调用qq邮箱接口
html代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...
- 组件-vue自定义方法传递
组件样式 面包屑导航栏 js Vue.component('bannerOne', { created() { console.log(this.bigbackColor); }, props: { ...
- (三)vue数据绑定及相应的命令
vue数据绑定及相应的命令 {{ Text }} 双括号进行数据渲染 动态绑定数据 例如:{{message}} data: { return{ message: 'Hello Vue!' } } 2 ...
- [安卓基础] 003.建立你的第一个App
创建一个android工程项目 我们使用android提供的集成开发工具(Eclipse+ADT)来创建android工程项目.用这个集成开发工具创建项目,简单,方便,快捷,且自动帮助我们生成基础的文 ...
- [PHP学习教程 - 网络]001.下载/采集远程文件到本地(Download File)
引言:如何把http://mzitu.com里的图片全部下载下来呢? 一身浩然正气的AC陷入的深思.... 当然这里涉及到的功能有线程,网页请求,页面提取,下载图片等等.今天,我们先讲一下如何下载文件 ...
- C/C++多参数函数参数的计算顺序与压栈顺序
一.前言 今天在看Thinking in C++这本书时,书中的一个例子引起了我的注意,具体是使用了下面这句 单看这条语句的语义会发现仅仅是使用一个简单的string的substr函数将所得子串pus ...
- lunix如何查看防火墙是否关闭和关闭开启防火墙命令
查看防火墙是否关闭的命令如下: 1.通过 /etc/init.d/iptables status 或者 service iptables status命令 2.通过 iptables -L命令 查看 ...