層疊樣式表/繼承規則
摘要
術語“CSS 層疊”指的是決策過程,即 web 瀏覽器內部的軟體,它決定將許多層疊樣式表 (CSS) 樣式中的哪一個應用於網頁的每個部分。這很複雜,因為樣式是在許多地方編寫的。存在錯誤、衝突和重複,更不用說瀏覽器、使用者和作者權利的層次結構了。儘管如此,瀏覽器的軟體必須決定對頁面上的每個格式使用哪種樣式,並且即使沒有提供任何有用的樣式,也必須構建一個合理的頁面。
本頁提供了一個基本層疊過程的概述和詳細示例,雖然它能夠在過程中傳授詳細的知識,但並非專門用於教授網頁製作或樣式表製作。
在描述層疊的工作原理之前,它基本上只是瀏覽器功能的一個“部分”,最好回憶一下瀏覽器環境的基本特徵。
- 網頁是使用具有.htm字尾的特定文字檔案開啟的結果。 該檔案可以使用簡單的文字編輯器編寫。它駐留在作為伺服器的遠端計算機上,但也可以駐留在本地個人計算機 (PC) 的某個資料夾中。當它的地址提供給瀏覽器時,該檔案將下載到瀏覽器快取,即 PC 上的臨時儲存位置。.htm 檔案有時被稱為web 文件。
- web 文件中有一些標記,有助於格式化它, web 瀏覽器的作用就是應用樣式。web 文件包含一對標記,稱為標記,它們圍繞著要格式化的文字。這些標記透過說明要使用哪種頁面結構來間接標識格式;例如,列表(<li></li>)、主要標題(<h2></h2>)、子標題(<h3></h3>)、普通段落(<p></p>),或者可能是表格單元格(<td></td>) 。頁面中所有這些不同的元素都可以具有不同的格式。
- 這些標記是HTML語言的一部分,超文字標記語言,儘管可以使用其他語言。web 頁面中的標記名稱,例如<p>中的p,在樣式表中列出,單獨或與其他術語一起列出,正是這些樣式表選擇器列出了預期的格式的描述。也就是說,瀏覽器可以找到正確的樣式表選擇器來格式化元素,因為它們的名稱可以預測地相似。文件元素被稱為該選擇器樣式的預期目標。列出這些格式的檔案型別稱為層疊樣式表 (CSS)。
- 樣式表只是一個具有.css字尾的文字檔案,可以使用簡單的文字編輯器編寫。作者樣式表通常位於與 web 文件本身相同的資料夾中,無論它在哪裡。無論如何,樣式表的名稱和地址由 web 文件中的一個條目提供,因此它在文件本身之後不久便會下載到瀏覽器快取中。實際上,那裡可能列出了幾個樣式表,每個樣式表都會被匯入並處理其樣式,然後才會進行下一個操作,依此類推。
- PC 使用者也可以更改樣式。但他的使用者樣式表駐留在本地計算機上。瀏覽器將此表與所有其他樣式合併,因此兩組樣式都可能影響頁面的某些部分。當然,使用者樣式僅影響本地顯示,而不會被其他人看到。
- 還有其他地方可以找到樣式。它們有時會寫入 web 文件的頭部部分,以及頁面標記中的內聯樣式。瀏覽器也有自己的樣式表,即使用者客戶端表,在其他樣式表丟失時提供基本佈局。有時,瀏覽器的預設設定和內建樣式表也會影響結果。瀏覽器會將所有這些來源的樣式合併。
- 作者樣式由三個來源組成。 這些是;直接寫入 web 文件頭部部分的樣式,頭部部分引用的連結樣式表,以及頁面主要內容中的內聯樣式。有時,這些連結樣式表中的列表本身可以匯入更多樣式表。
- 有些樣式可能比其他樣式具有更高的重要性。 在任何樣式位置中編寫的樣式,包括文件本身上的樣式,都可以具有特殊的!important標記,以將其與普通樣式區分開來。這些標記允許作者或使用者覆蓋普通樣式。此功能在測試中特別有用,或者用於在其他樣式上斷言內建瀏覽器樣式。還有!important和普通樣式中的不同級別,由它們發現的位置決定,即它們所謂的來源(稍後介紹)。
- 有些樣式比其他樣式具有更高的特異性。 樣式表選擇器缺乏普遍性或具有狹窄定義的程度稱為特異性。例如,文件中的一些段落可能只是文件主體的一部分,並且它們的段落樣式適用於一般情況。其他一些可能需要特殊格式,因為它們是位於表格單元格內的段落。瀏覽器可以檢測到這種更具體的標記佈局,並優先考慮最匹配它的選擇器。特異性在層疊的決策過程中很重要,它的規則已經發展到相當大的程度(稍後介紹)。
- 樣式表格式具有一些共同特徵。。圖 1 顯示了樣式表中可能存在的典型樣式塊佈局。在其中,選擇器是一組樣式宣告的主要標籤,每個樣式宣告都包含一個屬性和一個值。在示例中,樣式表的選擇器稱為div ul,它有兩個樣式宣告;一個用於line-height的屬性具有1.8em的值;另一個用於background的屬性具有darkgreen的值。可能選擇器的數量並不限於單個標記名稱,因為在示例中,這些可以複合以表示一組標記在另一組標記內的巢狀。在示例中,此選擇器將其樣式應用於巢狀在 div 標籤對內的每個無序列表,但不應用於它找到的其他無序列表示例。引入類和ID可以為選擇器使用增加更大的特異性。
- Web 標準和規範由全球資訊網聯盟 (W3C) 和其他人管理。對於 CSS 樣式,新的標準會定期作為建議釋出。這些標準在瀏覽器的測試版中進行測試,並收集到發現的不一致和缺陷。最終將釋出新的建議。各種 W3C 教程和規範可以在下面的參見連結中找到。
| 圖 1:CSS 術語,用於描述典型的樣式表條目,即樣式規則。它描述了格式 用於巢狀在劃分塊元素標籤對內的任何無序列表。 花括號之間的宣告分組稱為宣告塊。 |
本節提供了層疊過程的直觀描述,而不是詳細描述。對於那些已經瞭解這些內容的人來說,最好直接跳到部分詳細的層疊示例,在那裡他們可能會更喜歡這項工作。無論如何,對於那些需要學習或提醒自己有關選擇器和特異性的人來說,教程已在部分CSS 教程中提供。對於那些希望瞭解有關 HTML 更多內容的人來說,有一個廣泛的外部參考可在W3 Schools HTML中找到,而對於 CSS,則可在W3 Schools CSS中找到。
為了繼續,瀏覽器會逐個標籤地遍歷網頁,以確定它們的樣式。為此,它首先要識別標籤所在的巢狀或文件樹的一部分。這有助於瀏覽器檢查它找到的選擇器的有效性。然後,它會搜尋所有樣式來源,包括樣式表和文件本身,以查詢可能影響所討論標籤的選擇器,同樣,要記住標籤佈局。如果選擇器適用,則會按發現順序列出其樣式屬性,結果是適用於該特定標籤的屬性長列表。該列表中可能包含許多這樣的宣告樣式,也可能沒有,具體取決於各種編寫者的工作,很明顯,大多數可能已為該標籤宣告的屬性仍然缺失。
樣式宣告可以有特殊的標記,以使它們比普通宣告具有更高的優先順序,它們使用!important關鍵字來標識。它們被稱為重要宣告。在排序其列表時,瀏覽器會將!important宣告與任何普通宣告隔離開來。然後,瀏覽器會識別圖 2 中的五個重要性等級或重要性層級,其中等級 1的優先順序最低,等級 5的優先順序最高。
| 等級 1 | 瀏覽器預設樣式 在使用者代理 (UA) 樣式表中或一些等效的實現中列出的樣式。 |
| 等級 2 | 使用者普通樣式宣告 使用者樣式表中沒有!important 標記的那些樣式。來自特定於網站和內建樣式表的普通宣告也可以合併到這裡。 |
| 等級 3 | 作者普通樣式宣告 作者集合中沒有!important 標記的那些樣式。 它們包括來自文件頭部、連結的樣式表和內聯樣式的樣式。 |
| 等級 4 | 作者!important 樣式宣告 作者集合中有!important 標記的那些樣式。 它們包括來自文件頭部、連結的樣式表和內聯樣式的樣式。 |
| 等級 5 | 使用者!important 樣式宣告 使用者樣式表中有!important 標記的那些樣式。 來自特定於網站和內建樣式表的!important 宣告也可以合併到這裡。 |
列表上的每個屬性條目都標記著五個重要性等級之一,具體取決於選擇器的來源以及它是否為普通或重要宣告。這些專案還標記著它們的特異性,這些特異性是反映其應用範圍有多窄的加權值。每個來源位置都做了標記,該標記會標識發現的位置及其在樣式表中的位置。
然後,對資料集進行排序,以對所有類似的屬性進行分組,然後在找到的任何類似集合內(例如,十個不同的字型大小建議),進一步對它們進行排序,以獲得最高的重要性。對於這些排序後的任何密切競爭的集合,再次按最高特異性對它們進行排序,以最終隔離列表中每個不同屬性的值。如果兩個宣告仍然匹配,則最後一個決定性的排序是來源位置,它們是在其中找到的;也就是說,最後考慮用於列出的那個將勝出。圖 3 的圖形描繪了級聯樣式在解析單個段落標籤格式時所涉及的級聯,其詳細資訊與後面部分中的詳細示例相同。
在確定了哪些格式適用於特定標籤後,瀏覽器會對頁面上的每個標籤重複此過程,然後使用其渲染引擎應用所有格式。
需要注意的重要一點是,在建立其屬性列表時,瀏覽器始終按從網頁頂部到底部以及從它遇到的每個樣式表頂部到底部的遍歷順序精確地建立列表。它還會在新增列表時遵循在網頁標題中找到的樣式序列。這種方法對瀏覽器解決來源順序是決定性因素的衝突具有影響。請再次記住,所有這些列表活動都針對頁面上的每個標籤對進行。
級聯執行完畢後,最初的宣告樣式集將被縮減為一個級聯樣式集,但許多屬性最初並未宣告。為了使瀏覽器正常執行,必須為每個被認為對該元素格式化必不可少的屬性提供單個值。瀏覽器會使用其預設操作填補這些大的空缺。對於每個缺少的必不可少屬性,它首先嚐試從父元素(即,從圍繞它的標籤)繼承合適的值;如果由於某種原因無法這樣做,則瀏覽器會分配一個初始值。屬性初始值是在設計時在屬性定義列表中預設的。應用這些預設值的結果是建立了一個全面的指定值集,其中包括每個標籤需要考慮的每個屬性。
下一階段是從指定值建立計算值,方法是考慮例如任何已引用的相對大小。例如,1em 的字型大小需要透過將其與某個參考點相關聯來轉換為畫素值。對集合進行一些進一步的調整後,會生成使用值,這些值會在渲染頁面時進行嘗試。這些值可能會進一步調整以適應佈局中的約束或對字型大小進行舍入,此時它們被稱為實際值。

