Ressources pour développeur web

Théme de la semaine : I.A et sécurité

Shadow DOM : Création de composant web isolé

Temps de lecture estimé : 9 minutes
Accueil Javascript Shadow DOM : Création de composant web isolé

Le Shadow DOM fait partie des technologies les plus puissantes du développement web moderne, pourtant beaucoup de développeurs débutants passent complètement à côté. Son objectif est simple : créer des composants HTML totalement isolés, avec leur propre CSS et leur propre structure, sans risquer de casser le reste du site. Et quand on a déjà perdu du temps à cause d’un conflit CSS difficile à comprendre, on réalise vite à quel point cette technologie peut devenir précieuse.

Dans ce tutoriel, vous allez découvrir comment fonctionne le Shadow DOM, pourquoi il est utilisé dans les Web Components et comment créer vos propres composants réutilisables étape par étape. Même si le concept peut sembler impressionnant au premier abord, vous verrez qu’il est finalement beaucoup plus accessible qu’il n’y paraît.

  • Comprendre pourquoi certains styles CSS “cassent” un site et comment le Shadow DOM permet enfin d’isoler proprement ses composants web.
  • Créer des éléments HTML modernes et réutilisables avec leur propre structure, leur propre design et un comportement totalement indépendant.
  • Passer d’un simple composant statique à un mini projet concret capable de fonctionner sur n’importe quel site sans provoquer de conflits visuels.

Le développement web moderne évolue vite. Très vite. Entre les frameworks JavaScript, les composants réutilisables et les interfaces toujours plus complexes, les développeurs cherchent constamment des solutions pour mieux organiser leur code. Et justement, le Shadow DOM fait partie de ces technologies qui changent la manière de construire des interfaces web.

À la fin de ce tutoriel, vous serez capable de créer vos propres composants web encapsulés, avec un style totalement indépendant du reste de la page.

Qu’est-ce que le Shadow DOM ?

Le Shadow DOM est une technologie native du navigateur qui permet de créer une zone HTML isolée à l’intérieur d’un élément.

Dit autrement :

Vous pouvez créer un mini DOM privé qui ne sera pas influencé par le reste de votre page.

Oui, cela peut sembler un peu abstrait au début. Prenons donc une image simple.

Imaginez une maison avec plusieurs pièces. Dans une maison classique, tout le monde peut entrer partout et déplacer les meubles. Résultat : chaos garanti.

Le Shadow DOM fonctionne comme une pièce verrouillée. Ce qu’il y a à l’intérieur reste protégé du reste de la maison.

En développement web, cela signifie que :

  • votre CSS reste isolé,
  • vos composants ne cassent pas le style global,
  • le code devient plus modulaire,
  • les conflits entre styles disparaissent presque totalement.

Le Shadow DOM fait partie des technologies des Web Components avec :

C’est l’un des piliers du web moderne.

Shadow DOM

Pourquoi le Shadow DOM existe-t-il ?

Avant son apparition, les développeurs avaient un problème récurrent : les conflits CSS.

Imaginez ce code CSS :

button {
    background: red;
    color: white;
}

Sur une petite page, aucun souci. Mais sur un gros projet ? Catastrophe potentielle…

Tous les boutons du site deviennent rouges, même ceux d’un plugin, d’une bibliothèque ou d’un composant tiers.

  • Le Shadow DOM a été créé pour résoudre ce problème.

Grâce à lui, un composant peut avoir :

  • son propre HTML,
  • son propre CSS,
  • son propre comportement JavaScript.

Et surtout : tout cela reste encapsulé.

C’est exactement ce que font les navigateurs avec certains éléments natifs.

Par exemple, un champ <input type="range"> possède déjà son propre Shadow DOM interne.

Le navigateur utilise donc lui-même cette technologie depuis longtemps.

Le DOM classique vs le Shadow DOM

Avant d’aller plus loin, il est important de comprendre la différence entre le DOM classique et le Shadow DOM.

Le DOM classique

Quand vous créez une page HTML, tous les éléments appartiennent au même arbre DOM :

<body>
    <h1>Bienvenue</h1>
    <button>Cliquer</button>
</body>

Tout le CSS de la page peut modifier ces éléments.

👉 Comprendre le DOM en JS

Le Shadow DOM

Avec le Shadow DOM, vous créez une sorte de sous-arbre isolé.

Exemple :

<mon-bouton></mon-bouton>

À l’intérieur de ce composant, vous pouvez avoir :

<button>Mon bouton privé</button>

