【しゃどうどむ】

Shadow DOM とは?

最終更新:
💡 部品のDOMとCSSに、範囲を分ける境界を作る

要素に独立したDOMツリーを付け、通常のDOM探索やCSSセレクターの範囲を分けるブラウザ標準の仕組み。Web Componentsのカプセル化に使われる。

📌 このページのポイント
Shadow DOM:部品の内部に境界 ページ側のDOM ページの見出し my-component ホスト要素 Shadow DOM #shadow-root 内部のstyle 範囲を限定 内部のbutton 送信 openならshadowRootから操作できる 継承や公開したpartなどの接点もある
橙はホストと内部のツリーの関係、青はページ側、緑は内部のボタン。矢印はホストへ付くツリーを示します。通常の探索やCSSセレクターの範囲を分けますが、機密情報を守る境界ではありません。
ひよこ ひよこ
なんでShadow DOMが必要なの?
ペンギン先生 ペンギン先生
部品の内部とページ全体で、同じ名前の要素やCSSが意図せず干渉するのを減らすためだよ。ホスト要素に別のDOMツリーを付けて範囲を分ける。通常のdocument.querySelectorは、その内部をそのまま検索しないんだ。
ひよこ ひよこ
外側のCSSは全く影響しないの?
ペンギン先生 ペンギン先生
通常のセレクターは境界を越えないけど、完全に無関係ではないよ。色やフォントなどの継承、CSSカスタムプロパティで外側の値が伝わる。部品がpartを公開すれば、外側から::partでスタイルを指定する方法もあるんだ。
ひよこ ひよこ
どうやって作るの?
ペンギン先生 ペンギン先生
ホスト要素のattachShadowにmodeを指定するとshadow rootができるよ。その中へ要素やスタイルを追加する。たとえばopenなら、ホストのshadowRootから内部を操作できる。HTMLのtemplateで宣言する方法もあるよ。
ひよこ ひよこ
closedなら秘密を守れる?
ペンギン先生 ペンギン先生
closedではホストのshadowRootがnullになるけど、作成時に返された参照は使えるよ。外側から触ってほしくないという境界であり、強いセキュリティ機構ではない。秘密のデータを隠すために使うものではないんだ。
ひよこ ひよこ
slotは何をするの?
ペンギン先生 ペンギン先生
ホストの子として書いた内容を、内部で表示する位置へ割り当てる仕組みだよ。元の要素が内部のDOMへ移動するわけではない。部品の内部構造をまとめつつ、呼び出す側が表示内容を渡す接点になるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Shadow DOM」って出てきたら「CSSやDOMをカプセル化するブラウザ標準の仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Shadow DOM」 = 影のDOM
💬 Shadowは「影」、DOMはDocument Object Modelの略。ホスト要素に付く別のDOMツリーを指すよ。

参考資料

← 用語集にもどる