繼承(inheritance)是從乙個元素向其後代元素傳遞屬性值所採用的機制。確定應當向乙個元素應用哪些值時,戶**不僅要考慮繼承,還要考慮宣告的特殊性,另外需要考慮宣告本身的**。這個過程就稱為層疊(cascade)。本章將討論這3種機制之間的關聯:特殊性、繼承和層疊。
實際上,可能同乙個元素可以使用兩個或多個規則來選擇,每個規則都有其自己的選擇器。
顯然,每一對規則中只有乙個勝出,因為所匹配的元素只能是某一種顏色。那麼怎麼知道哪乙個規則更強呢?
答案就在於每個選擇器的特殊性(specificity)。對於每個規則,使用者**會計算選擇器的特殊性,並將這個特殊性附加到規則中的各個宣告。如果乙個元素有兩個或多個衝突的屬性宣告,那麼有最高特殊性的宣告就會勝出。
那麼特殊性由什麼來定義呢,由組成選擇器的元件確定。
h1
/* 0,0,0,1 */
body
h1/* 0,1,0,2 (winner)*/
h2.grape
/* 0,0,1,1 (winner)*/
h2/* 0,0,0,1 */
html > body
table
tr[id="totals"]
tdul > li
/* 0,0,1,7 */
li#answer
/* 0,1,0,1 (winner)*/
判斷大小時,從高位開始看。0,1,0,0大於0,0,999,999。
對於乙個規則,瀏覽器會將其選擇器依次應用在各個子規則上:
h1, h2
.section
會被解開為:
h1
/* 0,0,0,1 */
h1/* 0,0,0,1 */
h2.section
/* 0,0,1,1 */
h2.section
/* 0,0,1,1 */
有時某個宣告可能非常重要,超過了所有其他宣告。並允許在這些宣告的結束分號之前插 入!important來標誌。
p
.dark
所有!important宣告會分組在一起,重要宣告的特殊性衝突會在重要宣告內部解決,而不會與非重要宣告相混。類似地,我們認為所有非重要宣告也歸為一組,使用特殊性來解決衝突。如果乙個重要宣告和乙個非重要宣告衝突,勝出的總是重要宣告。甚至是內聯樣式也無法勝過重要宣告。
基於繼承機制,樣式不僅應用到指定的元素,還會應用到它的後代元素。
當乙個宣告應用到乙個元素的時候,不僅該元素會採用這個宣告,這個宣告還會沿著數向下轉播到後代元素,並一直繼續,直到沒有後代元素繼承這個值為止。
當然,基於常識,例如border,padding這樣的框模型屬性是不會被繼承的,否則。。。。。。就瘋了。。。
繼承的值完全沒有特殊性,所以如果有使用了萬用字元的0特殊性規則的話,繼承的值會被立刻覆蓋。
CSS 結構和層疊
選擇器的特殊性高低由選擇器本身的組成決定,特殊性高的會勝出,採用其申明的方式render.選擇器特權重計算方式 id 加 0,1,0,0 類,屬性 加 0,0,1,0 元素,偽元素 加 0,0,0,1 結合符和萬用字元 0,0,0,0 如選擇器是多個組合,需要求和。求和時不需要進製,位數高的比位數低...
CSS 結構和層疊
特殊性 特殊性 specificity 對於每個規則,使用者 會計算選擇器的特殊性並將特殊性附加到規則中的各個宣告。如果乙個元素有兩個或多個衝突的屬性宣告,有最高特殊性的宣告就會勝出。選擇器的特殊性由選擇器本身元件確定,特殊性值表述為4個部分。特殊性排序從左向右,特殊性值為1,0,0,0大於以0開頭...
CSS學習筆記(三) 繼承 結構和層疊
要解決的問題 當兩條樣式規則衝突時,瀏覽器會如何決定採用哪一條渲染頁面?每個合法的文件都會生成乙個文件樹 js裡面的dom?從而根據各個元素的祖先 兄弟關係來選擇元素,應用樣式規則。1 特殊性 或稱具體性 權值 同乙個元素有多條規則時,通過給每條宣告中不同元素賦予不同的值,計算這條宣告的值,取值比較...