<template>
Das <template>-Element definiert wiederverwendbare HTML-Vorlagen, die beim Laden der Seite nicht gerendert werden. Der Inhalt eines Templates ist komplett inert: Kein CSS wird angewendet, keine Scripts werden ausgeführt, keine Bilder werden geladen. Erst wenn du per JavaScript mit content.cloneNode(true) eine Kopie erstellst und diese ins DOM einfügst, wird der Inhalt sichtbar und aktiv. Das macht <template> zu einem wichtigen Baustein für Web Components und dynamische UIs.
- Kategorie
- Einbettung & Widgets
- Art
- Metadaten
- Beispiele
- 4
- Browser
- 5 von 5
- 0 von 5
- Stand
- 06.02.2026
Grundlagen
Das <template>-Element ist ein besonderer Container, dessen Inhalt vom Browser zwar geparst, aber nicht gerendert wird. Das ist ein entscheidender Unterschied zu einem Element mit display: none, denn ein verstecktes <div> wird trotzdem vollständig verarbeitet: Bilder werden geladen, Scripts ausgeführt, CSS berechnet. Bei <template> passiert nichts davon.
- Der Inhalt eines Templates wird vom HTML-Parser validiert, aber nicht ausgeführt: keine Script-Ausführung, kein Bild-Download, kein CSS-Rendering
- Die Eigenschaft
contentgibt ein DocumentFragment zurück, ein leichtgewichtiges DOM-Objekt, das den Template-Inhalt enthält - Mit
content.cloneNode(true)erstellst du eine tiefe Kopie des Template-Inhalts, die du ins DOM einfügen kannst - Du kannst ein Template beliebig oft klonen, jede Kopie ist unabhängig
- Templates sind die Grundlage für Web Components: In Kombination mit
customElements.define()und Shadow DOM lassen sich eigene HTML-Elemente mit gekapseltem Markup erstellen - Ein Template kann jedes gültige HTML enthalten: Elemente, Text, sogar
<style>- und<script>-Tags (die erst nach dem Einfügen aktiv werden) - Templates haben keine visuellen Attribute, sie sind rein strukturelle Container
Syntax
<template id="gruss-template">
<div class="gruss">Hallo Welt!</div>
</template>
<button id="add-btn">Element hinzufügen</button>
<div id="container"></div>
<script>
const button = document.getElementById("add-btn");
const template = document.getElementById("gruss-template");
const container = document.getElementById("container");
button.addEventListener("click", () => {
// Tiefe Kopie des Template-Inhalts erstellen
const clone = template.content.cloneNode(true);
// Kopie ins DOM einfügen
container.appendChild(clone);
});
</script>Der entscheidende Ablauf: template.content liefert ein DocumentFragment, cloneNode(true) erstellt eine tiefe Kopie davon, und appendChild() fügt die Kopie ins sichtbare DOM ein. Jeder Klick erzeugt eine neue, unabhängige Kopie.
Beispiele
4 BeispieleEin häufiger Anwendungsfall: Du hast eine Liste und willst per Klick neue Einträge hinzufügen. Das Template definiert die Struktur eines einzelnen Listenelements, und JavaScript klont es bei Bedarf.
<template id="item-template">
<li class="list-item">Neuer Eintrag</li>
</template>
<input id="item-input" type="text"
placeholder="Neuen Eintrag eingeben..." />
<button id="add-item-btn">Hinzufügen</button>
<ul id="item-list"></ul>
<script>
const input = document.getElementById("item-input");
const button = document.getElementById("add-item-btn");
const template = document.getElementById("item-template");
const list = document.getElementById("item-list");
button.addEventListener("click", () => {
const text = input.value.trim();
if (!text) return;
const clone = template.content.cloneNode(true);
clone.querySelector("li").textContent = text;
list.appendChild(clone);
input.value = "";
input.focus();
});
</script>Das Template liefert die Grundstruktur, und per textContent wird der Text vor dem Einfügen angepasst. So trennst du Markup-Struktur sauber von den dynamischen Daten.
Wenn du eine Liste von Objekten hast (z.B. aus einer API), kannst du mit einem Template für jedes Objekt eine Karte erzeugen. Das ist das klassische Muster: Ein Template als Stempel, Daten als Input.
<template id="card-template">
<div class="card">
<h3 class="card-title"></h3>
<p class="card-desc"></p>
</div>
</template>
<div id="card-container"></div>
<script>
const kurse = [
{
title: "HTML Grundlagen",
desc: "Lerne die Basis jeder Webseite."
},
{
title: "CSS Layouts",
desc: "Flexbox und Grid meistern."
},
{
title: "JavaScript Einstieg",
desc: "Mach deine Webseite interaktiv."
}
];
const template = document.getElementById("card-template");
const container = document.getElementById("card-container");
kurse.forEach((kurs) => {
const clone = template.content.cloneNode(true);
clone.querySelector(".card-title")
.textContent = kurs.title;
clone.querySelector(".card-desc")
.textContent = kurs.desc;
container.appendChild(clone);
});
</script>