コンテンツにスキップ

HTML/TEMPLATE

出典: フリー教科書『ウィキブックス(Wikibooks)』

TEMPLATE要素

[編集]

TEMPLATE要素は、HTMLにおいて「再利用可能なテンプレート」を記述するための要素です。この要素に含まれる内容は、ブラウザによって初期表示時には「無効化」されるため、直接的に画面にレンダリングされることはありません。代わりに、JavaScriptを使って動的に複製・挿入して活用されます。これにより、動的コンテンツの生成や再利用が効率的に行えます。

基本構造

[編集]

以下は、TEMPLATE要素の基本的な構造の例です。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>TEMPLATE要素の基本例</title>
</head>
<body>
    <h1>商品リスト</h1>
    <template id="product-template">
        <div class="product">
            <h2 class="product-name"></h2>
            <p class="product-description"></p>
        </div>
    </template>
    <div id="product-list"></div>
    <script>
        // JavaScriptでテンプレートを利用する例
        const template = document.querySelector('#product-template');
        const productList = document.querySelector('#product-list');
        
        const products = [
            { name: 'りんご', description: '新鮮な青森産のりんごです。' },
            { name: 'みかん', description: '甘くてジューシーな静岡産のみかんです。' },
        ];
        
        products.forEach(product => {
            const clone = template.content.cloneNode(true);
            clone.querySelector('.product-name').textContent = product.name;
            clone.querySelector('.product-description').textContent = product.description;
            productList.appendChild(clone);
        });
    </script>
</body>
</html>

この例では、template要素に再利用可能なHTML構造を定義し、JavaScriptを使ってその構造を複製して動的に内容を挿入しています。

TEMPLATE要素の特性

[編集]
  1. 非表示状態
    TEMPLATE要素内のコンテンツは初期状態では「無効化」され、ブラウザのレンダリングツリーに影響を与えません。そのため、ユーザーには表示されず、またCSSによるスタイル指定も無視されます。
    <template>
        <p style="color: red;">このテキストは表示されません。</p>
    </template>
    
    上記の例では、<p>要素にスタイルが指定されていますが、TEMPLATE要素内にあるため無効化されます。
  2. 再利用可能
    TEMPLATE要素の内容はJavaScriptを使用して自由に複製できます。これにより、同一の構造を複数箇所で使用する際に効率的です。
    const template = document.querySelector('template');
    const clone = template.content.cloneNode(true);
    document.body.appendChild(clone);
    
  3. Document Fragment
    TEMPLATE要素のcontentプロパティはDocumentFragmentオブジェクトを返します。これは軽量でDOMの一部として直接扱えないため、高速な操作が可能です。

TEMPLATE要素の活用例

[編集]

動的フォームの生成

[編集]

以下の例は、動的にフォームフィールドを追加するシナリオを示します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>フォームの動的生成</title>
</head>
<body>
    <h1>参加者登録</h1>
    <template id="form-template">
        <div class="participant">
            <label>名前: <input type="text" name="name[]"></label>
            <button type="button" class="remove">削除</button>
        </div>
    </template>
    <form id="registration-form">
        <button type="button" id="add-participant">参加者を追加</button>
        <button type="submit">送信</button>
    </form>
    <script>
        const template = document.querySelector('#form-template');
        const form = document.querySelector('#registration-form');
        const addButton = document.querySelector('#add-participant');
        
        addButton.addEventListener('click', () => {
            const clone = template.content.cloneNode(true);
            clone.querySelector('.remove').addEventListener('click', (event) => {
                event.target.closest('.participant').remove();
            });
            form.insertBefore(clone, addButton);
        });
    </script>
</body>
</html>

この例では、TEMPLATE要素を用いて参加者情報入力フィールドを動的に生成・削除する方法を示しています。

注意点

[編集]
  • TEMPLATE要素自体は埋め込まれても非表示であるため、直接的なスタイル指定やレンダリング効果を期待してはいけません。
  • JavaScriptが無効化されている環境では機能しないため、フォールバックの仕組みを検討する必要があります。

まとめ

[編集]

TEMPLATE要素は、動的コンテンツの生成や再利用において強力な機能を提供します。その特性を理解し、JavaScriptと組み合わせて使用することで、より効率的なWebアプリケーション開発が可能となります。