対象読者 👤
- ShadowDomでstyleをカプセル化したい方
- ShadowDomでstyleをカプセル化する際の注意点を知りたい方
まとめ 💡
- ShadowDOMは基本的にページのJavaScriptやCSSの影響を受けない
- ShadowDOMはShadowHostに指定された継承プロパティの値の影響を受ける
背景
ページの上にShadowDomで表示していたモーダルのテキストがデフォルトの左寄せではなく、中央揃えになっていました。
調べていたところ、ShadowHostのcssを継承していたことが原因だとわかりました。
ShadowDomとは
カスタム要素をページで実行されるJavaScriptやCSSの影響を受けないようにする(カプセル化する)為に使われる技術です。
ページ上に表示するモーダルでこの技術を使ったりします。
それ以外だと例えばinput要素の日付を入力する要素の内部構造に使われたりします。
ShadowHostとは
ShadowDomのDomツリーと紐ついている通常のDomです。
ShadowHostに指定された継承プロパティの値を継承していた
背景で説明した以下について説明します
ページの上にShadowDomで表示していたモーダルのテキストがデフォルトの左寄せではなく、中央揃えになっていました。
調べていたところ、ShadowHostのcssを継承していたことが原因だとわかりました。
See the Pen Untitled by 山根大生 (@uuylkesg-the-styleful) on CodePen.
body要素がShadowHostである場合に以下のCSSがbody要素にあたっていました。
body {
text-align: center;
}
これがShadowDom内のp要素にあたってしまっていました。
CSSにおける継承
ある要素のあるプロパティに値が指定されなかった場合に親要素の値を継承します。
全てのプロパティに継承があるというわけではなく、継承可能なプロパティとして定義されています。
text-alignは継承可能なプロパティです
継承可能なプロパティであることの確認の仕方
MDNの公式定義の「継承」が「あり」になっていれば継承可能なプロパティです。

ShadowHostである要素にこの継承プロパティのCSSが当たっているある場合、ShadowDom内の要素はCSSを継承することが以下の記事でもわかりました。
Shadow DOM は body セレクタに指定された、継承プロパティの値のみ反映されているのがわかります
よって今回のケースだとShadowDom内の要素がbodyに当たっているCSSのうち継承可能なプロパティを継承していたことが分かりました。
body要素に限らずdiv要素だったりShadowHostになりうる要素でも今回のようなCSSの継承は起こります。
例えば<article>,<aside>,<blockquote>,<div>,<footer>,h1などです。
参考
対応
:hostを使って、styleを当てることにしました。
:host {
text-align: left;
}
これにより、ShadowDom要素全体にこのCSSを当てることができます。
そもそもの話ですが、ShadowHostをbodyのようなCSSが当たりやすいものではない別の要素にすることも考えるべきだと思いました。
まとめ
- ShadowDOMは基本的にページのJavaScriptやCSSの影響を受けない
- ShadowDOMはShadowHostに指定された継承プロパティの値の影響を受ける
最後に
- ShadowDomが使われるケースを改めて理解しました
- ShadowHostのCSSは継承してしまうので注意だなと思いました
- ShadowDomとつながっているWebComponetという概念についても改めて整理したいです
参考


