CSS的選擇器是有權(quán)重的,當(dāng)不同選擇器的樣式設(shè)置有沖突時(shí),會(huì)采用權(quán)重高的選擇器設(shè)置樣式。權(quán)重(即優(yōu)先級)的規(guī)則如下,權(quán)重越高,優(yōu)先級越高:
同一個(gè)元素可以使用多個(gè)規(guī)則來指定它的同一樣式(比如字體顏色),每個(gè)規(guī)則都有自己的選擇器。顯然最終只有一個(gè)規(guī)則起作用(不可能一個(gè)字既是紅色又是綠色),那么該規(guī)則的特殊性最高,特殊性即css優(yōu)先級。很多人僅僅知道選擇器優(yōu)先級:ID>class>元素選擇器,而不知道ID的優(yōu)先級為什么大于class的優(yōu)先級。那么css優(yōu)先級到底是怎么計(jì)算的呢?
選擇器的特殊性值表述為4個(gè)部分,用0,0,0,0表示:
選擇器特殊性值是從左向右排序的,特殊性值1,0,0,0大于以0開頭的所有特殊性值,即便它是0,99,99,99,優(yōu)先級依然比1,0,0,0要低。
很多人都知道a標(biāo)簽有四種狀態(tài):鏈接訪問前、鏈接訪問后、鼠標(biāo)滑過、激活,分別對應(yīng)四種偽類:link、:visited、:hover、:active,并且這四個(gè)偽類如果對同一個(gè)元素設(shè)置同一個(gè)屬性,那它們的聲明順序還有一定要求,一般大家都遵循“愛恨原則LVHA”(LoVe HAte),為什么是這個(gè)順序?不能是其它順序嗎?
根據(jù)css優(yōu)先級計(jì)算規(guī)則,偽類的特殊性值是0,0,1,0,4個(gè)偽類的特殊性值相同,那么后面聲明的規(guī)則優(yōu)先級高。當(dāng)鼠標(biāo)滑過a鏈接時(shí),滿足:link和:hover兩個(gè)偽類,要改變a標(biāo)簽的顏色,就必須將:hover偽類在:link偽類后面聲明;同理,當(dāng)鼠標(biāo)點(diǎn)擊激活a鏈接時(shí),同時(shí)滿足:link、:hover、:active三種狀態(tài),要顯示a標(biāo)簽激活時(shí)的樣式(:active),必須將:active聲明放到:link和:hover之后。因此得出LVHA這個(gè)順序。這個(gè)順序能不能變?可以,但也只有:link和:visited可以交換位置,因?yàn)橐粋€(gè)鏈接要么訪問過要么沒訪問過,不可能同時(shí)滿足,也就不存在覆蓋的問題。
前面提到!important屬性,!important是用來使IE6和IE7、IE8、火狐(Firefox)、google等瀏覽器做兼容的,但I(xiàn)E6不能執(zhí)行!important。當(dāng) !important 規(guī)則被應(yīng)用在一個(gè)樣式聲明中時(shí),該樣式聲明會(huì)覆蓋CSS中任何其他的聲明, 無論它處在聲明列表中的哪個(gè)位置. 盡管如此, !important規(guī)則還是與優(yōu)先級毫無關(guān)系.使用 !important不是一個(gè)好習(xí)慣,因?yàn)樗淖兞四銟邮奖肀緛淼募壜?lián)規(guī)則,從而難以調(diào)試。
在使用!important時(shí)需要注意:
什么時(shí)候應(yīng)該使用:
A) 一種情況
你的網(wǎng)站上有一個(gè)設(shè)定了全站樣式的CSS文件,同時(shí)你(或是你同事)寫了一些效果通常都是很差的行內(nèi)樣式(行內(nèi)樣式的優(yōu)先級是最高的)。在這種情況下,你就可以在你全局的CSS文件中寫一些!important的樣式來覆蓋掉那些直接寫在元素上的行內(nèi)樣式。
B) 另一種情況
在外層有 #someElement 的情況下,你怎樣能使 awesome 的段落變成紅色呢?這種情況下,如果不使用!important,第一條規(guī)則永遠(yuǎn)比第二條的優(yōu)先級更高。
怎樣覆蓋掉 !important:
很簡單,你只需要再加一條!important 的CSS語句,將其應(yīng)用到更高優(yōu)先級的選擇器(在原有基礎(chǔ)上添加額外的標(biāo)簽、class或id選擇器)上;或是保持選擇器一樣,但添加的位置需要在原有聲明的后面(優(yōu)先級相同的情況下,后邊定義的會(huì)覆蓋前邊定義的)。
或:
Author:致知
Sign:路漫漫其修遠(yuǎn)兮,吾將上下而求索。