層疊、繼承、權重與選擇器

理解樣式的最終決策

級聯

CSS 的 C 就是代表著層疊 Cascade 的意思,可以把它想成等級的概念,如下範例:

/* 等級 1 */
h1 {
    color: red;
}

/* 等級 2 */
h1 span {
    color: green;
}

/* 等級 3 */
h1 span span{
    color: yellow;
}

在之後的選擇器我們會再更近一步的說明,目前只要知道層疊的意義即可,而近期新推出的層疊階層 Cascade Layer 是更進階的技術,在章節五的管理裡會再介紹。

circle-info

我們即將進入 CSS 的核心概念,從這裡開始該打起精神學習囉!

在相同級聯、相同權重的情況下,最後定義的會是最終樣式,如下範例:

繼承

Inheritance,就有如字面意思,直接將父母親層級的樣式沿用,即稱為繼承,如下範例:

在這個範例中,<body> 已經有設定文字為藍色,所以他的子元素們都會繼承他的文字顏色,直到 <span> 又再次設定文字顏色為黑色。

circle-info

注意,CSS 屬性有些會繼承,有些不會繼承,例如寬度。 您可以在查詢屬性時,查看他的繼承欄位,例如 MDN 的 color 屬性介紹頁arrow-up-right的定義區塊就有明確列出這個屬性是否可以繼承。

選擇器

其實我們已經使用過選擇器了,在這個篇幅我們會更近一步的學習更多的選擇器用法。

所謂的 CSS 選擇器,就是在 CSS 檔案內撰寫我們要「指定某個對象」樣式的這件事情,例如:

如果我們要對 <h1> 做樣式的話,我們至少有以下這些樣式可以執行:

triangle-exclamation

在多個標籤與混合使用的範例,您會發現前者有空格,後者無空格,這是 CSS 的定義,說明如下:

接下來我們還要針對比較特別的選擇器進一步說明。

通用選擇器

屬性選擇器

我們可以在 HTML 元素上加上已經被定義的屬性或是自行添加的屬性:

所以以下兩種寫法都可以得到相同的樣式結果:

在上例中,要完全等於才有辦法套用樣式,但在實務上,通常我們會有基本型與其延伸出的變化型需求,所以屬性選擇器還可以有更多樣的選擇方式:

偽類、偽元素選擇器

因為太多了,所以不一一列舉,您可以至 w3school 觀看所有偽類arrow-up-right偽元素arrow-up-right的選擇器。

權重

在某些形況下,我們會希望由一個基礎樣式擴充出不同樣式,我們可以使用這樣的方式撰寫:

<h1> 會先找到紅色,之後又找到綠色,然後判斷綠色為最終樣式進而應用。為什麼會判斷綠色為最終樣式呢?

CSS 的最終樣式,取決於其重要的程度。在元素當中,我們可以為其增加 id 與 class 屬性,在 CSS 當中則有各式選擇器、偽類、!important、inline style 會影響權重,總的來說,可以下圖來表示重要程度:

可以將權重分成五個數字,其構成為 !important - inline style - id - class - element,越左邊代表重要程度越大。例如:h1 + p::first-letter 可分成 h1、p、與 ::first-letter,而這三個都是屬於最右邊的數字所以就會是 0-0-0-0-3。

而 *、+、>、~ 和否定則不影響權重。

circle-exclamation

小結

善用選擇器將會讓效能、維護性、可讀性、易用性提高非常多,請務必練習各種選擇器的方式。

作業

線上有很多 CSS 選擇器的遊戲arrow-up-right網站挑戰看看,增強選擇的功力。

參考來源

Last updated

Was this helpful?