方式一:值相加

我们先去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优先级的两种理解方式的更多相关文章

  1. css 水平垂直居中两种常用方式

  2. 原生js更改css样式的两种方式

    下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3  &quo ...

  3. 【javascript】原生js更改css样式的两种方式

    下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3  &quo ...

  4. css中两种居中方式text-align:center和margin:0 auto 的使用场景

    关于使用text-align:center和margin:0 auto 两种居中方式的比较 前言:最近由于要学习后端,需要提前学习一部分前端知识,补了补css知识,发现狂神在讲这一部分讲的不是特别清楚 ...

  5. JavaScript 函数的两种声明方式

    1.函数声明的方式 JavaScript声明函数有两种选择:函数声明法,表达式定义法. 函数声明法 function sum (num1 ,num2){ return num1+num2 } 表达式定 ...

  6. 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解

    1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...

  7. Android四大组件之服务的两种启动方式详解

    Service简单概述 Service(服务):是一个没有用户界面.可以在后台长期运行且可以执行操作的应用组件.服务可由其他应用组件启动(如:Activity.另一个service).此外,组件可以绑 ...

  8. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  9. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

随机推荐

  1. Spring 由构造函数自动装配

    Spring 由构造函数自动装配,这种模式与 byType 非常相似,但它应用于构造器参数. Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 ...

  2. 避免scrollview内部控件输入时被键盘遮挡,监听键盘弹起,配合做滚动

    1,监听键盘 2,根据当前键盘弹起高度与控件的底部位置计算滑动距离 3,根据滑动距离在键盘弹起和隐藏是分别设置动画完成滑动     实现: 1,监听键盘使用   #pragma mark - 键盘监听 ...

  3. BZOJ 1028 BZOJ 1029 //贪心

    1028: [JSOI2007]麻将 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2197  Solved: 989[Submit][Status][ ...

  4. OpenStack之Neutron模块

    一:简介     一.概述 1. 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要创建.修改和删除网络 ...

  5. Java程序员的两项通用能力

    工作这几年来,经历了很多.从小白到中级(手机里有一款叫中国象棋的游戏,里面给对弈中电脑水平分为小白.菜鸟.新手.入门.初级.中级.高级.大师.特级大师,编程我暂且按照这样来区分). 学校教给我的是从小 ...

  6. 剑指Offer之替换空格

    题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 函数实现: package s ...

  7. 机器人操作系统——ROS,Robot Operating System

    Note:偶然看到的滴滴研究院的无人驾驶竞赛,了解一下. ROS:专为机器人软件开发所设计出来的一套电脑操作系统架构.是一个开源的元级操作系统(后操作系统),提供类似操作系统的服务,包括硬件抽象描述. ...

  8. 【Oracle】系统视图USER_TAB_COLS和USER_TAB_COLUMNS

    视图SYS.USER_TAB_COLS和SYS.USER_TAB_COLUMNS都保存了当前用户的表.视图和Clusters中的列信息.通过检索这两个表,可以方便的获取到表的结构. 主要的列属性有:  ...

  9. 我的第一个jQuery插件开发(日期选择器,datePicker),功能还不完善,但用于学习参考已经足够了。

    一.学习jQuery插件开发网上的帖子很多,插件开发的方式也有好几种,现在推荐一个帖子讲述的特别好,我也是这篇文张的基础上学习的. 参考:http://www.cnblogs.com/ajianbey ...

  10. 练习使用shell在阿里云安装MySQL

    #!/bin/bash #阿里云初始安装MySQL #step1:查寻MariaDB 并卸载 MariaDB_filename=`rpm -qa|grep mariadb` if [ -d " ...