Shadow DOM内のスコープ付きスタイル
シャドーツリー内の要素にだけ作用するCSSを書きます
「Shadow DOM内のスコープ付きスタイル」はCoddyKit上の無料HTML Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはHTML Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 HTML Academyコースには全4レッスンが含まれています。
デフォルトでの CSS カプセル化
シャドウルート内のすべての <style> ルールは、そのルートの内部だけに適用されます。シャドウツリー内の p { color: red } は、そのシャドウ内の段落だけを赤くします。メインドキュメントの段落には影響せず、メインドキュメントのスタイルもシャドウ内部には届きません。
カプセル化が重要な理由
カプセル化により、大規模なアプリケーションを何十年も悩ませてきたグローバル CSS の問題を解消できます。コンポーネントのスタイルがサイトの CSS によって意図せず上書きされることも、コンポーネントが誤ってサイトを壊すこともありません。この境界を定めるのは慣例ではなく仕様です。
:host 疑似クラス
シャドウ内部から :host を使用すると、ホスト要素をスタイルできます。セレクターで対象を絞るには :host(selector) を使用します。:host([open]) { display: block; } は、open 属性が存在する場合にだけホスト要素に一致します。
継承されるプロパティは引き続き境界を越える
継承可能な CSS プロパティ(color、font-family、line-height)は、継承によってシャドウの境界を越えます。ドキュメントで body { color: blue } を設定すると、シャドウ側で明示的に上書きしない限り、シャドウ内のテキストも青色になります。これは機能の一つであり、タイポグラフィのデフォルトを一貫させられます。
CSS カスタムプロパティで境界を越える
カスタムプロパティ(CSS 変数)はシャドウルートを通じて継承されるため、コンポーネントのテーマ設定 API を公開する標準的な方法です。シャドウ内部で --card-bg: var(--surface, white) を宣言し、利用側がホスト上の --surface を上書きできるようにします。
/* Shadow */
:host {
background: var(--card-bg, white);
}
/* Page */
my-card {
--card-bg: #f3f4f6;
}外部スタイル用の ::part
シャドウ内部の要素に part="name" を付けると、利用側は my-card::part(name) { ... } を使ってスタイルを適用できます。シャドウツリーの大部分をカプセル化したまま、個別のスタイル適用ポイントとして part を使用してください。
Adopted Stylesheets
shadowRoot.adoptedStyleSheets = [sheet] を使用すると、1 つの CSSStyleSheet を複数のシャドウルートで共有でき、繰り返し行われる <style> の解析を避けられます。new CSSStyleSheet() でシートを作成し、sheet.replaceSync(cssText) で内容を設定します。デザインシステムでは大きなパフォーマンス向上につながります。
宣言の順序
シャドウの innerHTML の最上部に <style> タグを配置すると、DOM の残りの部分が構築される前にスタイルが解析されます。これにより、解析の順序が遅れてスタイルが適用される場合に発生する、スタイル未適用コンテンツの一瞬のちらつきを防げます。
祖先に基づくルールのための :host-context
:host-context(.dark-mode) :host は、シャドウの外側にある祖先セレクターに基づいてホストをスタイルします。上位のラッパーに付けたクラスに基づいてコンポーネントのテーマを設定する場合に便利です。ブラウザーの対応状況は良好ですが、対象ブラウザーの対応マトリックスで確認してください。
グローバルリセットは外側に留まる
ドキュメント全体に適用する CSS リセット(body のマージンや box-sizing など)は、シャドウツリーには影響しません。必要なリセットを各シャドウルート内で再適用するか、構築したスタイルシートをすべてのコンポーネントに適用して共有してください。
シャドウスタイルのデバッグ
Chrome DevTools の Elements パネルでは、シャドウルートが「#shadow-root (open)」として表示されます。他の CSS と同じように、:host 疑似クラスや ::part ルールを含め、シャドウスタイルを調査、編集、切り替えできます。
理解度チェック
CSS カスタムプロパティ(変数)が Shadow DOM コンポーネントのテーマ設定に推奨される方法なのはなぜですか。
まとめ
Shadow DOM は、両方向にスタイルをカプセル化します。:host でホストをスタイルし、継承される CSS カスタムプロパティでテーマ設定用のフックを公開し、::part で個別の要素をスタイル可能にします。adoptedStyleSheets でスタイルシートを共有し、ドキュメント全体の CSS は境界を越えないため、各シャドウルート内でリセットを再適用してください。
AI チューターと学ぶ HTML — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 40
- レッスン
- 159
よくある質問
「Shadow DOM内のスコープ付きスタイル」レッスンは無料ですか?
はい。「Shadow DOM内のスコープ付きスタイル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、HTML Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 HTML Academyコースには全4レッスンが含まれています。
「Shadow DOM内のスコープ付きスタイル」で何を学びますか?
シャドーツリー内の要素にだけ作用するCSSを書きます ブラウザで直接実行するハンズオンコードでHTML Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
HTML Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのHTML Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Shadow DOM内のスコープ付きスタイル」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このHTML Academyレッスンでコードを書いて実行できますか?
はい。すべてのHTML Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- attachShadowとShadow Root
- コンテンツ配分のためのSlot要素
- Shadow DOM内のスコープ付きスタイル
- 外部スタイル設定のためのpartとexportparts