Aller au contenu

Techniques DOM avancées

Maîtriser les techniques DOM avancées peut considérablement améliorer vos compétences en développement web, vous permettant de créer du code plus dynamique, modulaire et maintenable. Ce guide couvre la création et l'utilisation de modèles, et introduit le Shadow DOM pour l'encapsulation et le développement basé sur les composants.

Création et utilisation de modèles

Utilisation de l'élément <template>

L'élément <template> vous permet de définir du contenu HTML qui n'est pas rendu immédiatement lors du chargement de la page. Cela est utile pour créer des extraits HTML réutilisables.


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>

Cet exemple montre la structure de base d'un élément <template> contenant une carte avec un titre et du contenu. Le contenu du modèle est cloné et inséré dans le DOM lors d'un clic sur le bouton.

Clonage et insertion du contenu d'un modèle

Pour utiliser le contenu d'un <template>, vous devez cloner son contenu et l'insérer dans le 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>

Cet exemple montre comment cloner le contenu d'un élément <template> et l'insérer dans le DOM lors d'un clic sur un bouton. Alternativement, document.importNode(template.content, true) peut être utilisé pour importer le contenu du modèle dans le document actuel avant de l'ajouter.

Shadow DOM

Introduction au Shadow DOM

Le Shadow DOM est une norme web qui permet l'encapsulation dans les composants web. Il vous permet de garder la structure interne, le style et le comportement d'un composant cachés de la portée globale du document, évitant ainsi les conflits de styles et de scripts.

Encapsulation et développement basé sur les composants

L'encapsulation est un concept fondamental du Shadow DOM, garantissant que les styles et scripts définis au sein d'un composant ne fuient pas et n'affectent pas le reste du document.


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>

Cet exemple crée un Shadow DOM pour l'élément #shadow-host et y injecte du contenu et des styles. Le contenu du DOM léger (« This is the light DOM content ») est désormais placé dans un span à l'intérieur du #shadow-host, le rendant visible aux côtés du contenu du Shadow DOM via l'élément <slot>. Le Shadow DOM ne remplace pas le contenu du DOM léger, il coexiste avec lui.

Bonnes pratiques

  • Privilégiez DocumentFragment pour le Shadow DOM : Ajouter un fragment à la racine de l'ombre en une seule opération minimise les recalculs de mise en page et améliore les performances de rendu.
  • Utilisez document.importNode() pour les modèles : Lors du clonage de contenu entre différents documents ou iframes, importNode garantit une propriété correcte des nœuds et empêche les erreurs inter-documents.
  • Gardez le DOM léger minimal : Utilisez les éléments <slot> pour projeter uniquement le contenu nécessaire, en gardant l'élément hôte propre et prévisible.

INFO

Exploitez le Shadow DOM pour encapsuler les styles et les fonctionnalités au sein des composants, en prévenant les conflits de styles et en garantissant un code modulaire et maintenable.

Conclusion

Les techniques DOM avancées, comme l'utilisation de modèles et du Shadow DOM, sont des outils puissants pour créer des applications web modulaires, maintenables et performantes. En encapsulant les styles et comportements des composants et en utilisant des modèles réutilisables, vous pouvez améliorer votre flux de développement et construire des applications web robustes.

Pratique

Parmi les affirmations suivantes concernant les techniques avancées de manipulation du DOM, lesquelles sont vraies ?

Trouvez-vous cela utile?

Aperçu dual-run — comparez avec les routes Symfony en production.