方法一:加值我们去MDN看看官方的解释:优先级是怎么计算的?优先级是分配给给定CSS声明的权重,由匹配的选择器中每个选择器类型的值决定。当优先级等于多个CSS声明中任何一个的优先级时,CSS中的最后一个声明将应用于该元素。仅当同一元素有多个声明时,优先级才重要。因为直接应用于元素的每个CSS规则总是会接管/覆盖(接管)该元素从其祖先那里继承的规则。从上面的描述中我们得到了一个很重要的信息:weight我们再来看看选择器的优先级关系:ID选择器>类选择器=属性选择器=伪类选择器>标签选择器=伪元素选择器。看来真相就要大白了。我们只需要为不同类型的选择器设置一个权重值,然后根据选择器的个数相加,就很容易得到优先级,例如:ID选择器的权重值设置为1000个类选择器,属性选择将标签选择器和伪类选择器的权重值设置为100,将伪元素选择器的权重值设置为10。我们可以快速计算出下面CSS的权重值,并做出正确的判断.//权重值1110#app.menu.item{}//权重值210.menu.menu.item{}//权重值30.item.item.item{}但是。..细心的你可能会发现,只要有足够多的低优先级选择器(例如:.item...x200{}),低优先级的权重值就可以超过高优先级的权重值,但实际效果其实还是高优先级的风格占上风。出现这种情况,用现在的权重值计算方式可能无法解释!当然可以通过限制选择器的最大数量和增加选择器的权重值来解释,但是我总觉得这不是一个很好的实现方式。方法二:位存储我们假设权重值存储在一个unsignedint变量中,那么该变量的位一共有32位(4字节),我们逐字节展开如下:byte1:00000000byte2:00000000byte3:00000000byte4:00000000通过字节和选择器对应:byte1:00000000byte2:00000000;ID选择器字节3:00000000;类选择器、属性选择器、伪类选择器byte4:00000000;同类型的标签选择器和伪元素选择器直接相加,填入指定字节。例一:#app.menu.item{}获取权重值位如下:00000000000000010000000100000001结果为:65793例二:.menu.menu.item{}获取权重值位如下:00000000000000000000001000000001结果为:513例3:.item.item.item{}得到的权重值位如下:00000000000000000000000000000011结果为:3上面的例子中位存储容量只有8位,所以选择器的最大限制是255,当然我们可以增加位来增加选择器的最大值。总结这里有两种理解CSS优先级的方法。你觉得哪一款更适合你?
