CSS 語法介紹:宣告、規則集和語句

層疊樣式表(CSS)語言的基本目標是允許瀏覽器引擎為頁面元素繪製特定功能,如顏色、定位或裝飾。CSS 語法反映了這一目標,其基本構成部分是:

  • 屬性(property)是一個識別符號,即一個人類可讀的名稱,用於定義要考慮哪個特性。
  • 值(value)描述了引擎必須如何處理該特性。每個屬性都有一組有效值,由形式語法定義,並具有由瀏覽器引擎實現的語義。

CSS 宣告

將 CSS 屬性設定為特定值是 CSS 語言的核心功能。一個屬性和值的配對稱為宣告(declaration),任何 CSS 引擎都會計算哪些宣告適用於頁面的每一個元素,以便適當地進行佈局和樣式設定。

在 CSS 中,屬性和值預設都不區分大小寫。屬性和值之間用冒號 : (U+003A COLON) 分隔,屬性和值之前、之間和之後的空白字元都會被忽略,但屬性或值內部的空白字元不一定會被忽略。

A css declaration is a property value pair, with a colon separating the two entities and a semi-colon closing the declaration.

CSS 中有數百種不同的屬性和幾乎數不清的不同值。並非所有屬性和值的組合都是允許的,每個屬性都定義了哪些是有效值。當一個值對於給定的屬性無效時,該宣告將被視為無效,並被 CSS 引擎完全忽略。

CSS 宣告塊

宣告被組合在塊(block)中,即由一個左花括號 { (U+007B LEFT CURLY BRACKET) 和一個右花括號 } (U+007D RIGHT CURLY BRACKET) 分隔的結構中。塊有時可以巢狀,所以左右花括號必須配對。

Two braces delimit the start and end of a CSS block, with css content or no content between the braces.

這樣的塊自然地被稱為宣告塊(declaration blocks),塊內的宣告用分號 ; (U+003B SEMICOLON) 分隔。宣告塊可以為空,即不包含任何宣告。宣告周圍的空白字元會被忽略。塊的最後一條宣告不需要以分號結尾,儘管通常認為這樣做是良好風格,因為這樣可以防止在向塊中新增另一條宣告時忘記新增分號。

下圖展示了一個 CSS 宣告塊。

Within a CSS block, encompassed in braces, semicolons separate declarations, with the final semicolon being optional but recommended as good practice.

注意:CSS 宣告塊的內容,即一系列以分號分隔的宣告,不包括開始和結束的花括號,可以放在 HTML 的 style 屬性中。

CSS 規則集

如果樣式表只能為網頁的每個元素應用一條宣告,那麼它們就沒什麼用了。真正的目標是對文件的不同部分應用不同的宣告。

CSS 透過將條件與宣告塊關聯起來實現了這一點。每個(有效的)宣告塊前面都有一個或多個以逗號分隔的選擇器(selectors),這些選擇器是選擇頁面某些元素的條件。一個選擇器列表及其關聯的宣告塊合在一起,稱為一個規則集(ruleset),或者通常簡稱為規則(rule)

下圖展示了一個 CSS 規則集(或規則)。

A group of comma-separated selectors precedes the brace-delimited declaration block, which contains multiple declarations ending in semicolons.

由於頁面上的一個元素可能被多個選擇器匹配,因此可能被多個規則匹配,這些規則可能多次包含同一個屬性但具有不同的值,CSS 標準定義了哪個規則優先於其他規則並必須被應用:這被稱為層疊演算法(參見處理衝突)。

注意:需要注意的是,儘管由一組選擇器構成的規則集是多個單選擇器規則集的簡寫形式,但這並不適用於規則集本身的有效性。

這帶來一個重要的後果:如果單個基本選擇器無效,例如使用了未知的偽元素或偽類,那麼整個選擇器就是無效的,因此整個規則也會被忽略(同樣視為無效)。

CSS 語句

規則集是樣式表的主要構建塊,樣式表通常僅由一個龐大的規則集列表組成。但 Web 作者還希望在樣式表中傳達其他資訊,如字元集、要匯入的其他外部樣式表、字型或列表計數器描述等等。他們會使用其他特定的語句型別來完成這些任務。

語句(statement)是一個以任何非空白字元開頭,並以第一個右花括號或分號(在字串之外、未轉義且不包含在其他 {}、() 或 [] 對中)結尾的構建塊。

A Venn diagram of statements noting all rulesets are nested statements, while some at-rules are nested statements but most aren't. Anything that is not an at-rule or nested is invalid.

有兩種語句:

  • 規則集(或規則),如前所述,它將一組 CSS 宣告與由選擇器描述的條件相關聯。
  • @規則(at-rules)以 @ 符號 @ (U+0040 COMMERCIAL AT) 開頭,後跟一個識別符號,然後一直持續到語句結束,即直到下一個不在塊內的分號 (;) 或下一個塊的末尾。每種由識別符號定義的@規則都可能有其自己的內部語法和語義。它們用於傳達元資料資訊(如 @layer@import)、條件資訊(如 @media@document)或描述性資訊(如 @font-face)。

任何不是規則集或 @規則的語句都是無效的,並被忽略。

巢狀語句

還有另一組語句——巢狀語句(nested statements)。這些語句可以用在一組特定的 @規則中,即條件組規則。這些語句僅在特定條件匹配時才適用:@media @規則的內容僅在瀏覽器執行的裝置匹配所表達的條件時才適用;@document @規則的內容僅在當前頁面匹配某些條件時才適用,等等。在 CSS1 和 CSS2.1 中,只有規則集可以在條件組規則內部使用。這非常受限,這個限制在 CSS 條件規則第 3 級中被取消了。現在,雖然仍處於實驗階段且並非所有瀏覽器都支援,條件組規則可以包含更廣泛的內容:規則集以及一些(但不是所有)@規則。

另見