Saltar al contenido

Técnicas avanzadas del DOM

Dominar técnicas avanzadas del DOM puede mejorar significativamente tus habilidades de desarrollo web, permitiéndote crear código más dinámico, modular y mantenible. Esta guía cubre la creación y el uso de plantillas, e introduce el Shadow DOM para la encapsulación y el desarrollo basado en componentes.

Creación y uso de plantillas

Uso del <template> Element

El elemento <template> te permite definir contenido HTML que no se renderiza inmediatamente al cargar la página. Esto es útil para crear fragmentos HTML reutilizables.


html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Using the <template> Element</title>
</head>
<body>
    <template id="my-template">
        <div class="card">
            <h2>Title</h2>
            <p>Content goes here...</p>
        </div>
    </template>
    <button id="show-template">Show Template</button>
    <div id="content"></div>

    <script>
        document.getElementById('show-template').addEventListener('click', () => {
            const template = document.getElementById('my-template');
            const content = document.getElementById('content');
            const clone = template.content.cloneNode(true);
            content.appendChild(clone);
        });
    </script>
</body>
</html>

Este ejemplo muestra la estructura básica de un elemento <template> que contiene una tarjeta con un título y contenido. El contenido de la plantilla se clona e inserta en el DOM al hacer clic en un botón.

Clonar e insertar contenido de plantilla

Para usar el contenido de un <template>, clonas su contenido y lo insertas en el DOM.


html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Cloning and Inserting Template Content</title>
</head>
<body>
    <template id="my-template">
        <div class="card">
            <h2>Dynamic Title</h2>
            <p>Dynamic content goes here...</p>
        </div>
    </template>

    <button id="add-card">Add Card</button>
    <div id="container"></div>

    <script>
        document.getElementById('add-card').addEventListener('click', () => {
            const template = document.getElementById('my-template');
            const clone = template.content.cloneNode(true);
            document.getElementById('container').appendChild(clone);
        });
    </script>
</body>
</html>

Este ejemplo muestra cómo clonar el contenido de un elemento <template> e insertarlo en el DOM al hacer clic en un botón. Alternativamente, se puede usar document.importNode(template.content, true) para importar el contenido de la plantilla al documento actual antes de agregarlo.

Shadow DOM

Introducción a Shadow DOM

Shadow DOM es un estándar web que permite la encapsulación en componentes web. Te permite mantener oculta la estructura interna, el estilo y el comportamiento de un componente del alcance global del documento, evitando conflictos de estilos y scripts.

Encapsulación y desarrollo basado en componentes

La encapsulación es un concepto fundamental de Shadow DOM, asegurando que los estilos y scripts definidos dentro de un componente no se filtren ni afecten al resto del documento.


html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Shadow DOM Example</title>
    <style>
        .card {
            padding: 20px;
            margin: 10px;
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>
    <div id="shadow-host" class="card">
        <span>This is the light DOM content</span>
    </div>

    <script>
        const host = document.getElementById('shadow-host');
        const shadowRoot = host.attachShadow({ mode: 'open' });

        const fragment = document.createDocumentFragment();
        const style = document.createElement('style');
        style.textContent = `.shadow-card { padding: 20px; margin: 10px; border: 1px solid blue; color: blue; }`;
        const slot = document.createElement('slot');
        const card = document.createElement('div');
        card.className = 'shadow-card';
        card.textContent = 'This is inside the Shadow DOM';

        fragment.appendChild(style);
        fragment.appendChild(slot);
        fragment.appendChild(card);
        shadowRoot.appendChild(fragment);
    </script>
</body>
</html>

Este ejemplo crea un Shadow DOM para el elemento #shadow-host e inyecta contenido y estilos en él. El contenido del light DOM ("This is the light DOM content") ahora se coloca dentro de un span dentro de #shadow-host, haciéndolo visible junto al contenido del shadow DOM a través del elemento <slot>. El shadow DOM no sobrescribe el contenido del light DOM, sino que coexiste con él.

Mejores prácticas

  • Preferir DocumentFragment para Shadow DOM: Agregar un fragmento a la raíz del shadow DOM en una sola operación minimiza los recálculos de diseño y mejora el rendimiento de renderizado.
  • Usar document.importNode() para plantillas: Al clonar contenido entre diferentes documentos o iframes, importNode garantiza la propiedad correcta de los nodos y previene errores entre documentos.
  • Mantener el Light DOM mínimo: Usa elementos <slot> para proyectar solo el contenido necesario, manteniendo el elemento host limpio y predecible.

INFO

Aprovecha Shadow DOM para encapsular estilos y funcionalidades dentro de los componentes, evitando conflictos de estilos y asegurando un código modular y mantenible.

Conclusión

Las técnicas avanzadas del DOM, como el uso de plantillas y Shadow DOM, son herramientas poderosas para crear aplicaciones web modulares, mantenibles y eficientes. Al encapsular los estilos y comportamientos de los componentes y utilizar plantillas reutilizables, puedes mejorar tu flujo de trabajo de desarrollo y construir aplicaciones web robustas.

Práctica

¿Cuáles de las siguientes afirmaciones sobre técnicas avanzadas de manipulación del DOM son verdaderas?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.