Mais ce bouton est protégé du CSS global.

C’est là toute la magie.

Comment créer un Shadow DOM ?

Passons maintenant à la pratique.

Pour créer un Shadow DOM, JavaScript fournit une méthode appelée :

attachShadow()

Voyons cela étape par étape. Prenons un premier exemple simple.

Commençons par créer un fichier HTML.

Étape 1 : le HTML

<div id="composant"></div>

Étape 2 : le JavaScript

const composant = document.getElementById("composant");

const shadow = composant.attachShadow({
    mode: "open"
});

shadow.innerHTML = `
    <h2>Bonjour depuis le Shadow DOM</h2>
`;

Décomposons tranquillement ce code.

Sélection de l’élément

const composant = document.getElementById("composant");

On récupère simplement un élément HTML classique.

Création du Shadow DOM

const shadow = composant.attachShadow({
    mode: "open"
});

Ici, on crée le Shadow DOM.

Le paramètre mode peut avoir deux valeurs :

  • open
  • closed

Mode open

Le mode open permet d’accéder au Shadow DOM depuis JavaScript :

console.log(composant.shadowRoot);

Mode closed

Le mode closed bloque cet accès.

mode: "closed"

Dans ce cas :

console.log(composant.shadowRoot);

renvoie null.

  • Pour apprendre, utilisez toujours open.

Ajouter du CSS dans le Shadow DOM

Le véritable intérêt apparaît ici.

Essayons ceci :

<style>
h2 {
    color: red;
}
</style>

<div id="composant"></div>

Puis :

const composant = document.getElementById("composant");

const shadow = composant.attachShadow({
    mode: "open"
});

shadow.innerHTML = `
    <h2>Titre dans le Shadow DOM</h2>
`;

Le titre ne sera PAS rouge. Pourquoi ?

  • Parce que le CSS global ne traverse pas le Shadow DOM.

C’est un peu comme essayer de crier à travers une porte blindée.

Ajouter un style interne

Pour styliser votre composant, il faut ajouter un <style> directement dans le Shadow DOM.

shadow.innerHTML = `
    <style>
        h2 {
            color: blue;
            font-size: 30px;
        }
    </style>

    <h2>Titre isolé</h2>
`;
  • Cette fois, le style fonctionne.

Les avantages du Shadow DOM

Le Shadow DOM apporte énormément d’avantages.

Isolation du CSS

C’est l’avantage principal.

Vos composants deviennent indépendants.

Vous évitez :

  • les conflits de styles,
  • les effets de bord,
  • les bugs visuels incompréhensibles.

Et franchement… quand on a déjà passé plusieurs minutes à chercher pourquoi un bouton est soudainement devenu violet, on apprécie énormément cette isolation.

Réutilisation des composants

Un composant Shadow DOM peut être utilisé partout.

  • Même sur un autre site.
  • Même dans un autre projet.
  • Même dans WordPress.

Maintenance plus simple

Le code devient modulaire.

Chaque composant possède :

  • sa structure,
  • son style,
  • son comportement.

C’est beaucoup plus propre.

Compatibilité native

Le Shadow DOM est supporté par tous les navigateurs modernes.

  • Pas besoin de framework.
  • Pas besoin de bibliothèque externe.

Les limites du Shadow DOM

Le Shadow DOM n’est pas parfait non plus.

Il faut connaître ses limites.

Formation web et informatique - Alban Guillier - Formateur

Des formations informatique pour tous !

Débutant ou curieux ? Apprenez le développement web, le référencement, le webmarketing, la bureautique, à maîtriser vos appareils Apple et bien plus encore…

Formateur indépendant, professionnel du web depuis 2006, je vous accompagne pas à pas et en cours particulier, que vous soyez débutant ou que vous souhaitiez progresser. En visio, à votre rythme, et toujours avec pédagogie.

Découvrez mes formations Qui suis-je ?

Le CSS global ne passe plus

Cela peut devenir gênant.

Par exemple :

  • vos polices globales,
  • vos variables CSS,
  • vos thèmes,
  • vos styles utilitaires,

ne s’appliquent pas automatiquement.

Il faut parfois les réinjecter.

Le débogage peut être plus complexe

Quand un composant possède plusieurs niveaux de Shadow DOM, le code devient moins lisible dans les outils développeur.

Le référencement SEO

Bonne nouvelle : Google comprend le Shadow DOM.

Mais certains moteurs ou outils plus anciens peuvent avoir des difficultés.

Les pseudo-sélecteurs spéciaux

