Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【HTML Living Standard】slot属性の使い方

slot属性の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

slotプロパティは、ウェブコンポーネントのShadow DOMにおいて、外部から与えられたコンテンツをシャドウツリー内の特定の位置に割り当てるための名前を保持するプロパティです。HTMLのグローバル属性の一つとして、任意のHTML要素に指定できます。

このプロパティは、再利用可能なウェブコンポーネントを開発する際に特に重要です。Shadow DOMを使用すると、カスタム要素の内部構造(シャドウツリー)が外部から隔離され、スタイルやスクリプトが互いに影響を与え合うことを防ぐことができます。一方で、カスタム要素の利用者が、その内部構造の一部に独自のコンテンツを挿入したいというニーズが発生します。

このような場合、シャドウツリー内では<slot>要素を配置し、そのname属性でスロットの名前を定義します。そして、カスタム要素に挿入したいコンテンツを持つ要素に対して、その<slot>要素のname属性値と同じ値をslotプロパティとして指定します。これにより、指定されたコンテンツはシャドウツリー内の対応する<slot>要素の位置に挿入され、表示されるようになります。

例えば、<my-component>というカスタム要素が内部に「header」と「body」という名前のスロットを持つ場合、<div slot="header">タイトル</div><p slot="body">本文です</p>のように指定することで、それぞれの要素が対応するスロットに正確に配置されます。slotプロパティは、コンポーネントの内部構造と外部コンテンツを柔軟に連携させ、拡張性の高いコンポーネントを設計するために不可欠な機能です。

公式リファレンス: HTML slot global attribute

構文(syntax)

1<div slot="my-content-slot">これはカスタム要素のスロットに挿入されるコンテンツです。</div>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

HTML slot属性でコンテンツを挿入する

1<!DOCTYPE html>
2<html lang="ja">
3<head>
4    <meta charset="UTF-8">
5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
6    <title>HTML slot属性の基本例</title>
7    <style>
8        /* カスタム要素のスタイル */
9        my-card {
10            display: block; /* ブロック要素として表示 */
11            border: 1px solid #ccc;
12            padding: 10px;
13            margin: 10px;
14            border-radius: 5px;
15            background-color: #f9f9f9;
16        }
17
18        /* Shadow DOM内のスロットコンテンツのスタイル */
19        my-card h2 {
20            color: #333;
21            margin-top: 0;
22        }
23        my-card p {
24            color: #666;
25        }
26    </style>
27</head>
28<body>
29
30    <h1>HTML slot属性の使い方</h1>
31
32    <!-- カスタム要素のインスタンスを配置 -->
33    <my-card>
34        <!-- slot="title" を持つ要素は、カスタム要素内の <slot name="title"> に挿入されます -->
35        <h2 slot="title">カードのメインタイトル</h2>
36        <!-- slot="content" を持つ要素は、カスタム要素内の <slot name="content"> に挿入されます -->
37        <p slot="content">これはカードの本文です。ここに詳細な情報を記述します。</p>
38        <!-- slot属性を持たない要素は、カスタム要素内の名前なしスロット(デフォルトスロット)に挿入されます -->
39        <p>このテキストは、slot属性がないためデフォルトスロットに入ります。</p>
40        <!-- slot="footer" を持つ要素は、カスタム要素内の <slot name="footer"> に挿入されます -->
41        <div slot="footer" style="font-style: italic; color: #999;">
42            <p>カードのフッター情報です。</p>
43        </div>
44    </my-card>
45
46    <script>
47        // カスタム要素を定義するクラス
48        class MyCard extends HTMLElement {
49            constructor() {
50                super(); // 親クラスのコンストラクタを呼び出す
51
52                // Shadow DOMを作成し、カプセル化(mode: 'open' で外部からアクセス可能にする)
53                const shadow = this.attachShadow({ mode: 'open' });
54
55                // Shadow DOMの内部構造を定義
56                // <slot>要素は、外部から挿入されるコンテンツのプレースホルダーです
57                shadow.innerHTML = `
58                    <style>
59                        /* Shadow DOM内部でのみ有効なスタイル */
60                        .card-container {
61                            border: 1px dashed #aaa;
62                            padding: 10px;
63                            background-color: #e0f7fa;
64                        }
65                        .header-slot, .content-slot, .default-slot, .footer-slot {
66                            border: 1px solid #bbb;
67                            padding: 5px;
68                            margin-bottom: 5px;
69                            background-color: #f0f8ff;
70                        }
71                        .header-slot { background-color: #e8f5e9; } /* ヘッダースロットの背景色 */
72                        .content-slot { background-color: #fff3e0; } /* コンテンツスロットの背景色 */
73                        .default-slot { background-color: #ffebee; } /* デフォルトスロットの背景色 */
74                        .footer-slot { background-color: #e3f2fd; } /* フッタースロットの背景色 */
75                    </style>
76                    <div class="card-container">
77                        <div class="header-slot">
78                            <h3>ヘッダー領域:</h3>
79                            <!-- name="title" のスロットに、外部の slot="title" を持つ要素が挿入される -->
80                            <slot name="title"></slot>
81                        </div>
82                        <div class="content-slot">
83                            <h3>コンテンツ領域:</h3>
84                            <!-- name="content" のスロットに、外部の slot="content" を持つ要素が挿入される -->
85                            <slot name="content"></slot>
86                        </div>
87                        <div class="default-slot">
88                            <h3>デフォルトスロット領域(slot属性なし):</h3>
89                            <!-- 名前なしスロット(デフォルトスロット)に、slot属性を持たない外部要素が挿入される -->
90                            <slot></slot>
91                        </div>
92                        <div class="footer-slot">
93                            <h3>フッター領域:</h3>
94                            <!-- name="footer" のスロットに、外部の slot="footer" を持つ要素が挿入される -->
95                            <slot name="footer"></slot>
96                        </div>
97                    </div>
98                `;
99            }
100        }
101
102        // カスタム要素を 'my-card' というタグ名で登録
103        customElements.define('my-card', MyCard);
104    </script>
105</body>
106</html>

HTMLのslot属性は、Web Componentsの一部として使用されるグローバル属性で、カスタム要素の内部に外部からコンテンツを挿入するための仕組みを提供します。これは、再利用可能なコンポーネントを作成する際に、コンポーネントの構造は固定しつつ、その一部の表示内容を柔軟に変更したい場合に非常に役立ちます。

サンプルコードでは、<my-card>というカスタム要素が定義されており、その内部(Shadow DOM)には<slot name="title"><slot name="content">のような名前付きスロットと、<slot>という名前なし(デフォルト)スロットが配置されています。

<my-card>タグを使用する際、その子要素にslot="title"のようにslot属性を指定すると、その要素は<my-card>内部のname="title"と一致する<slot>要素の位置に挿入されて表示されます。同様に、slot="content"を持つ要素はname="content"のスロットに、slot属性を持たない要素は名前なしスロットに挿入されます。

このようにslot属性を使うことで、カスタム要素の利用者側は、要素の内部構造を意識することなく、必要に応じてコンテンツを差し込むことが可能になります。slot属性自体に引数や戻り値はなく、要素がどのスロットに属するかを関連付けるための役割を果たします。

HTMLのslot属性は、Web Componentsのカスタム要素内で外部のコンテンツを柔軟に配置するために使用されます。これは、Shadow DOMと組み合わせて使うことで、コンポーネントの内部構造をカプセル化しつつ、特定の場所にコンテンツを差し込めるようにする仕組みです。

注意点として、slot属性は必ずカスタム要素の子要素に指定し、カスタム要素のShadow DOM内に定義された<slot>要素に対応させる必要があります。slot="名前"で名前付きスロットに割り当て、slot属性がない要素は名前なしのデフォルトスロットに挿入されます。Shadow DOM内外でのスタイルの適用範囲には注意が必要です。外部から挿入された要素は、元のLight DOMのスタイルを保持したままShadow DOM内に投影されます。

HTML slot属性でカスタム要素のコンテンツを配置する

