5.1 Etiqueta <template>
La etiqueta <template>
en HTML permite a los desarrolladores definir fragmentos de código HTML
que no se mostrarán al cargar la página, pero que pueden ser utilizados después a través de JavaScript. Esto es especialmente útil para
la creación e inserción dinámica de contenido, como elementos de lista, tarjetas de producto y otras estructuras repetitivas.
El elemento <template>
se usa para almacenar código HTML que no se mostrará en la página de inmediato.
El contenido dentro de <template>
no se renderiza por el navegador al cargar la página, pero está disponible a través del DOM
(Document Object Model) y puede ser clonado e insertado en el documento con JavaScript.
Sintaxis:
<template>
<!-- Contenido de la plantilla -->
</template>
Características principales de la etiqueta <template>
- Ocultación de contenido: el contenido de la etiqueta
<template>
no se muestra en la página al cargarla. - Uso de JavaScript: el contenido de la etiqueta
<template>
puede ser clonado e insertado en el DOM mediante JavaScript. - Carga diferida: permite cargar y mostrar el contenido solo cuando sea necesario, lo que puede mejorar el rendimiento de la página.
Ejemplo de uso de la etiqueta <template>
En este ejemplo, al hacer clic en el botón "Add Item" se crea un nuevo elemento de lista que se añade a la lista <ul>
.
La plantilla para el nuevo elemento de lista se define dentro de la etiqueta <template>
.
<button id="addButton">Add Item</button>
<ul id="itemList"></ul>
<template id="itemTemplate">
<li class="item">Este es un nuevo elemento</li>
</template>
// Obtenemos referencias a los elementos en el DOM que vamos a usar
const addButton = document.getElementById('addButton'); // Botón "Añadir"
const itemList = document.getElementById('itemList'); // Lista a la que añadiremos elementos
const itemTemplate = document.getElementById('itemTemplate'); // Plantilla de elemento de lista
// Añadimos manejador de eventos al botón "Añadir"
addButton.addEventListener('click', () => {
// Clonamos el contenido de la plantilla del elemento de lista
const newItem = itemTemplate.content.cloneNode(true); // true significa clonación profunda (incluyendo todos los elementos hijos)
// Añadimos nuevo elemento a la lista
itemList.appendChild(newItem);
});
5.2 Ejemplo: generación de tarjetas de producto
Con <template>
y JavaScript puedes, por ejemplo, generar una lista de elementos — tarjetas de producto.
Ejemplo de uso de la etiqueta <template>:
<h1>Lista de productos</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>
// Esperamos a que el DOM esté completamente cargado antes de ejecutar el script
document.addEventListener('DOMContentLoaded', () => {
// Array de datos de productos
const products = [
{ title: 'Producto 1', description: 'Descripción del producto 1', price: '100 USD' },
{ title: 'Producto 2', description: 'Descripción del producto 2', price: '200 USD' },
{ title: 'Producto 3', description: 'Descripción del producto 3', price: '300 USD' },
];
// Obtenemos referencias a los elementos en el DOM
const productList = document.getElementById('productList'); // Contenedor para la lista de productos
const template = document.getElementById('productTemplate').content; // Plantilla del elemento de producto
// Iteramos sobre el array de productos y para cada uno creamos un elemento en la lista
products.forEach(product => {
// Clonamos la plantilla del producto
const clone = document.importNode(template, true); // true - clonación profunda
// Rellenamos los datos en la plantilla clonada
clone.querySelector('.title').textContent = product.title;
clone.querySelector('.description').textContent = product.description;
clone.querySelector('.price').textContent = product.price;
// Añadimos la plantilla llena a la lista de productos
productList.appendChild(clone);
});
});
Explicación
- Etiqueta
<template>
: contiene código HTML que no se muestra en la página al cargarla. - Método
document.importNode(template, true)
: clona el contenido de la plantilla. - Métodos
querySelector
ytextContent
: se usan para cambiar el contenido de la plantilla clonada antes de insertarla en el documento.
5.3 Ventajas de la etiqueta <template>
Mejora del rendimiento
El uso de plantillas permite cargar con anticipación código HTML que será usado más tarde. Esto puede mejorar el rendimiento de la página, ya que el contenido de las plantillas no se renderiza y no afecta la carga inicial de la página.
Simplificación del contenido dinámico
Las plantillas simplifican la creación de contenido dinámico. En lugar de crear el código HTML de manera programática usando JavaScript, puedes simplemente clonar y modificar plantillas ya preparadas.
Comodidad y legibilidad
Las plantillas hacen que el código sea más legible y estructurado, ya que el código HTML para elementos repetitivos puede almacenarse por separado, en lugar de insertarlo en JavaScript.
Ejemplo con visualización condicional de contenido:
<h1>Resultados de la operación</h1>
<div id="messageContainer"></div>
<template id="messageTemplate">
<div class="message">
<p class="content"></p>
</div>
</template>
document.addEventListener('DOMContentLoaded', () => {
// Obtenemos referencias a los elementos en el DOM
const messageContainer = document.getElementById('messageContainer'); // Contenedor de mensajes
const template = document.getElementById('messageTemplate').content; // Plantilla de mensaje
// Función para mostrar un mensaje
function showMessage(type, text) {
// Clonamos la plantilla de mensaje
const clone = document.importNode(template, true); // true - clonación profunda
// Obtenemos referencia al elemento de mensaje dentro del clon
const messageDiv = clone.querySelector('.message');
// Añadimos la clase correspondiente al tipo de mensaje (success o error)
messageDiv.classList.add(type);
// Establecemos el texto del mensaje
messageDiv.querySelector('.content').textContent = text;
// Añadimos el mensaje al contenedor
messageContainer.appendChild(clone);
}
// Llamamos a la función para mostrar mensajes
showMessage('success', '¡Operación completada con éxito!');
showMessage('error', 'Hubo un error al realizar la operación.');
});
Explicación:
- Función
showMessage()
: toma el tipo de mensaje (éxito o error) y el texto del mensaje, clona la plantilla y la añade al contenedor de mensajes. - Clases
.success
y.error
: se aplican a la plantilla clonada dependiendo del tipo de mensaje para el estilo.
GO TO FULL VERSION