Le Shadow DOM possède quelques sélecteurs CSS spécifiques.

Le sélecteur :host

:host cible le composant lui-même.

Exemple :

shadow.innerHTML = `
<style>
:host {
    display: block;
    border: 2px solid black;
    padding: 20px;
}
</style>

<p>Bonjour</p>
`;

Ici, le style s’applique à l’élément parent du Shadow DOM.

Le sélecteur ::slotted

Ce sélecteur permet de styliser le contenu injecté via un slot.

Oui, cela semble technique.

Mais on va voir cela simplement.

Comprendre les slots

Les slots servent à injecter du contenu dans un composant :

<ma-carte>
    <p>Texte injecté</p>
</ma-carte>

Composant :

shadow.innerHTML = `
<slot></slot>
`;

Le paragraphe apparaît dans le composant.

Exemple complet avec slot

class MaCarte extends HTMLElement {

    constructor() {
        super();

        const shadow = this.attachShadow({
            mode: "open"
        });

        shadow.innerHTML = `
            <style>
                div {
                    border: 1px solid #ccc;
                    padding: 20px;
                    border-radius: 10px;
                }

                ::slotted(p) {
                    color: blue;
                    font-weight: bold;
                }
            </style>

            <div>
                <slot></slot>
            </div>
        `;
    }
}

customElements.define("ma-carte", MaCarte);

HTML :

<ma-carte>
    <p>Bonjour le slot</p>
</ma-carte>

Les Custom Elements et le Shadow DOM

Le Shadow DOM est souvent utilisé avec les Custom Elements.

Un Custom Element permet de créer ses propres balises HTML.

Exemple :

<mon-profil></mon-profil>

C’est très puissant.

Créer un vrai composant moderne

Passons maintenant à quelque chose de plus concret.

Nous allons créer une carte utilisateur.

Structure du composant

class CarteUtilisateur extends HTMLElement {

    constructor() {
        super();

        const shadow = this.attachShadow({
            mode: "open"
        });

        shadow.innerHTML = `
            <style>

                .card {
                    border: 1px solid #ddd;
                    padding: 20px;
                    border-radius: 12px;
                    width: 250px;
                    font-family: Arial;
                    box-shadow: 0 2px 8px rgba(0,0,0,0.1);
                }

                h2 {
                    margin-top: 0;
                }

                button {
                    background: royalblue;
                    color: white;
                    border: none;
                    padding: 10px 15px;
                    border-radius: 6px;
                    cursor: pointer;
                }

            </style>

            <div class="card">
                <h2>Jean Dupont</h2>
                <p>Développeur Frontend</p>
                <button>Voir le profil</button>
            </div>
        `;
    }
}

customElements.define(
    "carte-utilisateur",
    CarteUtilisateur
);

HTML :

<carte-utilisateur></carte-utilisateur>

Pourquoi ce composant est intéressant ?

Même si votre site possède déjà :

button {
    background: red;
}

Le bouton du composant restera bleu.

Le Shadow DOM protège totalement le style interne.

Rendre un composant dynamique

Ajoutons maintenant des attributs.

HTML :

<carte-utilisateur
nom="Alice"
metier="Développeuse JS">
</carte-utilisateur>

JavaScript :

class CarteUtilisateur extends HTMLElement {

    constructor() {
        super();

        const nom = this.getAttribute("nom");
        const metier = this.getAttribute("metier");

        const shadow = this.attachShadow({
            mode: "open"
        });

        shadow.innerHTML = `
            <style>

                .card {
                    border: 1px solid #ccc;
                    padding: 20px;
                    border-radius: 10px;
                }

            </style>

            <div class="card">
                <h2>${nom}</h2>
                <p>${metier}</p>
            </div>
        `;
    }
}

customElements.define(
    "carte-utilisateur",
    CarteUtilisateur
);

Et voilà.

Votre composant devient réutilisable.

Shadow DOM et frameworks JavaScript

Même si vous ne le voyez pas toujours directement, de nombreux frameworks utilisent des concepts proches du Shadow DOM.

Par exemple :

  • Angular peut utiliser l’encapsulation de vue,
  • Lit repose énormément dessus,
  • Ionic utilise les Web Components,
  • certains composants de Chrome utilisent un Shadow DOM interne.

Cela signifie qu’apprendre cette technologie vous aide aussi à mieux comprendre le développement frontend moderne.

Cas concret : créer un bouton réutilisable

Terminons avec un mini projet complet.

