Google Chrome拡張機能(Chrome Extension)のContent Scriptなどを使用すると、既存ページに対して新たなDOM要素を追加することができます。
しかし追加したDOMが既存サイトのCSSから影響を受けたり、また逆に追加したDOMが既存サイトのCSSを上書きしたりとお互いに干渉して影響を及ぼしてしまうことがあります。
そんなときにShadow DOMという技術を使用すると干渉を防ぐことができます。
単純にShadow DOMを使う場合は特に難しいことはありませんが、React+Chakra UIというスキルセットでShadow DOMを使用する場合は少し工夫が必要です。
本記事ではReact+Chakra UIをShadow DOM内で使う方法を紹介します。
- React+Chakra UIをShadow DOM内で使用する
Shadow DOMとは?
Shadow DOMは何をするものなのかをざっくり表すと、
- カプセル化したDOMを構築するもの
- 通常DOMとは別スコープのDOMを構築するもの
という感じになります。
DOMがカプセル化されスコープが分離されることで、CSSが通常DOMとShadow DOMで干渉しないようになります。
冒頭に書いたようにブラウザ拡張機能などで新たなDOMを埋め込みたい場合などに最適です。
Shadow DOMの詳細については本記事では割愛します。
気になる方は参考リンクを見てみると良いかも知れません。
実装
本記事の本題。
React+Chakra UIを使用したDOMをShadow DOMとして構築する実装です。
上記のコードでは
- Chakra UIのカスタムテーマ(Customize Theme)を使用してスタイルを適用
- 適用するスタイルはp要素かつグローバルに指定
しています。
Shadow DOMを使用しない場合はグローバルスタイルが通常DOMにも適用されてしまいます。
しかし、上記のようにShadow DOMを使用することでCSSが分離され、該当のスタイルが通常DOMには適用されずにShadow DOM内にのみ適用されるようになります。
DOMを見てみるとReact+Chakra UIで作成したDOMがShadow DOMとして配置されていることを確認できます。
補足
Chakra UIと同様のコンポーネントライブラリであるMaterial UIでは公式サイトにてShadow DOMの実装方法について示されています。
別のライブラリではありますが、Chakra UIと似ているため参考になる部分も多いです。
Shadow DOM以外でもなにか情報が足りないときはMaterial UIからも情報を得ると良いかも。
最後
React+Chakra UIをShadow DOMで使うということでしたが、私自身がこれを実現するのに調査と試行錯誤になかなかの時間がかかりました。
同じように困っている人の助けになれば嬉しいです。