ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
template要素とは
<template> は HTML5 で追加された要素で、「ページには描画したくないが、JS から取り出して使いたい HTML 断片」を埋め込むためのものです。中身はパース時に DOM ツリー化されますが、レンダリングされず、スクリプトも実行されず、画像も読み込まれません。一覧表示の繰り返しブロックや、Web Components の Shadow DOM のテンプレートとして使われます。
基本構文
<template id="card-template">
<div class="card">
<h3 class="title"></h3>
<p class="body"></p>
<button class="more">詳しく</button>
</div>
</template>
<div id="list"></div>
<script>
const tpl = document.getElementById('card-template');
const list = document.getElementById('list');
const data = [
{ title: '記事A', body: '本文A' },
{ title: '記事B', body: '本文B' },
];
for (const item of data) {
const node = tpl.content.cloneNode(true); // 深いコピー
node.querySelector('.title').textContent = item.title;
node.querySelector('.body').textContent = item.body;
list.appendChild(node);
}
</script>
特徴
- 中身は document fragment として保持される(
template.content) - 描画されない(display:none を書く必要すらない)
- 中の
<img>や<script>は読み込まれない・実行されない - HTML として不正な入れ子も書ける(
<tr>単体など) - JS で複製してから DOM に挿入するのが基本パターン
innerHTML との比較
| 項目 | innerHTML で連結 | <template> + cloneNode |
|---|---|---|
| パース | 毎回 HTML 文字列をパース | 初回 1 回だけ |
| 速度 | 遅い | 速い |
| XSS | 注意必要(文字列連結で混入しやすい) | safer(textContent で代入できる) |
| イベント | 後から再付与 | テンプレート側に書ける(複製後付与) |
| 可読性 | JS 内の文字列が肥大 | HTML と JS が分離 |
tr / td など不正な入れ子も書ける
通常の HTML では <table> の外に <tr> を書くと自動的に取り除かれてしまいますが、<template> の中であればテーブル断片だけを保持できます。
<template id="row-template">
<tr>
<td class="name"></td>
<td class="email"></td>
</tr>
</template>
<table>
<tbody id="tbody"></tbody>
</table>
Web Components との組み合わせ
Custom Elements の Shadow DOM を初期化するときに <template> がよく使われます。
const tpl = document.createElement('template');
tpl.innerHTML = `
<style>
.greet { color: tomato; font-weight: bold; }
</style>
<p class="greet">Hello, <slot name="name">World</slot>!</p>
`;
class HelloElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' })
.appendChild(tpl.content.cloneNode(true));
}
}
customElements.define('x-hello', HelloElement);
<template> と <slot> の違い
- <template>: ページに描画されないテンプレート定義。JS から取り出して使う
- <slot>: Shadow DOM 内で外部から挿入される箇所を示す。Web Components の差し込み穴
よくある落とし穴
tpl.cloneNode(true)をすると<template> ごとコピーされる — 使いたいのは中身なのでtpl.content.cloneNode(true)を使う- 同じ要素を直接 appendChild すると、最後の 1 つだけ DOM に移動してしまう(複製しないと使い回せない)
- 中身は描画されないので CSS のセレクタも当たらない(複製後に当たる)
- IE11 は未対応(モダンブラウザは全対応)
関連
- その他の要素 — 親カテゴリ
- 要素一覧
- figure要素
- canvas要素
- script要素
- slot要素 — 差し込み穴
- Web Components / Custom Elements / Shadow DOM
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- figure要素
- template要素
- figcaption要素で図に説明を付ける
- canvas要素
- iframe要素
- script要素
- noscript要素
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 Spring Frameworkのアノテーション一覧
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- PHP $_SERVERとは|DOCUMENT_ROOT・PHP_SELFなど主な要素 2026-08-07 17:15:57
- PHPでのファイルアップロード方法|multipart/form-dataと$_FILES 2026-08-07 17:15:57
- Scratchのアカウントの作り方|メールアドレスとユーザー名の登録手順 2026-08-07 17:15:57
- Bluetoothとは|仕組み・BLEとClassicの違い・用途 2026-08-07 17:15:57
- Spring Bootのテスト入門|@SpringBootTestとJUnitでの単体・結合テスト 2026-08-07 17:15:57
- djangoにおけるMVCアプリケーション実装例 2026-08-07 17:15:57
- インストール(eclipseプラグイン) 2026-08-07 17:15:56
- データベースとは?RDB / NoSQL / SQL の基礎 2026-08-07 17:15:56
- Scratch 作品の公開方法 2026-08-07 17:15:56
- インストール方法(Windows版) 2026-08-07 17:15:56
- 【PHPフレームワーク】Laravelの使い方 2026-08-07 17:15:56
- APIキー取得方法 2026-08-07 17:15:56
- Spring Frameworkの使い方 2026-08-07 17:15:56
- Java とは?言語仕様・JVM・主要フレームワーク一覧 2026-08-07 17:15:56
- Google OAuth 2.0 認証の実装方法 2026-08-07 17:15:56
コメントを削除してもよろしいでしょうか?