【せんげんてきしゃどーどむ】

宣言的Shadow DOM とは?

最終更新:
💡 JavaScriptなしで「自分だけのスタイル空間」をHTMLで宣言する

HTMLのtemplate要素でShadow DOMを宣言する仕組み。対応ブラウザがHTMLを解析するときにシャドウツリーを作るため、サーバーで生成したHTMLでも内部構造を表現できる。

📌 このページのポイント
HTMLを解析してShadow DOMを作る <div> <template shadowrootmode="open"> <p>こんにちは</p> </template> </div> ブラウザが解析 親要素(div) ShadowRoot p:こんにちは CSSの継承などの性質は通常と同じ
対応ブラウザがHTMLを解析して親要素にシャドウルートを作る。表示の構築と、JavaScriptで追加する動作は別の話。
ひよこ ひよこ
宣言的Shadow DOMって、普通のShadow DOMとどう違うの?
ペンギン先生 ペンギン先生
できるシャドウツリーはShadow DOMだよ。作り方が違って、JavaScriptのattachShadow()の代わりに、HTMLのtemplateにshadowrootmode="open"などを指定する。対応するブラウザが解析すると、そのtemplateの親要素にシャドウルートを作るんだ。
ひよこ ひよこ
JavaScriptなしで書けると何が便利なの?
ペンギン先生 ペンギン先生
サーバーで作るHTMLにシャドウツリーの内容を含められるよ。ブラウザはHTMLを解析しながら構築できるので、作成用のJavaScriptを待たずに表示を用意できる。サーバーでHTMLを作った瞬間に、ブラウザ側のDOMができるわけではないね。
ひよこ ひよこ
カプセル化って、外側のCSSが全く届かないの?
ペンギン先生 ペンギン先生
通常のCSSセレクターが内部へ入り込まないよう、適用範囲を分けるよ。ただし文字色やフォントなどの継承、CSSカスタムプロパティの値は届くことがある。宣言的な作り方でもこの性質は同じで、完全に影響を断つ壁ではないんだ。
ひよこ ひよこ
使えばJavaScriptも表示崩れもなくなる?
ペンギン先生 ペンギン先生
シャドウツリーを作るだけならJavaScriptなしでよいけれど、独自の操作や状態更新にはJavaScriptを追加する場合があるよ。外部のスタイルシートやフォントの読み込みなどでも見た目は変わる。SSRとの連携を助ける仕組みで、すべての表示変化を防ぐ保証ではないんだ。
ひよこ ひよこ
実際に書くときの注意は?
ペンギン先生 ペンギン先生
Shadow DOMを持てる要素の中に、templateとshadowrootmode属性を置くよ。基本の属性はChrome 111・Safari 16.4・Firefox 123以降で対応している。ただし、同じ文字列をinnerHTMLへ入れるだけではシャドウルートは作られない。読み込み方と、使う追加機能の対応も確認するんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「宣言的Shadow DOM」って出てきたら「HTMLだけでシャドウDOMを作れるWeb標準」と思えればだいたいOK!
📖 おまけ:英語の意味
「Declarative Shadow DOM」 = 宣言的Shadow DOM
💬 DOMをJavaScriptで命令的(imperatively)に操作するのではなく、HTMLタグで「宣言(declare)」するだけで動く仕組みからきているよ。

参考資料

← 用語集にもどる