若要重設你編寫的頁面中的某個區段,可對受控標記使用目標式 CSS 重設、對封裝的元件樣式使用 Shadow DOM,或使用 iframe 建立獨立文件。本指南說明如何選擇並在 Mac 上預覽結果。
你的區段需要哪種重設方式?
這裡的讀者任務很明確:讓巢狀預覽面板擁有自己的字體排印、間距和抽象圖形,同時保留周圍頁面的外觀。你需要能存取頁面的原始檔案,並獲准編輯這些檔案。
選擇重設宣告前,先決定界線。CSS 屬性值、選擇器作用範圍和文件資源是不同的問題。以下決策指南整合了 CSS 重設、Shadow DOM 和 內嵌框架 的文件說明行為。
| 你的需求 | 實用選擇 | 必須留意的條件 |
|---|---|---|
| 移除一般巢狀標記上指定的樣式 | 目標式宣告或 all |
外部選擇器仍可能符合區段中的元素。 |
| 將內部選擇器與頁面選擇器分開 | Shadow DOM 搭配明確的內部基準樣式 | 仍需留意繼承值。 |
| 讓區段擁有自己的文件和樣式表設定 | iframe | 需另外設定尺寸和資源。 |
對於自行編寫的小型預覽面板,Shadow DOM 是實用的起點。它提供選擇器界線,且不需要第二個 HTML 檔案。如果你只需要移除框線或更改標題字型,明確宣告會比引入元件界線更簡單。
為什麼 all: revert 無法完全重設巢狀區段?
all 簡寫會更改它所符合元素的屬性,但不包括自訂屬性、direction 和 unicode-bidi。它不會建立獨立文件,也不會阻止其他選擇器符合這些元素。MDN 的 all 參考資料
重設關鍵字也會產生不同的基準樣式。initial 使用規格定義的初始值設定各屬性。unset 會繼承通常會繼承的屬性,並將其他屬性設為初始值。在作者樣式表中,revert 會將受影響的屬性回退到作者樣式之前;繼承值仍可能來自父元素。CSS 層疊與繼承第 5 級
例如,重設區段的顏色不會移除直接符合區段內段落的顏色宣告。MDN 示範了這個明確的差異:即使父元素使用 revert,段落仍保留直接指定給它的顏色。因此,如果不想要的外觀來自後代選擇器,只重設包裝元素並不足夠。MDN 的父元素重設範例
將重設套用至每個後代會擴大作用範圍,但也會移除實用的版面配置和格式。使用 all: initial 時,除非你重新指定,連瀏覽器通常賦予區塊元素的區塊顯示方式也會消失。只有在你能刻意重建所需呈現方式時,才使用這類重設。規格中的小工具重設範例
revert-layer 的用途不同:它會透過層疊層回退某個屬性。當問題出在特定樣式層時,它很有用,但不會建立元件界線。CSS 層疊層回退
在 Mac 上建立獨立的預覽面板
這個完整範例會建立深色的周圍介面,以及一個包含合成標籤和兩個原創 CSS 形狀的淺色巢狀面板。所有內容都直接寫在檔案中:不需要下載、套件、外部字型或圖片檔案。
在 TextEdit 中選擇 File > New,再選擇 Format > Make Plain Text。貼上以下完整範例,將它儲存為 section-reset.html,並在出現提示時選擇 Use .html。這些是 Apple 說明的建立 HTML 檔案步驟。在 Mac 上使用 TextEdit 處理 HTML 文件
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Section reset demonstration</title>
<style>
body {
margin: 0;
padding: 32px;
background: #202a36;
color: #f2f5f8;
font: 18px/1.6 Georgia, serif;
letter-spacing: 1px;
}
main { max-width: 720px; margin: auto; }
h2 { color: #bce8ff; text-transform: uppercase; }
p { border-left: 4px solid #7db5cf; padding-left: 12px; }
#panel-host { display: block; margin: 24px 0; }
</style>
</head>
<body>
<main>
<h1>Shape workspace</h1>
<p>Outer label Alpha</p>
<div id="panel-host">
<p>Preview unavailable. Use a browser supporting Shadow DOM.</p>
</div>
<h2>Outer label Beta</h2>
<p>This paragraph belongs to the surrounding interface.</p>
</main>
<script>
const host = document.getElementById("panel-host");
if (typeof host.attachShadow === "function") {
const root = host.attachShadow({ mode: "open" });
const style = document.createElement("style");
style.textContent = `
.panel {
all: initial;
display: block;
box-sizing: border-box;
direction: ltr;
unicode-bidi: normal;
font: 16px/1.5 system-ui, sans-serif;
color: #233344;
background: #f4f7fa;
padding: 24px;
border: 2px solid #9db0c1;
border-radius: 12px;
}
h2 { margin: 0 0 12px; font-size: 22px; }
p { margin: 0 0 16px; }
.shapes { display: flex; gap: 16px; flex-wrap: wrap; }
.circle {
width: 56px; height: 56px;
border-radius: 50%; background: #386f91;
}
.bar {
width: 104px; height: 56px;
border-radius: 8px; background: #c98252;
}
`;
const panel = document.createElement("section");
panel.className = "panel";
const heading = document.createElement("h2");
heading.textContent = "Panel Delta";
const text = document.createElement("p");
text.textContent = "Circle and rounded bar";
const shapes = document.createElement("div");
shapes.className = "shapes";
shapes.setAttribute("aria-hidden", "true");
for (const name of ["circle", "bar"]) {
const shape = document.createElement("div");
shape.className = name;
shapes.append(shape);
}
panel.append(heading, text, shapes);
root.append(style, panel);
}
</script>
</body>
</html>
在 Mac 瀏覽器中開啟儲存的檔案。預期結果是淺色面板,內有大小寫混合的標題和沒有框線的段落。面板外的標題仍會是藍色大寫字,段落仍會保留左側框線。這些是範例預期呈現的結果,不是瀏覽器測試的量測數據。
指令碼會在用途為空的宿主元素上附加 shadow root,並在該 root 中建立面板。其樣式表屬於 shadow tree,因此一般標題和段落選擇器會在內部套用。文件的一般標題和段落選擇器則不會套用到這些內部元素。這符合 MDN 說明的 Shadow DOM 樣式模式。
內部的 .panel 提供了解決方案的第二部分:明確的基準樣式。Shadow 界線會隔開選擇器比對,但繼承仍會沿著渲染後的元素樹運作。重設內部包裝元素,可避免周圍的襯線字型和字母間距成為它一般繼承的基準樣式。目前的 CSS Shadow 規格描述了這種繼承模型;該規格仍是編輯草案。CSS Shadow Module Level 1
還有哪些內容會跨越界線或影響界線?
宿主仍是周圍文件中的一個元素。頁面規則可以更改它的邊界、寬度或顯示方式,而祖先元素仍會決定面板可用的空間。讓宿主的位置由頁面樣式表控制,並讓面板的內部外觀由 shadow 樣式表控制。這種分工符合文件中對 shadow host 和內部樹的區別。CSS 範圍指南
自訂屬性也需要明確的契約。all 不會清除它們。此範例不使用繼承的自訂屬性,因此外部變數無法透過 var() 參照改變它選定的顏色。如果日後加入主題變數,請明確定義元件接受哪些名稱,並提供內部預設值。MDN 的重設排除項目
若要讓新加入的面板內容使用相同的選擇器界線,請將它放在 shadow root 內。插槽內容的樣式關係不同,因為它源自 light tree;加入插槽會改變此範例的假設。CSS Shadow 對插槽和樹狀關係的說明
Shadow DOM 也不是資源重設指令。此範例完全不依賴外部資源。如果你需要的是一份有獨立樣式表參照的 HTML 文件,請使用下方的 iframe 方法。
什麼時候應該改用 iframe?
iframe 會嵌入另一份文件。因此,若要讓獨立樣式的預覽擁有與周圍頁面分開的文件設定,iframe 就很合適。HTML 標準定義了 src,用於參照資源;也定義了 srcdoc,用於內嵌文件。HTML 標準:iframe 元素
若要使用本機的雙檔案配置,請建立第二個完整 HTML 檔案,命名為 panel.html,並在其中放入面板及其樣式表。接著以參照該檔案的 iframe 取代宿主元素和指令碼。以下是整合片段,不是獨立文件:
<iframe
title="Shape panel preview"
src="panel.html"
style="display:block;width:100%;height:280px;border:0">
</iframe>
這裡的檔名是本機範例檔名。使用此片段前,請先提供實際的第二個檔案。框架外部尺寸由包含它的頁面設定;嵌入的頁面則提供內部呈現方式。可將 280px 作為示範起始高度,並檢查較長內容是否放得下,而不要假設它一定能放得下。
如果改用 srcdoc,請記住,相對資源 URL 會以嵌入頁面的 URL 為基準解析。因此,內嵌文件內容不會自動擁有獨立的資源基底。MDN 也說明,不支援的 srcdoc 會回退至 src。MDN 的 iframe 屬性參考資料
檢查相容性並診斷非預期樣式
MDN 標示基本的 attachShadow() 和 all 屬性自 2020 年 1 月起已廣泛支援於各瀏覽器。這不代表這些功能的每個較新選項都受到支援。此範例使用基本的 open 模式,並在 Shadow DOM 無法使用時保留可見的備用訊息。MDN:attachShadow()、MDN:all
@scope 是另一種限制一組選擇器套用範圍的支援方式,但它不會阻止繼承,也不會防止無關的全域規則進入子樹。MDN 指出,自 2026 年 3 月起,現行瀏覽器已普遍支援此功能,但舊版瀏覽器仍有限制。如果選擇器組織方式已符合需求,就使用它;若需要 Shadow DOM 或 iframe 各自提供的界線,則保留這些方式。MDN:@scope
編輯範例後,請依照以下順序診斷:
- 如果檔案顯示原始碼文字,請確認儲存的副檔名是
.html,並在瀏覽器中開啟。 - 如果備用訊息仍然顯示,請確認 JavaScript 有執行,且瀏覽器支援
attachShadow()。 - 如果面板外觀不正確,請確認其內容已附加至 shadow root,然後檢查內部基準樣式和樣式表。
- 如果周圍介面發生變化,請檢查文件樣式表和宿主規則的修改。
- 如果內容放不下,請先檢查宿主或框架尺寸,再更改字體排印。
選擇符合需求的最小界線:使用目標式 CSS 修正受控樣式,使用 Shadow DOM 加上明確的基準樣式封裝面板,或使用 iframe 建立獨立文件。明確設定位置、內部樣式和資源參照,這樣區段就能改變,而不必重新設計周圍環境。
來源
- all CSS property — MDN Web Docs
- revert CSS keyword — MDN Web Docs
- CSS Cascading and Inheritance Level 5 — W3C
- Using shadow DOM — MDN Web Docs
- CSS Shadow Module Level 1 — W3C CSS Working Group
- CSS scoping — MDN Web Docs
- Element: attachShadow() method — MDN Web Docs
- @scope CSS at-rule — MDN Web Docs
- HTML inline frame element — MDN Web Docs
- HTML Standard: the iframe element — WHATWG
- 在 Mac 上使用 TextEdit 處理 HTML 文件 — Apple Support