概要
- <template>要素 の属性・使い方・注意点の整理
- Declarative Shadow DOM の概要と属性説明
- DocumentFragment 利用時の注意点
- 具体的なHTML・JavaScript例 による実装方法
- 関連仕様・アクセシビリティ・参考情報 の紹介
<template>要素の属性と使い方
- グローバル属性 に加え、<template>要素は特有の属性を持つ
- shadowrootmode :親要素にシャドウルートを宣言的に作成
- open :内部シャドウDOMをJavaScriptから参照可能(推奨)
- closed :内部シャドウDOMをJavaScriptから隠蔽
- shadowrootclonable :Node.cloneNode()やDocument.importNode()でシャドウルートごと複製可能に設定
- shadowrootdelegatesfocus :非フォーカス要素選択時、最初のフォーカス可能要素へフォーカスを委譲
- shadowrootserializable(実験的) :ShadowRootをシリアライズ可能に設定
- shadowrootmode :親要素にシャドウルートを宣言的に作成
- shadowroot属性 は非推奨。Chrome 90-110で一時的にサポートされていたが、現在は shadowrootmode に統一
<template>要素の利用上の注意
- <template>要素自体には実体の子要素は存在しない
- Node.childNodes は常に空
- contentプロパティ 経由でのみ内部DOMにアクセス
- appendChild()等で直接子要素を追加 すると、contentプロパティのDocumentFragmentには反映されない
- <html>、<head>、<body>タグは構文エラー として無視される
- 許可される親要素 :メタデータ・フロー・フレージング・スクリプトサポート要素を許容する全ての要素
<template>の主な用途
-
テンプレート文書フラグメント
- contentプロパティ は読み取り専用のDocumentFragmentを返却
- cloneNode() で複製し、任意の場所に挿入可能
- DocumentFragment の落とし穴:イベントハンドラはフラグメント自体に付与しても移動されない
- 子要素に直接イベントハンドラをつけることが推奨
-
Declarative Shadow DOM
- shadowrootmode 属性(open/closed)指定時、HTMLパーサが即座にShadowRootを生成
- 親要素にShadowRootがアタッチされ、<template>の内容がその内部DOMとなる
- 複数のdeclarative shadow root が存在する場合、最初の1つのみShadowRoot化。以降は通常のHTMLTemplateElementとして扱われる
コード例
-
テーブル行生成例
- <table>と<template>要素を用意
- JavaScriptでテンプレートを複製し、tbodyへ挿入
- テンプレート未対応ブラウザでは代替処理
-
Declarative Shadow DOM実装例
- グローバルstyle と ShadowRoot内style の挙動比較
- shadowrootmode 対応確認し、非対応時に警告表示
- ShadowRoot内のp要素に異なるスタイル適用
-
shadowrootdelegatesfocus利用例
- shadowrootdelegatesfocus 属性あり・なしの比較
- テキスト(非フォーカス要素)クリック時のフォーカス挙動の違い
-
DocumentFragmentのイベント伝播例
- Fragment自身にイベント付与 → 移動時にハンドラ消失
- 子要素にイベント付与 → 正常にイベント発火
技術仕様と互換性
- 内容カテゴリ :メタデータ・フロー・フレージング・スクリプトサポート
- 許可内容 :なし(内部DOMはcontentプロパティ経由でのみ取得)
- タグ省略不可 :開始・終了タグ必須
- ARIAロール :なし
- DOMインターフェース :HTMLTemplateElement
- ブラウザ互換性 :主要ブラウザで対応(詳細はMDN等参照)
関連情報・参考リンク
- part/exportparts属性
- <slot>要素
- :has-slotted, :host, :host(), :host-context()疑似クラス
- ::part, ::slotted疑似要素
- ShadowRootインターフェース
- テンプレート・スロット利用ガイド
- CSSスコープモジュール
- Declarative Shadow DOM解説(web.dev, MDN等)