template(テンプレート)要素は、複製され、スクリプトによって文書に挿入することが可能なHTMLの断片を定義します。

template要素内のコンテンツは、ページの読み込み時にはパースされますが、レンダリングツリーには直接挿入されず、JavaScriptを通じて明示的にインスタンス化されるまで表示されない。

template要素によってUIコンポーネントを定義しておくことで、JavaScriptからその内容をコピーしたり、動的にデータを挿入したりすることで、繰り返されるコンテンツなどの生成を容易に行える。

また、shadowRootMode属性によって、Shadow Root(シャドウルート)として宣言することもでき、この場合は、CSSのスコープをShadow Root内に限定するなど、UIコンポーネントの実装時に大きなメリットが享受できる。

template要素説明
カテゴリー・スクリプト支援要素
・フレージングコンテンツ
・フローコンテンツ
・メタデータコンテンツ
コンテンツモデル
使用できる場所メタデータコンテンツが期待される場所
フレージングコンテンツが期待される場所
スクリプト支援要素が期待される場所
span属性を持たないcolgroup要素の直下に記述

tamplate要素で使用できる属性

すべてのHTML要素で使用できる属性になります。

template要素に付与することで、宣言型Shadow Root(シャドウルート)とする。

属性値説明
opentemplate要素は、オープンな宣言型 Shadow Root を表します。Shadow Root 要素には、例えば Element.shadowRootを使用して、ルート外の JavaScriptからアクセスできる。
closedtemplate要素は、閉じた宣言型Shadow rootを表します。外部からのアクセスを防ぎ、Shadow root 要素をカプセル化する。

shadowRootDelegatesFocus属性

属性値は論理属性。

shadowRootDelegatesFocus属性は、template要素に付与することで、delegatesFocusを設定する。

通常、フォーカスは文書の要素間を直接移動しますが、delegatesFocustrueに設定されているシャドウDOMが存在する場合、そのシャドウホストにフォーカスが移動すると、内部のフォーカス可能な要素(例えば、入力フィールドやボタンなど)に自動的にフォーカスが移動する。

shadowRootClonable属性

属性値は論理属性。

shadowRootClonable属性は、template要素に付与することで、Shadow root(シャドウルート)がクローン(複製)可能であることを表します。

使用例

<table>
  <tr><td>名前</td><td>出身地</td><td>性別</td><td>年齢</td></tr>
  <tbody>
    <template id="row">
      <tr><td></td><td><td><td></td></tr>
    </template>
  </tbody>
</table>

<script>
  var data = [
    { 名前: '山本太郎', 出身地: '東京都', 性別: '男性', 年齢: 30 },
    { 名前: '澤田次郎', 出身地: '長野県', 性別: '男性', 年齢: 28 },
    { 名前: '本山三郎', 出身地: '大阪府', 性別: '男性', 年齢: 24 },
    { 名前: '金沢富子', 出身地: '北海道', 性別: '女性', 年齢: 21 }
  ];
 </script>
 <script>
   var template = document.querySelector('#row');
   for (var i = 0; i < data.length; i += 1) {
   	 var cat = data[i];
   	 var clone = template.content.cloneNode(true);
   	 var cells = clone.querySelectorAll('td');
   	 cells[0].textContent = cat.名前;
   	 cells[1].textContent = cat.出身地;
   	 cells[2].textContent = cat.性別;
   	 cells[3].textContent = cat.年齢;
   	 template.parentNode.appendChild(clone);
   }
 </script>

表示

名前出身地性別年齢

カテゴリー: