CSS優(yōu)先級(jí)的兩種理解方式

方式一:值相加
我們先去MDN看看官方的解釋:
優(yōu)先級(jí)是如何計(jì)算的?
優(yōu)先級(jí)就是分配給指定的 CSS 聲明的一個(gè)權(quán)重,它由 匹配的選擇器中的 每一種選擇器類型的 數(shù)值 決定。
而當(dāng)優(yōu)先級(jí)與多個(gè) CSS 聲明中任意一個(gè)聲明的優(yōu)先級(jí)相等的時(shí)候,CSS 中最后的那個(gè)聲明將會(huì)被應(yīng)用到元素上。
當(dāng)同一個(gè)元素有多個(gè)聲明的時(shí)候,優(yōu)先級(jí)才會(huì)有意義。因?yàn)槊恳粋€(gè)直接作用于元素的 CSS 規(guī)則總是會(huì)接管/覆蓋(take
over)該元素從祖先元素繼承而來(lái)的規(guī)則。
我們從上面一段描述中得到個(gè)很重要的信息: 權(quán)重
我們?cè)賮?lái)看選擇器優(yōu)先級(jí)關(guān)系:ID選擇器 > 類選擇器 = 屬性選擇器 = 偽類選擇器 > 標(biāo)簽選擇器 = 偽元素選擇器。
看來(lái)真相已經(jīng)呼之欲出了。
我們只要給不同類型的選擇器設(shè)定一個(gè)權(quán)重值,然后在根據(jù)選擇器的數(shù)量進(jìn)行相加,就很容易得出優(yōu)先級(jí),例如:
ID選擇器的權(quán)重值設(shè)為 1000
類選擇器 、屬性選擇器 、偽類選擇器的權(quán)重值設(shè)為 100
標(biāo)簽選擇器、偽元素選擇器的權(quán)重值設(shè)為 10
我們可以很快速的計(jì)算出下面這段CSS的權(quán)重值并作出正確的判斷。
//權(quán)重值1110 #app .menu .item{} //權(quán)重值210 .menu.menu .item{} //權(quán)重值30 .item.item.item{}
可是。。。細(xì)心的你可能會(huì)發(fā)現(xiàn)只要低優(yōu)先級(jí)的選擇器數(shù)量足夠多(例如: .item...x200 {} ),那么低優(yōu)先級(jí)的權(quán)重值就可以超過(guò)高優(yōu)先級(jí)的權(quán)重值,但實(shí)際效果其實(shí)還是以高優(yōu)先級(jí)樣式為準(zhǔn)。當(dāng)出現(xiàn)這種情況時(shí)可能用現(xiàn)在的權(quán)重值計(jì)算方式就無(wú)法解釋了!
當(dāng)然可以通過(guò)限制選擇器的最大數(shù)量及拉大選擇器的權(quán)重值數(shù)值還是可以解釋的,但我總覺(jué)得這不是一種好的實(shí)現(xiàn)方式。
方式二:bit位存儲(chǔ)
我們假設(shè)權(quán)重值是用 unsigned int 變量存儲(chǔ),那么該變量的 bit 位一共有32位(4字節(jié)),我們從高位按字節(jié)展開(kāi)如下:
字節(jié)1:00000000
字節(jié)2:00000000
字節(jié)3:00000000
字節(jié)4:00000000
按字節(jié)和選擇器對(duì)應(yīng):
字節(jié)1:00000000
字節(jié)2:00000000 ;ID選擇器
字節(jié)3:00000000 ;類選擇器 、屬性選擇器 、偽類選擇器
字節(jié)4:00000000 ;標(biāo)簽選擇器、偽元素選擇器
相同類型選擇器直接進(jìn)行個(gè)數(shù)相加,并填入到指定字節(jié)內(nèi)。
例1:
#app .menu .item{}
得到的權(quán)重值 bit 位如下:
結(jié)果為:65793
例2:
.menu.menu .item{}
得到的權(quán)重值 bit 位如下:
結(jié)果為:513
例3:
.item.item.item{}
得到的權(quán)重值 bit 位如下:
結(jié)果為:3
上面示例中位存儲(chǔ)容量只有8位,所以選擇器的最大限制為255,當(dāng)然我們可以提高bit位來(lái)提高選擇器的最大值。
總結(jié)
這里介紹了2種CSS優(yōu)先級(jí)理解方式,你覺(jué)得那種更適合你呢?
感興趣的朋友可以給小編留言,說(shuō)出你的想法。
相關(guān)文章
- 這篇文章主要介紹了CSS優(yōu)先級(jí)計(jì)算的規(guī)則,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-17
- 下面小編就為大家?guī)?lái)一篇css優(yōu)先級(jí)計(jì)算方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-19
- CSS在使用選擇器對(duì)元素施加屬性的時(shí)候會(huì)有先后順序,包括特殊性和重要性等概念在內(nèi),這里我們就來(lái)詳解CSS中的選擇器優(yōu)先級(jí)順序,需要的朋友可以參考下2016-06-21
詳解CSS中的選擇器優(yōu)先級(jí)及樣式層疊問(wèn)題解決
CSS中的選擇器是分權(quán)重的,如果不加注意則很有可能會(huì)遇到樣式層疊的問(wèn)題,下面我們就來(lái)詳解CSS中的選擇器優(yōu)先級(jí)及樣式層疊問(wèn)題解決,需要的朋友可以參考下2016-06-14CSS z-index 層級(jí)關(guān)系優(yōu)先級(jí)的概念
這篇文章主要介紹CSS z-index 層級(jí)關(guān)系優(yōu)先級(jí)的概念,講解的比較詳細(xì),需要的朋友可以參考下。2016-06-06