層疊樣式表/繼承規則
概述
術語CSS 層疊指的是決策過程,即 Web 瀏覽器中用於確定將哪些層疊樣式表 (CSS) 樣式應用於網頁每個部分的軟體。它很複雜,因為樣式是在很多地方編寫的。存在錯誤、衝突和重複,更不用說始終存在的瀏覽器、使用者和作者許可權的層次結構。儘管如此,瀏覽器的軟體必須決定對頁面上的每個格式使用哪個樣式,並且即使沒有提供任何有用的樣式,也必須構建一個合理的頁面。
本頁提供層疊的基本過程的概述和詳細示例,雖然它能夠在過程中傳達詳細的知識,但並非專門用於教授網頁或其樣式表的製作。
在描述層疊的工作原理之前,它本質上只是瀏覽器功能的一部分,最好回顧一下瀏覽器周圍環境的基本特徵。
- 網頁是使用.htm字尾開啟特定文字檔案的結果。該檔案可以使用簡單的文字編輯器編寫。它位於作為伺服器工作的遠端計算機上,但也可以位於個人計算機 (PC) 的某個資料夾中。當它的地址提供給瀏覽器時,該檔案將被下載到瀏覽器快取,這是 PC 上的一個臨時儲存位置。.htm 檔案有時被稱為網頁文件。
- 網頁文件中包含一些標記,以幫助格式化,Web 瀏覽器的作用就是應用樣式。網頁文件包含一對稱為標記的標記,它們圍繞著要格式化的文字。這些標記透過說明它是哪種頁面結構來間接標識格式;例如,列表(<li></li>)、主標題(<h2></h2>)、副標題(<h3></h3>)、普通段落(<p></p>),或者可能是表格單元格(<td></td>)。頁面中的所有這些不同的元素都可以有不同的格式。
- 這些標記是HTML(超文字標記語言)語言的一部分,儘管也可以使用其他語言。網頁中的標記名稱,例如<p>中的p,在樣式表中列出,單獨或與其他術語一起列出,正是這些樣式表選擇器列出了預期格式的描述。也就是說,瀏覽器可以找到用於格式化元素的正確樣式表選擇器,因為它們的名稱是可預測的相似。文件元素被稱為該選擇器樣式的預期目標。列出這些格式的檔案型別稱為層疊樣式表 (CSS)。
- 樣式表只是一個帶有.css字尾的文字檔案,可以使用簡單的文字編輯器編寫。作者樣式表通常位於與網頁文件相同的資料夾中,無論它在哪裡。無論如何,樣式表的名稱和地址由網頁文件中的一個條目提供,因此它會在文件本身下載到瀏覽器快取後不久就下載。事實上,那裡可能列出了幾個樣式表,並且每個樣式表都會在處理其樣式之前匯入和處理,依此類推。
- PC 使用者也可以更改樣式。但他使用者樣式表位於本地計算機上。瀏覽器將此表與所有其他樣式合併,因此兩組樣式可能都會影響頁面的某些部分。當然,使用者樣式僅影響本地顯示,其他人看不到。
- 還有其他地方可以找到樣式。它們有時被寫入網頁文件的標題部分,以及頁面上標記內的內聯樣式。瀏覽器也有自己的樣式表,即使用者客戶端表,在其他樣式表丟失時提供基本佈局。有時瀏覽器的預設設定和內建樣式表也會影響結果。瀏覽器會合並所有這些來源的樣式。
- 作者樣式由三個來源組成。它們是:直接寫入網頁文件標題部分的樣式,標題部分中引用的連結樣式表,以及頁面主要內容中的內聯樣式。有時,這些連結樣式表中的列表本身會匯入更多樣式表。
- 某些樣式可能比其他樣式具有更高的重要性。在任何樣式位置(包括文件本身)編寫的樣式都可以具有特殊的!important標記,以將它們與普通樣式區分開來。這些標記允許作者或使用者覆蓋普通樣式。此功能在測試中特別有用,或者用於斷言內建瀏覽器樣式優先於其他樣式。在!important和普通樣式中,還有不同的等級,由它們被發現的位置決定,即它們的來源(稍後詳細說明)。
- 某些樣式比其他樣式具有更高的特異性。樣式表選擇器缺乏通用性或具有狹窄定義的程度被稱為特異性。例如,文件中的一些段落可能只是文件主體的一部分,並且其段落樣式適用於一般情況。其他一些段落可能需要特殊格式,因為它們位於例如表格單元格中。瀏覽器可以檢測到這種更具體的標記佈局,並優先考慮最匹配它的選擇器。特異性在層疊的決策過程中很重要,並且它的規則已經發展到了相當大的程度(稍後詳細說明)。
- 樣式表格式具有一些共同特徵。圖 1 顯示了樣式表中可能存在的典型樣式塊佈局。其中,選擇器是樣式宣告集的主要標籤,每個宣告都包含一個屬性和一個值。在示例中,樣式表的選擇器稱為div ul,它有兩個樣式宣告;一個用於line-height的屬性具有1.8em的值;另一個用於background的屬性具有darkgreen的值。可能的選擇器數量不限於單個標記名稱,因為正如示例所示,這些選擇器可以被複合以表示一組標記在另一組標記內的巢狀。在示例中,此選擇器將其樣式應用於巢狀在 division (div) 標記對內的每個無序列表,但不應用於它找到的其他無序列表示例。引入類和id可以為選擇器使用新增更大的特異性。
- Web 標準和規範由全球資訊網聯盟 (W3C) 和其他人管理。對於 CSS 樣式,新的標準會定期作為建議釋出。這些標準在瀏覽器的測試版中進行測試,並收集發現的差異和不足之處。最終釋出新的建議。可以在下面的另請參閱連結中找到各種 W3C 教程和規範。
| 圖 1:CSS 術語,用於典型的樣式表條目,即樣式規則。它描述了格式 用於一對 division (div) 塊元素標記中巢狀的任何無序列表。 花括號之間宣告的組合稱為宣告塊。 |
本節提供的是對級聯過程的直觀描述,而不是詳細描述。對於已經理解這些內容的人來說,最好直接跳到詳細級聯示例部分,那裡的內容可能更符合他們的口味。無論如何,對於需要學習或提醒自己選擇器和特異性的人來說,本節CSS 教程提供了教程。對於想要深入瞭解 HTML 的人來說,可以參考W3Schools HTML,這是一個廣泛的外部參考;對於 CSS,可以參考W3Schools CSS。
繼續,瀏覽器會逐個標籤遍歷網頁,以確定它們的樣式。為此,它首先會識別巢狀,即標籤所在的文件樹的一部分。這有助於瀏覽器檢查它找到的選擇器的有效性。然後,它會搜尋所有樣式來源,包括樣式表和文件本身,尋找可能影響目標標籤的選擇器,同樣,還要考慮到標籤佈局。如果選擇器適用,其樣式屬性將按發現順序列出,最終將生成一個適用於該特定標籤的長屬性列表。列表中可能包含許多已宣告的樣式,也可能一個都沒有,具體取決於不同作者的工作情況,很明顯,大多數可能為該標籤宣告的屬性仍然不存在。
樣式宣告可以新增特殊標記,使其優先於普通宣告,它們使用!Important關鍵字來標識。它們被稱為重要宣告。在排序其列表時,瀏覽器會將 !important 宣告與任何普通宣告分開。然後,瀏覽器會識別圖 2 中的五個重要性等級或重要性層級,其中等級 1的優先順序最低,等級 5的優先順序最高。
| 等級 1 | 瀏覽器預設樣式 列在使用者代理 (UA) 樣式表或等效實現中的樣式。 |
| 等級 2 | 使用者普通樣式宣告 使用者樣式表中沒有 !Important 標記的樣式。來自特定網站和內建樣式表的普通宣告也可以合併到這裡。 |
| 等級 3 | 作者普通樣式宣告 作者集沒有 !Important 標記的樣式。 它們包括來自文件頭部、連結樣式表和內聯樣式的樣式。 |
| 等級 4 | 作者 !Important 樣式宣告 作者集有 !Important 標記的樣式。 它們包括來自文件頭部、連結樣式表和內聯樣式的樣式。 |
| 等級 5 | 使用者 !Important 樣式宣告 使用者樣式表中有 !Important 標記的樣式。 來自特定網站和內建樣式表的 !Important 宣告也可以合併到這裡。 |
列表中的每個屬性條目都標有一個重要性等級,具體取決於選擇器的來源以及它是否是普通宣告還是重要宣告。這些條目還標有它們的特異性,即反映其應用範圍窄度的加權值。會記錄每個來源位置,這是一個標記,用於標識其發現位置及其在樣式表中的位置。
然後對資料集進行排序,將所有相似的屬性分組,然後在找到的任何相似集合中(例如,十個不同的字型大小建議),進一步對其進行排序,以確定最高重要性。在進行這些排序後,對於任何競爭激烈的集合,再次按最高特異性進行排序,以最終隔離列表中每個不同屬性的值。如果兩個宣告仍然匹配,最後決定的排序依據是它們在來源位置中發現的順序;也就是說,最後考慮用於列表的那個宣告將勝出。圖 3 的圖形描述了級聯樣式在解析單個段落標籤格式時的參與,其細節與後面部分中的詳細示例相同。
在確定哪些格式適用於特定標籤後,瀏覽器會對頁面上的每個標籤重複此過程,然後使用其渲染引擎應用所有格式。
需要強調的重要一點是,在建立其屬性列表時,瀏覽器始終按其從網頁頂部到底部、從每個樣式表頂部到底部的遍歷過程中遇到的確切順序建立列表。它還會在新增列表項時遵守在網頁標題中找到的樣式順序。此方法對瀏覽器解決來源順序作為決定因素的衝突具有影響。請再次記住,所有這些列表活動都是針對頁面上的每個標籤對進行的。
級聯後
[edit | edit source]級聯完成後,原始已宣告樣式集將縮減為級聯樣式集,但許多屬性在第一步中根本沒有宣告。為了使瀏覽器正常工作,必須為每個被視為必不可少的元素格式屬性提供一個值。瀏覽器透過預設操作來填補這些巨大的空缺。對於每個缺失的必要屬性,它首先嚐試從父元素(即圍繞它的標籤)繼承一個合適的值;如果由於某種原因無法實現,瀏覽器會分配一個初始值。屬性初始值在設計時預設在屬性定義列表中。應用這些預設值的結果是為每個正在考慮的標籤生成一組完整的指定值,其中包含每個所需的屬性。
下一階段是透過考慮例如任何相對大小來從指定值生成計算值。例如,1em 的字型大小需要透過將其與某個參考點關聯來轉換為畫素值。對集合進行一些進一步調整後,將生成使用值,然後在頁面渲染中進行嘗試。這些值可能會進一步調整以適應佈局約束或對字型大小進行舍入,此時它們被稱為實際值。
級聯詳情
[edit | edit source]
可以影響結果,但前提是優先順序較高的來源沒有為該屬性指定值。
為了更詳細地理解級聯過程,下面準備了一個示例部分。其中,可以研究來源樣式表本身以及用於示例的文件。假定瀏覽器正在嘗試解析文件第一個段落標籤的樣式。適用於該標籤的樣式表宣告已用綠色突出顯示,以幫助讀者理解該過程。
該巢狀的所有選定屬性,包括它們的優先順序、特異性和在來源中的位置,都已輸入到此頁面上的可排序表格中。讀者只需關注各種列表,並使用表格上的按鈕對其進行排序,即可看到解決這些選擇的過程。
示例的樣式來源
[edit | edit source]
|
|
|
|
級聯排序表格
[edit | edit source]下表 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)。
這 23 個專案可以在表 1 中看到。
要確定這許多競爭樣式中的哪些將最終用於第一個段落,可以使用模擬級聯行為的排序模型。其作用是對專案進行排序
- 首先按屬性名稱排序
- 然後按重要性排序
- 然後按特異性排序,分為四個步驟
- 然後,無須排序來源順序
表 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 選擇器 |
類 選擇器 |
元素 選擇器 |
來源 順序 |
| 字型大小 | 30px | p | (排名 5) 使用者重要 | 0 | 0 | 0 | 1 | 1:1 |
| 字體系列 | Tahoma | .Tahoma | (排名 5) 使用者重要 | 0 | 0 | 1 | 0 | 1:2 |
| 字體系列 | Times | #para1 | (排名 2) 使用者普通 | 0 | 1 | 0 | 0 | 1:3 |
| 顏色 | 藍色 | #para1 | (排名 2) 使用者普通 | 0 | 1 | 0 | 0 | 1:4 |
| 字型樣式 | 斜體 | #para1 | (排名 2) 使用者普通 | 0 | 1 | 0 | 0 | 1:5 |
| 字型粗細 | 普通 | #para1 | (排名 2) 使用者普通 | 0 | 1 | 0 | 0 | 1:6 |
| 字型大小 | 2em | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:1 |
| 字體系列 | Courier | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:2 |
| 背景 | 綠色 | .toppara | (排名 3) 作者普通 | 0 | 0 | 1 | 0 | 2:3 |
| 邊框 | 1px 實線 淡灰色 | .toppara | (排名 3) 作者普通 | 0 | 0 | 1 | 0 | 2:4 |
| 字體系列 | Calibri | #para1.Tahoma | (排名 4) 作者重要 | 0 | 1 | 1 | 0 | 2:5 |
| 顏色 | 黑色 | #para1.Tahoma | (排名 4) 作者重要 | 0 | 1 | 1 | 0 | 2:6 |
| 字型樣式 | 普通 | #para1.Tahoma | (排名 4) 作者重要 | 0 | 1 | 1 | 0 | 2:7 |
| 字體系列 | Garamond | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:8 |
| 字型大小 | 20px | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:9 |
| 字型粗細 | 粗體 | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:10 |
| 背景 | 白色 | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:11 |
| 填充 | 10px | p | (排名 3) 作者普通 | 0 | 0 | 0 | 1 | 2:12 |
| 背景 | 米色 | .mostparas | (排名 3) 作者普通 | 0 | 0 | 1 | 0 | 2:13 |
| 字體系列 | arial | p 內聯 | (排名 3) 作者普通 | 1 | 0 | 0 | 0 | 2:14 |
| 填充 | 1.5em | p 內聯 | (排名 3) 作者普通 | 1 | 0 | 0 | 0 | 2:15 |
| 顯示 | 塊級 | p | (排名 1) 瀏覽器客戶端 | 0 | 0 | 0 | 1 | 3:1 |
| 邊距 | 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 瀏覽器,清空瀏覽器快取的最便捷方法是使用下拉選單項工具/刪除私人資料...
計算特異性
[edit | edit source]樣式宣告特異性
[edit | edit source]特異性指的是宣告缺乏通用性的程度;它應用於頁面上的某個標籤的程度,而不是應用於通用標籤的程度。確定特異性方法的開發已相當完善。
使用的方法計算一個加權和來表示特異性。計算特異性的方法如下
對於任何給定的樣式表條目,檢查它的選擇器,例如,div.p。選擇器有時很簡單,只有一個元素,或者像這樣,很複雜,有多個元素。透過以下方式為其特異性構建一個值,並將其新增到總計中
- 對於通用選擇器 (*) 或繼承的值,將零新增到特異性總計中。
- 對於內聯樣式,將 1000 新增到總計中。這些樣式只存在於文件中。
- 對於每個提到的 ID 選擇器,將 100 新增到總計中。
- 對於每個類、偽類或屬性,將 10 新增到總計中。.
- 對於每個簡單的標籤元素和偽元素,將 1 新增到總計中。
在同一級別內,競爭樣式宣告中特異性最高的值將代表該級別在整體級聯中的地位。(參見主頁面中的圖形)。
特異性 - 計算示例
[edit | edit source]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)。 |
樣式繼承
[edit | edit source]
|
|
|
- 層疊樣式表級別 2 修訂版 1 (CSS 2.1) 規範: 由全球資訊網聯盟 (W3C) 提供的關於 CSS 2.1 的 18 章描述。
- CSS 層疊和繼承級別 3 : W3C 最後呼籲工作草案 2013 年 7 月 30 日。
- CSS 教程: W3C 的多頁 CSS 參考,廣泛用於 CSS 語法。
- Web 標準課程目錄: 此頁面包含資源,可幫助您教授或學習現代 Web 開發。
- Opera 使用者客戶端樣式表: 為版本 10 釋出,但似乎此後沒有釋出。
- Firefox 使用者客戶端樣式表
- Internet Explorer 使用者客戶端樣式表
- Opera Dragonfly 簡介: Dragonfly 是 Opera 內建的 Web 開發人員套件。
- Opera 12.16 中的樣式演示模式