1<!DOCTYPE html>
2<html lang="ja">
3<head>
4    <meta charset="UTF-8">
5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
6    <title>HTML slot 属性のサンプル</title>
7</head>
8<body>
9    <h1>slot 属性の動作例</h1>
10
11    <!-- カスタム要素の定義 -->
12    <script>
13        // MyCardComponent は HTMLElement を継承し、カスタム要素として機能します。
14        class MyCardComponent extends HTMLElement {
15            constructor() {
16                super(); // 親クラスのコンストラクタを呼び出す
17
18                // Shadow DOM を作成し、内部コンテンツをカプセル化します。
19                const shadow = this.attachShadow({ mode: 'open' });
20
21                // Shadow DOM の内部構造を定義します。
22                // <slot> 要素は、カスタム要素の利用者が提供するコンテンツの挿入位置を定義します。
23                // name 属性を持つ <slot> は、特定の名前のコンテンツを受け入れます。
24                shadow.innerHTML = `
25                    <style>
26                        .card {
27                            border: 1px solid #ccc;
28                            padding: 16px;
29                            margin: 16px;
30                            border-radius: 8px;
31                            box-shadow: 2px 2px 5px rgba(0,0,0,0.2);
32                            background-color: #f9f9f9;
33                        }
34                        .header {
35                            font-size: 1.2em;
36                            font-weight: bold;
37                            color: #333;
38                            margin-bottom: 8px;
39                        }
40                        .content {
41                            color: #555;
42                        }
43                        .footer {
44                            font-size: 0.8em;
45                            color: #888;
46                            margin-top: 8px;
47                        }
48                    </style>
49                    <div class="card">
50                        <div class="header">
51                            <!-- 'card-header' という名前のコンテンツがここに挿入されます -->
52                            <slot name="card-header"></slot>
53                        </div>
54                        <div class="content">
55                            <!-- 名前が指定されていないコンテンツ、または不明な名前のコンテンツがここに挿入されます -->
56                            <slot></slot>
57                        </div>
58                        <div class="footer">
59                            <!-- 'card-footer' という名前のコンテンツがここに挿入されます -->
60                            <slot name="card-footer"></slot>
61                        </div>
62                    </div>
63                `;
64            }
65        }
66
67        // 'my-card' というカスタム要素名を定義し、MyCardComponent クラスに関連付けます。
68        customElements.define('my-card', MyCardComponent);
69    </script>
70
71    <!-- 定義したカスタム要素 'my-card' を使用します。 -->
72    <!-- slot 属性を持つ要素は、カスタム要素内部の対応する <slot> に挿入されます。 -->
73    <my-card>
74        <!-- slot="card-header" の内容が、Shadow DOM 内の <slot name="card-header"> に挿入されます -->
75        <h2 slot="card-header">サンプルのカードタイトル</h2>
76        <!-- slot 属性がないため、Shadow DOM 内のデフォルトの <slot> (name属性なし) に挿入されます -->
77        <p>これはカードの本文です。slot属性がないため、デフォルトのスロットに表示されます。</p>
78        <ul>
79            <li>リストアイテム1</li>
80            <li>リストアイテム2</li>
81        </ul>
82        <!-- slot="card-footer" の内容が、Shadow DOM 内の <slot name="card-footer"> に挿入されます -->
83        <span slot="card-footer">© 2023 サンプル</span>
84    </my-card>
85
86    <my-card>
87        <div slot="card-header">
88            <h3>別のカード</h3>
89            <p style="font-size: 0.9em; color: #666;">これはヘッダーの一部です。</p>
90        </div>
91        <p>こちらは2枚目のカードです。異なるコンテンツを配置しています。</p>
92        <button slot="card-footer">詳細を見る</button>
93    </my-card>
94
95</body>
96</html>

HTMLのslot属性は、Web Componentsと呼ばれる技術において、カスタム要素(独自のHTMLタグ)の内部に外部からコンテンツを「差し込む」ためのグローバル属性です。この属性を用いることで、あらかじめ定義されたコンポーネントの骨組みの中に、利用者が自由に内容を組み込むことができ、再利用性の高いコンポーネントを作成できます。

カスタム要素を定義する側は、Shadow DOMと呼ばれる独自の表示領域内に<slot>要素を配置し、コンテンツの挿入位置を宣言します。この<slot>要素には、name属性を付けて「名前付きスロット」とすることが可能です。一方、カスタム要素を利用する側は、挿入したい要素(例えばdivpなど)にslot="名前"と記述することで、そのコンテンツをカスタム要素内部の対応する名前のスロットへ割り当てます。

slot属性が指定されていない要素や、対応する名前のスロットが存在しない要素は、カスタム要素内部に定義されているname属性を持たないデフォルトの<slot>要素に挿入されます。

サンプルコードでは、my-cardというカスタム要素が定義されており、その内部にはcard-headercard-footerという名前付きスロットと、名前なしのデフォルトスロットが用意されています。利用側では、h2要素にslot="card-header"を、span要素にslot="card-footer"を指定することで、対応するスロットにタイトルとフッターをそれぞれ挿入しています。また、slot属性が指定されていないp要素やul要素は、名前なしのデフォルトスロットに挿入される動作を示しています。

slot属性は、要素に特定の意味合いや振る舞いを割り当てるための属性であり、プログラミング言語の関数のように引数を取ったり、特定の値を戻り値として返したりする機能はありません。

slot属性は、Web ComponentsのShadow DOM内で定義された<slot>要素に対して、外部からコンテンツを挿入する役割を果たします。この属性を機能させるには、JavaScriptを用いてカスタム要素を定義し、Shadow DOMを作成することが不可欠です。

カスタム要素に子要素を配置する際、slot="任意の名前"と指定することで、Shadow DOM内の<slot name="任意の名前">に対応する位置にそのコンテンツが割り当てられます。もしslot属性が指定されていない、または対応する名前のスロットがShadow DOM内に存在しない場合、そのコンテンツは名前なしの<slot>要素(デフォルトスロット)に挿入されます。対応するスロットがないコンテンツは、表示されないことに注意が必要です。この仕組みにより、コンポーネントの再利用性とカスタマイズ性が向上します。

関連コンテンツ

関連IT用語