PeakLab
Retour au glossaire

Shadow DOM

API du navigateur permettant d'encapsuler la structure DOM, les styles et le comportement d'un composant web pour isoler complètement son implémentation.

Mis à jour le 27 janvier 2026

Le Shadow DOM est une technologie web native qui permet de créer un arbre DOM isolé attaché à un élément, invisible depuis le DOM principal. Cette encapsulation garantit que les styles et scripts d'un composant ne fuient pas vers le reste de la page et inversement. Il constitue l'un des quatre piliers des Web Components aux côtés des Custom Elements, HTML Templates et ES Modules.

Fondements du Shadow DOM

  • Création d'un arbre DOM parallèle (shadow tree) attaché à un élément hôte (host), invisible depuis document.querySelector
  • Encapsulation CSS bidirectionnelle : les styles externes n'affectent pas le Shadow DOM et ses styles n'affectent pas l'extérieur
  • Slots permettant de projeter du contenu light DOM dans le shadow tree avec un contrôle total sur le placement
  • Modes 'open' et 'closed' définissant l'accessibilité programmatique du shadow root via JavaScript

Avantages du Shadow DOM

  • Isolation complète des styles évitant les conflits CSS et permettant des conventions de nommage simples sans méthodologies complexes (BEM, SMACSS)
  • Encapsulation du comportement JavaScript protégeant la logique interne du composant des modifications externes
  • Réutilisabilité garantie : un composant fonctionne identiquement quel que soit son contexte d'intégration
  • Performance optimisée grâce à la portée CSS réduite et à l'arbre DOM isolé facilitant le travail du moteur de rendu
  • Standard web natif supporté par tous les navigateurs modernes sans dépendances externes

Exemple concret

custom-button.ts
class CustomButton extends HTMLElement {
  constructor() {
    super();
    
    // Attache un Shadow DOM en mode 'open'
    const shadow = this.attachShadow({ mode: 'open' });
    
    // Structure du composant
    shadow.innerHTML = `
      <style>
        /* Styles complètement isolés */
        :host {
          display: inline-block;
        }
        
        button {
          background: var(--button-bg, #007bff);
          color: var(--button-color, white);
          border: none;
          padding: 0.75rem 1.5rem;
          border-radius: 0.25rem;
          cursor: pointer;
          font-size: 1rem;
        }
        
        button:hover {
          opacity: 0.9;
        }
        
        ::slotted(svg) {
          margin-right: 0.5rem;
          vertical-align: middle;
        }
      </style>
      
      <button part="button">
        <slot name="icon"></slot>
        <slot>Cliquez ici</slot>
      </button>
    `;
    
    // Logique encapsulée
    shadow.querySelector('button')?.addEventListener('click', () => {
      this.dispatchEvent(new CustomEvent('custom-click', {
        bubbles: true,
        composed: true
      }));
    });
  }
}

customElements.define('custom-button', CustomButton);

Utilisation dans le HTML avec projection de contenu via slots :

index.html
<style>
  /* Ces styles n'affectent PAS le Shadow DOM */
  button {
    background: red; /* Sans effet sur custom-button */
  }
  
  /* Personnalisation via CSS Custom Properties */
  custom-button {
    --button-bg: #28a745;
    --button-color: white;
  }
  
  /* Ciblage via ::part() */
  custom-button::part(button) {
    box-shadow: 0 2px 4px rgba(0,0,0,0.1);
  }
</style>

<custom-button>
  <svg slot="icon" width="16" height="16">...</svg>
  Enregistrer
</custom-button>

Mise en œuvre du Shadow DOM

  1. Créer une classe héritant de HTMLElement pour définir le Custom Element conteneur
  2. Attacher un Shadow Root dans le constructor avec attachShadow({ mode: 'open' }) pour l'accessibilité ou 'closed' pour l'isolation totale
  3. Définir la structure HTML et les styles CSS encapsulés en injectant du contenu dans shadowRoot.innerHTML ou via DOM API
  4. Utiliser les pseudo-classes :host, :host(), :host-context() pour styler l'élément hôte et ::slotted() pour le contenu projeté
  5. Exposer des parties stylables via l'attribut part et définir des CSS Custom Properties pour la personnalisation contrôlée
  6. Implémenter la logique JavaScript privée en attachant les événements aux éléments du Shadow DOM
  7. Enregistrer le composant avec customElements.define('element-name', ElementClass) en respectant la convention kebab-case

Stratégie d'encapsulation

Utilisez le mode 'open' pour faciliter le debugging et les tests. Le mode 'closed' offre une sécurité illusoire car contournable. Préférez exposer intentionnellement les points de personnalisation via part, CSS Custom Properties et événements custom plutôt que de verrouiller complètement l'accès.

Outils et écosystème

  • Lit : bibliothèque légère de Google pour créer des Web Components avec Shadow DOM et réactivité déclarative
  • Stencil : compilateur générant des Web Components optimisés avec support TypeScript et JSX
  • Open WC : ensemble d'outils, recommandations et starters pour développer des Web Components standards
  • Chrome DevTools : inspection complète du Shadow DOM avec visualisation de l'arbre et débogage CSS
  • webcomponents.org : catalogue communautaire de composants réutilisables utilisant Shadow DOM
  • construct-style-sheets-polyfill : polyfill pour Constructable Stylesheets permettant le partage de styles entre Shadow Roots

Le Shadow DOM représente une rupture paradigmatique dans l'architecture frontend en apportant l'encapsulation native au niveau du navigateur. Pour les équipes développant des design systems ou des composants réutilisables à grande échelle, cette technologie élimine les problèmes de conflits CSS et garantit la maintenabilité à long terme. Son adoption croissante dans les frameworks modernes (Ionic, Salesforce Lightning) et les bibliothèques de composants d'entreprise témoigne de sa valeur pour construire des interfaces robustes et prévisibles.

L'argentestdéjàsurlatable.

En 1 heure, découvrez exactement combien vous perdez et comment le récupérer.

Agence de développement web, automatisation & IA

contact@peaklab.fr
Newsletter

Recevez nos conseils tech et business directement dans votre boîte mail.

Suivez-nous
Crédit d'Impôt Innovation - PeakLab agréé CII