ShadowDOMを使って要素をカプセル化する
こんにちは、技術部の U です!
はじめに
グローバルな CSS や Javascript の影響を受けずに DOM を作成したい場面があり、Shadow DOM を使用して実現したので、まとめていきます!
Shadow DOM とは?
Web コンポーネント内の DOM 構造をカプセル化するための技術です。
これにより、コンポーネント内のスタイルとマークアップが外部の DOM から隔離され、外部の CSS や Javascript の影響を受けなくなります。
詳細はこちら
使用例
Javascript
ここでは外部の CSS や Javascript からの影響を受けたくないShadowParagraph
というカスタム要素を作成します。
まず、HTMLElement
のattachShadow
プロパティを使用して、ShadowDOM を作成します。
今回は<shadow-paragraph>
タグ内に ShadowDOM を作成しており、その中に<p>
タグへの赤色のスタイルと<p>Shadow DOMです!!</p>
を定義しています。
js
class ShadowParagraph extends HTMLElement {
constructor() {
super();
// ShadowDOMの作成
const shadow = this.attachShadow({ mode: "closed" });
// カプセル化したい要素を追加
shadow.innerHTML = `
Shadow DOMです!!
`;
}
}
customElements.define("shadow-paragraph", ShadowParagraph);
HTML
比較として通常 DOM の<p>
と先程の<shadow-paragraph>
を表示します。
html
これは通常DOMです!
CSS
グローバルな CSS として、<p>
タグに対して青色と太字のスタイルを適用します。
css
p {
color: blue;
font-weight: bold;
}
結果
通常 DOM は青色と太字が適用されているのに対し、ShadowDOM で定義した部分は赤色のスタイルを適用することができました!
補足
今回のShadowParagraph
クラスでは、attachShadow
プロパティに対して{ mode: "closed" }
を渡しているため、別の Javascript からの影響を受けません。
(Shadow DOM にアクセスしようとするとnull
になります。){ mode: "open" }
を渡すことで別の Javascript からもアクセスできるようになります。
まとめ
外部コンテンツの埋め込みや UI コンポーネントの作成など、DOM をカプセル化したい時には使ってみてください!
関連記事
- 2024-02-21
- テクノロジー