Objectif : Créer un bouton moderne réutilisable avec :

  • un style isolé,
  • un effet hover,
  • un texte personnalisable.

Le HTML

<mon-bouton texte="Envoyer"></mon-bouton>
<mon-bouton texte="Télécharger"></mon-bouton>

Le JavaScript complet

class MonBouton extends HTMLElement {

    constructor() {
        super();

        const texte = this.getAttribute("texte");

        const shadow = this.attachShadow({
            mode: "open"
        });

        shadow.innerHTML = `

            <style>

                button {

                    background: linear-gradient(
                        45deg,
                        royalblue,
                        dodgerblue
                    );

                    color: white;
                    border: none;
                    padding: 12px 20px;
                    border-radius: 8px;
                    cursor: pointer;
                    font-size: 16px;

                    transition: 0.3s;
                }

                button:hover {

                    transform: scale(1.05);

                }

            </style>

            <button>
                ${texte}
            </button>

        `;
    }
}

customElements.define(
    "mon-bouton",
    MonBouton
);

Pourquoi ce mini projet est utile ?

Parce qu’il représente exactement ce que font les bibliothèques modernes.

Vous créez un composant autonome.

Et vous pouvez le réutiliser partout :

  • sur votre site,
  • dans un projet client,
  • dans WordPress,
  • dans une application web,
  • dans une interface d’administration.

Shadow DOM et sécurité

Attention cependant, le Shadow DOM n’est pas une sécurité contre les hackers.

Il cache simplement la structure visuelle.

Un utilisateur peut toujours inspecter le code via les outils développeur. Il ne faut donc jamais y stocker des informations sensibles.

Faut-il utiliser le Shadow DOM partout ?

Non.

Et c’est important de le comprendre.

Le Shadow DOM est très utile pour :

  • les composants réutilisables,
  • les bibliothèques UI,
  • les systèmes de design,
  • les widgets indépendants,
  • les interfaces complexes.

Mais pour une simple page HTML classique, ce serait souvent inutile.

Comme toujours en développement web : il faut choisir le bon outil au bon moment.

Comment s’entraîner avec le Shadow DOM ?

Le meilleur moyen de progresser consiste à créer de petits composants.

Par exemple :

Petit à petit, vous comprendrez réellement la logique des Web Components.

Et honnêtement, le moment où l’on voit son premier composant totalement autonome fonctionner sans casser le CSS du site… procure une petite satisfaction de développeur difficile à expliquer.


Le Shadow DOM fonctionne-t-il sur tous les navigateurs ?

Oui, le Shadow DOM est compatible avec tous les navigateurs modernes comme Chrome, Firefox, Edge ou Safari. Les anciennes versions d’Internet Explorer ne le prennent pas en charge.

Le Shadow DOM remplace-t-il les frameworks JavaScript ?

Non, il ne remplace pas React, Vue ou Angular. Le Shadow DOM est une technologie native du navigateur qui peut être utilisée seule ou avec certains frameworks pour créer des composants isolés et réutilisables.

Peut-on utiliser le Shadow DOM dans WordPress ?

Oui, le Shadow DOM peut parfaitement être utilisé dans WordPress, notamment pour créer des widgets, des interfaces d’administration ou des composants personnalisés sans provoquer de conflits CSS avec le thème ou les extensions.


Le Shadow DOM fait partie des technologies qui rendent le développement frontend moderne plus propre, plus modulaire et beaucoup plus fiable.

Grâce à lui, vous pouvez créer des composants isolés avec leur propre HTML, leur propre CSS et leur propre logique JavaScript, sans craindre les conflits avec le reste du site.

Même si le concept paraît un peu impressionnant au départ, vous avez probablement remarqué qu’il repose finalement sur des bases assez simples. Une fois la logique comprise, tout devient beaucoup plus naturel.

Et surtout, cette technologie ouvre énormément de portes. Les Web Components, les bibliothèques modernes et même certains frameworks utilisent des principes proches du Shadow DOM.

{ « @context »: « https://schema.org », « @type »: « WebPage », « @id »: « https://blog.crea-troyes.fr/15351/shadow-dom-creation-de-composant-web-isole/ », « url »: « https://blog.crea-troyes.fr/15351/shadow-dom-creation-de-composant-web-isole/ », « isPartOf »: { « @type »: « CollectionPage », « name »: « Apprendre le Frontend : HTML, CSS et JavaScript expliqués simplement », « url »: « https://blog.crea-troyes.fr/apprendre-le-frontend-html-css-et-javascript-expliques-simplement/ » } }