CSS 基本語法與選擇器(Syntax & Selectors)
CSS 規則告訴瀏覽器:選誰、改什麼、改成多少。選錯人,後面寫再漂亮也不會作用在你以為的元素上。
基本語法
- 選擇器
p:所有<p> - 屬性
color:要改的特徵 - 值
#c62828:改成什麼 - 每條宣告以
;結尾;最後一條分號可省略,但建議都寫
註解
CSS 註解只有 /* ... */,沒有 //。註解不會影響樣式,適合標註暫時關掉的規則。
基本選擇器(Basic Selectors)
| 選擇器 | 語法 | 選到誰 |
|---|---|---|
| 元素(類型) | p { } |
所有 <p> |
| 類別 class | .title { } |
class="title" |
| ID | #header { } |
id="header"(一頁應唯一) |
| 群組 | h1, h2, h3 { } |
多個選擇器共用同一組規則 |
| 萬用 | * { } |
所有元素(少用,效能與可讀性都較差) |
class 與 id
視覺樣式請優先用 class。id 優先權很高,之後很難覆蓋,也常留給 JavaScript 或頁內錨點。
組合選擇器(Combinators)
| 選擇器 | 語法 | 意義 |
|---|---|---|
| 後代(空格) | nav a |
nav 裡所有 <a>,不論多深 |
子元素 > |
ul > li |
只選直接子元素 |
相鄰兄弟 + |
h1 + p |
緊接在 h1 後面的第一個 p |
一般兄弟 ~ |
h1 ~ p |
h1 後面所有同層 p |
<div class="card">
<p>直接子元素</p>
<div>
<p>更裡面的段落</p>
</div>
</div>
<h1>標題</h1>
<p>標題後第一段</p>
<p>標題後第二段</p>
.card > p { font-weight: 700; } /* 只影響第一個 p */
h1 + p { font-size: 1.125rem; } /* 導言放大 */
h1 ~ p { color: #444; }
屬性選擇器(Attribute Selectors)
| 語法 | 意義 |
|---|---|
[type] |
具有 type 屬性 |
[type="text"] |
值完全等於 text |
[class~="note"] |
class 清單中含 note |
[href^="https"] |
以 https 開頭 |
[href$=".pdf"] |
以 .pdf 結尾 |
[href*="docs"] |
包含 docs |
[class\|="btn"] |
等於 btn 或以 btn- 開頭 |
偽類與偽元素(Pseudo-classes / Pseudo-elements)
完整說明見 偽類及偽元素。這裡只要會選狀態與結構:
| 寫法 | 用途 |
|---|---|
a:hover |
滑鼠停在連結上 |
input:focus-visible |
鍵盤聚焦時顯示外框 |
li:nth-child(2) |
父層的第 2 個子元素 |
p:first-child |
身為長子的 p |
p::before |
在內容前插入產生內容 |
a:hover { color: #d32f2f; }
li:nth-child(odd) { background: #f5f5f5; }
.badge::before { content: "★ "; }
現代選擇器(建議一併學會)
| 選擇器 | 用途 |
|---|---|
:not(.active) |
排除某條件 |
:is(h1, h2, h3) |
分組,優先權取列表中最高者 |
:where(h1, h2, h3) |
同上,但優先權為 0,方便覆蓋 |
:has(img) |
選「裡面有圖片」的元素 |
article:has(img) {
display: grid;
grid-template-columns: 160px 1fr;
gap: 1rem;
}
:where(.prose) :is(h1, h2, h3) {
line-height: 1.3;
}
CSS 巢狀(Nesting)
現代瀏覽器已支援在規則裡再寫規則,減少重複選擇器:
總結
| 類型 | 例子 | 何時用 |
|---|---|---|
| 基本 | p .btn #app |
最常用 |
| 組合 | nav > a h1 + p |
依結構縮小範圍 |
| 屬性 | input[required] |
表單、連結類型 |
| 狀態 | :hover :focus-visible |
互動回饋 |
| 現代 | :is() :has() |
少寫重複、依內容選父層 |
選擇器越精準越好,但不要為了「只選這一個」就堆一長串。優先權細節請接 層疊與優先權。