可以對結果產生影響,但前提是優先順序較高的來源尚未為該屬性指定。
為了更詳細地瞭解級聯過程,下面準備了一個示例部分。在其中,可以研究源樣式表本身和用於示例的文件。假設瀏覽器正在嘗試解析文件中第一個段落標籤的樣式。應用於該標籤的樣式表宣告以綠色突出顯示,以幫助讀者跟蹤過程。
所有為此巢狀選擇的選擇屬性、它們的重要性等級、特異性和在來源中的位置都已輸入到此頁面的一個可排序表格中。讀者只需跟蹤各種列表並使用表格上的按鈕對其進行排序,即可瞭解解析這些選擇的過程。
|
|
|
|
下面的表 1 列出了適用於示例文件中第一個段落標籤的所有屬性,並且它們按找到它們的從上到下順序進行排列。
- 首先,使用者樣式表user.css 按從上到下順序排列。(1:1 到 1:6;六個屬性作為第一個要考慮的來源)。
- 然後是頭部樣式,因為它們位於文件中高於樣式錶鏈接的位置。(2:1 到 2:4)。
- 接下來是作者樣式表main.css;(這些被標記為 2:5 到 2:13)。
- 然後,將兩個內聯樣式新增為專案(2:14 到 2:15)。
- 瀏覽器的客戶端樣式表也有貢獻,因此最後添加了這些樣式(3:1 和 3:2)。
可以在表 1 中看到這 23 個專案。
要解決這些眾多競爭樣式中的哪些將最終用於第一個段落,可以使用一個模擬級聯行為的排序模型。它的作用是對專案進行排序
- 首先按屬性名稱
- 然後按重要性
- 然後按特異性,分四個步驟
- 然後,不必要地,按來源順序
表 1 以自然來源順序開啟,讀者可以對其進行排序,以檢視每個步驟如何影響級聯。
排序成功完成後,將選擇這些專案,就好像它們構成一個集合一樣
p{
background:beige;
border:1px solid lightgrey;
color: black;
display: block;
font-family: Tahoma;
font-size: 30px;
font-style: normal;
font-weight: bold;
margin: 1em 0;
padding:1.5em;
}
要將列出的樣式集合排序為合格的幾個,首先按屬性列的箭頭進行排序,不按Shift鍵,然後從左到右對剩餘的可排序列進行排序,以相同的方式但按住Shift鍵。這會將選擇項帶到其不同屬性集的底部或頂部,具體取決於使用者是按升序還是降序排序。為了幫助初次使用,將選擇項將以藍色標記.
| 宣告 | 權重 | |||||||
|---|---|---|---|---|---|---|---|---|
| 特異性 | ||||||||
| 屬性 | 值 | 選擇器 | 重要性 | 樣式屬性 |
ID 選擇器 |
類 選擇器 |
元素 選擇器 |
來源 順序 |
| font-size | 30px | p | (排名 5) 使用者重要 | 0 | 0 | 0 | 1 | 1:1 |
| font-family | Tahoma | .Tahoma | (排名 5) 使用者重要 | 0 | 0 | 1 | 0 | 1:2 |
| font-family | Times | #para1 | (排名 2) 使用者普通 | 0 | 1 | 0 | 0 | 1:3 |
| color | blue | #para1 | (排名 2) 使用者普通 | 0 | 1 | 0 | 0 | 1:4 |
| font-style | italic | #para1 | (排名 2) 使用者普通 | 0 | 1 | 0 | 0 | 1:5 |
| font-weight | normal | #para1 | (排名 2) 使用者普通 | 0 | 1 | 0 | 0 | 1:6 |
| font-size | 2em | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:1 |
| font-family | Courier | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:2 |
| background | green | .toppara | (排名 3) 作者普通 | 0 | 0 | 1 | 0 | 2:3 |
| border | 1px solid lightgrey | .toppara | (排名 3) 作者普通 | 0 | 0 | 1 | 0 | 2:4 |
| font-family | Calibri | #para1.Tahoma | (排名 4) 作者重要 | 0 | 1 | 1 | 0 | 2:5 |
| color | black | #para1.Tahoma | (排名 4) 作者重要 | 0 | 1 | 1 | 0 | 2:6 |
| font-style | normal | #para1.Tahoma | (排名 4) 作者重要 | 0 | 1 | 1 | 0 | 2:7 |
| font-family | Garamond | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:8 |
| font-size | 20px | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:9 |
| font-weight | bold | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:10 |
| background | white | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:11 |
| padding | 10px | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:12 |
| background | beige | .mostparas | (排名 3) 作者普通 | 0 | 0 | 1 | 0 | 2:13 |
| font-family | arial | p inline | (排名 3) 作者普通 | 1 | 0 | 0 | 0 | 2:14 |
| padding | 1.5em | p inline | (排名 3) 作者普通 | 1 | 0 | 0 | 0 | 2:15 |
| Display | Block | p | (排名 1) 瀏覽器客戶端 | 0 | 0 | 0 | 1 | 3:1 |
| Margin | 1em 0 | p | (排名 1) 瀏覽器客戶端 | 0 | 0 | 0 | 1 | 3:2 |
- 請注意,在正確排序的表格中,大多數示例都是根據它們的排名順序選擇的,換句話說,就是它們的重要性。
- 然而,背景屬性不是透過重要性或特異性來解析的,因為這些屬性在背景屬性集中對於每個屬性都是相同的。它們僅透過源順序進行選擇,也就是說,它們在列表中的順序。
- 另一方面,填充屬性的兩個列表具有相同的重要性,但在特異性方面有所不同。來自內聯樣式的屬性在此基礎上被選中。
- 請注意,在上述層次結構中,帶有!important關鍵字標記的使用者樣式具有所有樣式中最高的優先順序,並且它們只能透過省略來失敗。也就是說,可以使用其他樣式,但前提是未在那裡指定格式。一般來說,選擇代表級聯中源級別的樣式只能在排名高於它的重要性源未設定自己的值時,才能對最終結果產生影響。圖 3 中的圖形以比排序表格更直觀的方式顯示了這一點,但它顯示的是同一個示例。
- 關於此選擇過程,一個不太明顯的地方是,帶有!important標記的宣告不需要高特異性就能生效。也就是說,儘管!important宣告在它們自己的源排名中根據特異性進行排序,但完全有可能一個特異性較低的宣告將被選中來代表它的排名。然後,由於排名來源的優先順序,低特異性專案可以勝過特異性高得多但優先順序低得多的專案。這為!important宣告提供了非常廣泛的範圍,由於它們確實如此,因此在使用中儘可能縮小它們的範圍至關重要。例如,作者樣式表中一個高特異性的普通宣告仍然可以被一個低特異性宣告覆蓋
div table tr td p {color:red} /* for a paragraph in a cell of a row of a table in a division block */
除了影響特定示例之外,此後一個宣告還會對所有帶有普通優先順序的段落宣告產生影響。p{color:green !important} /* for a paragraph wheresoever found on the page */
- 從可能過少的資料泛化來看,可以說,宣告的排名位置賦予它們越高的重要性,就越需要注意縮小它們的範圍,如果它們不希望在範圍內變得過於霸道。
下面提供了一系列簡短的教程。目的是提供簡短的片段來指導主題的基礎知識,而不是進行冗長的討論。有一個關於樣式表選擇器使用的列表,以及對特異性和其他一些事物的解釋。
對於那些打算透過更改樣式表和網頁文件的內容來學習 CSS 的人來說,最好釋出關於檔案快取的標準提醒。
- 當瀏覽器首選項(選項)更改時,通常需要重新啟動瀏覽器才能生效。
- 當網頁或樣式表更改時,除非先清除瀏覽器快取並重新載入頁面,否則不太可能看到預期的更改。如果忽略這一點,可能會造成很大混亂。每個瀏覽器的快取清除方法不同,但瀏覽器首選項(選項)中通常都有一個功能。有時下拉選單項可以更快地清除快取,但在其他情況下,可能需要將選項設定為在關閉時清除快取,然後重新啟動瀏覽器才能顯示更改。對於 Opera 瀏覽器,清空瀏覽器快取最方便的方法是使用下拉選單項工具 / 刪除私人資料...
特指性是指宣告缺乏普遍性的程度;它們適用於頁面上的標籤而不是適用於一般標籤的程度。決定此類問題的 method 已得到相當大的發展。
使用的 method 計算一個加權總和來表示特指性。計算特指性的方法如下
對於任何給定的樣式表條目,檢查其選擇器,例如,div.p。選擇器有時很簡單,只有一個元素,或者像這樣,很複雜,包含多個元素。透過以下方式將總計加起來,為其特指性構造一個值
- 對於通用選擇器 (*) 或繼承值,將零新增到特指性總計中。
- 對於內聯樣式,將 1000 新增到總計中。這些只在文件中找到。
- 對於提到的每個 ID 選擇器,將 100 新增到總計中。
- 對於每個類、偽類或屬性,將 10 新增到總計中.
- 對於每個簡單標籤元素和偽元素,將 1 新增到總計中。
在任何一個級別內,競爭樣式宣告中特指性的最高值會導致它代表該級別在總體級聯中。(請參見主頁面內的圖形)。
p { }
|
總計 = 1,因為選擇器只有一個簡單標籤元素。 |
div p { }
|
總計 = 2,因為有兩個標籤元素 (2)。 |
p.topsection { }
|
總計 = 11,因為有一個標籤元素 (1),加上一個類 (10)。 |
#toppara { }
|
總計 = 100,因為有一個 ID 選擇器 (100) |
div table p#green { }
|
總計 = 103,因為有三個標籤選擇器 (3),加上一個 ID (100)。 |
style="float:left;"
|
總計 = 1000,因為有一個內聯樣式 (1000) |
a:hover { }
|
總計 = 11,因為有一個標籤元素 (1),加上一個偽類 (10)。 |
p:first-line { }
|
總計 = 2,因為有一個標籤元素 (1),加上一個偽元素 (1)。 |
p[title] { }
|
總計 = 11,因為有一個標籤元素 (1),加上一個屬性 (10)。 |
|
|
|
- 層疊樣式表級別 2 修訂版 1 (CSS 2.1) 規範: 世界範圍的網頁聯盟 (W3C) 對 CSS 2.1 的 18 章描述。
- CSS 級聯和繼承級別 3 : W3C 最後呼籲工作草案 2013 年 7 月 30 日。
- CSS 教程: W3C 的多頁 CSS 參考,被廣泛用於 CSS 語法。
- 網頁標準課程目錄: 此頁面包含幫助你教授或學習現代網頁開發的資源。
- Opera 使用者客戶端樣式表: 釋出用於版本 10,但似乎此後不再發布。
- Firefox 使用者客戶端樣式表
- Internet Explorer 使用者客戶端樣式表
- Opera Dragonfly 簡介: Dragonfly 是 Opera 的內建網頁開發者工具集。
- Opera 12.16 中的樣式呈現模式


