5.1 <template> タグ
HTMLの<template>
タグは、ページ読み込み時には表示されず、JavaScriptを通して後で使用できるHTMLコードの断片を定義するためのものだよ。これはリストアイテムや製品カードとか、繰り返し出てくる構造を動的に生成・挿入するのに特に便利だね。
<template>
要素は、ページにすぐには表示しないHTMLコードを格納するために使うよ。<template>
の中身はページ読み込み時にはブラウザでレンダリングされないけど、DOM(Document Object Model)を通してアクセス可能で、JavaScriptを使って複製してドキュメントに挿入できるんだ。
構文:
<template>
<!-- テンプレートの内容 -->
</template>
<template> タグの主な特徴
- 内容の非表示化:
<template>
タグ内の内容は、ページ読み込み時には表示されないよ。 - JavaScriptの使用:
<template>
タグの内容は、JavaScriptを通してDOMに複製・挿入できるよ。 - 遅延ロード: 必要な時にだけ内容をロード・表示することで、ページのパフォーマンスが向上できるんだ。
<template> タグの使用例
この例では、「Add Item」ボタンをクリックすると、新しいリストアイテムが作られて<ul>
リストに追加されるよ。
新しいリストアイテムのテンプレートは<template>
タグ内に定義されているよ。
<button id="addButton">Add Item</button>
<ul id="itemList"></ul>
<template id="itemTemplate">
<li class="item">This is a new item</li>
</template>
// DOM内で使用する要素への参照を取得する
const addButton = document.getElementById('addButton'); // 「追加」ボタン
const itemList = document.getElementById('itemList'); // アイテムを追加するリスト
const itemTemplate = document.getElementById('itemTemplate'); // リストアイテムのテンプレート
// 「追加」ボタンにイベントリスナーを追加する
addButton.addEventListener('click', () => {
// リストアイテムテンプレートの内容を複製する
const newItem = itemTemplate.content.cloneNode(true); // trueは全ての子要素を含めて深く複製することを意味するよ
// 新しいアイテムをリストに追加する
itemList.appendChild(newItem);
});
5.2 例: 商品カードの生成
<template>
とJavaScriptを使って、例えば商品のカード一覧を生成できるよ。
<template> タグの使用例:
<h1>商品一覧</h1>
<div id="productList"></div>
<template id="productTemplate">
<div class="item">
<h2 class="title"></h2>
<p class="description"></p>
<span class="price"></span>
</div>
</template>
// スクリプトの実行前にDOMが完全に読み込まれるのを待つ
document.addEventListener('DOMContentLoaded', () => {
// 商品データの配列
const products = [
{ title: '商品 1', description: '商品 1 の説明', price: '100 ドル' },
{ title: '商品 2', description: '商品 2 の説明', price: '200 ドル' },
{ title: '商品 3', description: '商品 3 の説明', price: '300 ドル' },
];
// DOM内の要素への参照を取得する
const productList = document.getElementById('productList'); // 商品リストのコンテナ
const template = document.getElementById('productTemplate').content; // 商品要素のテンプレート
// 商品配列をループし、各商品の要素をリストに作成する
products.forEach(product => {
// 商品テンプレートを複製する
const clone = document.importNode(template, true); // true - 深い複製
// 複製されたテンプレートにデータを埋め込む
clone.querySelector('.title').textContent = product.title;
clone.querySelector('.description').textContent = product.description;
clone.querySelector('.price').textContent = product.price;
// 埋め込まれたテンプレートを商品リストに追加する
productList.appendChild(clone);
});
});
説明
<template>
タグ: ページ読み込み時に表示されないHTMLコードを含んでいるよ。document.importNode(template, true)
メソッド: テンプレートの内容を複製するよ。querySelector
とtextContent
メソッド: 複製されたテンプレートの内容を変更してドキュメントに挿入する前に使うんだ。
5.3 <template> タグの利点
パフォーマンスの向上
テンプレートを使うことで、後で使うHTMLコードを事前に読み込める。これにより、テンプレートの内容はレンダリングされず、ページの初期読み込みには影響しないのでパフォーマンスが向上できるんだ。
動的コンテンツの簡素化
テンプレートは動的コンテンツの生成を簡素化する。JavaScriptを使ってプログラム的にHTMLコードを生成する代わりに、予め用意しておいたテンプレートを複製・修正するだけで済むんだ。
使いやすさと読みやすさ
テンプレートを使うことでコードがより読みやすく、構造化される。同じような要素のHTMLコードを別に保存できるので、JavaScriptに埋め込む必要がないんだ。
条件付きコンテンツ表示の例:
<h1>操作結果</h1>
<div id="messageContainer"></div>
<template id="messageTemplate">
<div class="message">
<p class="content"></p>
</div>
</template>
document.addEventListener('DOMContentLoaded', () => {
// DOM内の要素への参照を取得する
const messageContainer = document.getElementById('messageContainer'); // メッセージ用コンテナ
const template = document.getElementById('messageTemplate').content; // メッセージテンプレート
// メッセージを表示する関数
function showMessage(type, text) {
// メッセージテンプレートを複製する
const clone = document.importNode(template, true); // true - 深い複製
// クローン内のメッセージ要素を取得
const messageDiv = clone.querySelector('.message');
// メッセージのタイプ(success または error)に応じてクラスを追加
messageDiv.classList.add(type);
// メッセージのテキストを設定
messageDiv.querySelector('.content').textContent = text;
// コンテナにメッセージを追加
messageContainer.appendChild(clone);
}
// メッセージを表示するために関数を呼び出す
showMessage('success', '操作が成功しました!');
showMessage('error', '操作中にエラーが発生しました。');
});
説明:
- 関数
showMessage()
: メッセージのタイプ(成功またはエラー)とテキストを受け取り、テンプレートを複製してメッセージコンテナに追加するよ。 - クラス
.success
と.error
: メッセージのタイプに応じて複製されたテンプレートに適用されるスタイルだよ。
GO TO FULL VERSION