偽元素(Pseudo‐element) - daniel-qa/Vue GitHub Wiki

  • Render Tree

Render Tree 就像是最後列印前的畫面預覽,是「即將被畫出來的畫面藍圖」。

  • 偽元素(Pseudo‐element)

偽元素就是長在 Render Tree 上。


  • 逗號分隔(,)代表「多個選擇器同時套用」
A, B, C { ... }

意思是:

對 A、B、C 都套用相同的樣式規則。

所以這裡的:

*, *::before, *::after { box-sizing: border-box; }

等同於寫三次:

* { box-sizing: border-box; }
*::before { box-sizing: border-box; }
*::after { box-sizing: border-box; }
  • 「前 / 後」就是 CSS 裡的 文件流(document flow)概念

block 元素 → 一個接一個垂直堆疊(top → bottom)

inline 元素 → 水平排列(左 → 右,LTR 預設)

inline-block / flex / grid → 可以改變排列方式,但基本概念還是「原本在 DOM 裡的順序


你可以把它想成「瀏覽器內建幫你寫的虛擬節點」

如果用 Vue 心智模型類比,大概像:

瀏覽器在畫面裡偷偷變成:

<div class="card">
  [virtual ::before]
</div>

但這個 [virtual ::before]:

JS 無法 querySelector

不在 DOM tree

只存在 Render tree

每次重排都可能重建

這就是為什麼我們要全域設:

*, *::before, *::after {
  box-sizing: border-box;
}

因為:

這些「動態長出來的盒子」如果沒一起設定 box model, 版面計算就會混用兩種規則,然後出現難解的 1~2px 偏移 bug。


偽元素其實存在於:

Render Tree(渲染樹) 不是 DOM,也不是檔案,而是「畫面計算用的結構」。

偽元素就是動態產生的,而且是由瀏覽器在「渲染當下」即時建立、即時銷毀的。


偽元素 = 用 CSS「生成出來的虛擬元素」

它不是 HTML 裡真的存在的節點,而是瀏覽器在渲染時幫你畫出來的一個額外盒子,讓你可以多控制一層樣式。

你可以把它想成:

沒改 HTML,卻偷偷多長出一個可以 styling 的元素。

最常見的兩個:::before、::after

它們會在元素內容的 前面 / 後面 生成一個虛擬節點。

HTML

<button class="btn">送出</button>

CSS

.btn::before {
  content: "★";
  margin-right: 4px;
}

畫面看起來會像:

★ 送出

但實際 DOM 根本沒有那顆星星。

⚠️ **GitHub.com Fallback** ⚠️