Let’s take one interactive feature apart so the markup and behavior make sense separately.
What You Need to Know
Reusable template content is inert until a script clones it. This lets you create several similar cards from one HTML structure while changing only their individual data.
Try the Example
Take a look at the example. We’ll explain the important lines right below it.
<template id="card-template">
<article class="project-card">
<h2>School project</h2>
<p>Project details appear here.</p>
</article>
</template>
<div id="cards"></div>
<script>
const cardTemplate = document.querySelector("#card-template");
document.querySelector("#cards").append(cardTemplate.content.cloneNode(true));
</script>
Let’s Read the Code
- <template>: A template stores markup that is inactive until it is cloned or used as declarative shadow content.
- <h2>: A heading divides the page into understandable parts.
- id: An id uniquely identifies an element on this page.
Read the named elements and attributes together. They explain how the browser connects this feature to the rest of the page.
What Happens in the Browser?
When this example includes JavaScript, it supplies behavior that ordinary HTML does not automatically provide. Always think about a fallback.
What makes it interactive? Look for the JavaScript that finds an element and reacts to an event. HTML provides the initial controls and content; the script updates the page. Try removing the script to see which part still works natively.
Your Turn
Run this on a local development server if it loads modules or resources. Change the visible text or trigger and check what still works with scripts disabled.
Common Beginner Mistakes
- Assuming new HTML syntax works in every browser without testing.
- HTML supplies structure; JavaScript is necessary for the scripted behavior in this example. Check keyboard access and focus movement too.
Key Takeaways
- Reusable template content is inert until a script clones it.
- <template>: A template stores markup that is inactive until it is cloned or used as declarative shadow content.
- Test the behavior you expect rather than trusting how the snippet looks in your editor.