0Pricing
HTML Academy · Leçon

`attachShadow` et racine d’ombre

Créez un arbre d’ombre encapsulé sur un élément hôte.

`attachShadow` et racine d’ombre est une leçon HTML Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage HTML Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours HTML Academy comprend 4 leçons au total.

Qu’est-ce que le Shadow DOM ?

Le Shadow DOM donne à un élément son propre arbre shadow isolé, qui n’apparaît pas dans le DOM principal de la page. Le CSS extérieur ne s’y infiltre pas et le CSS intérieur n’en sort pas : c’est une encapsulation parfaite pour les composants.

Attacher une racine ShadowRoot

Appelez this.attachShadow({ mode: "open" }) depuis le constructeur ou connectedCallback d’un élément personnalisé. La méthode renvoie une racine ShadowRoot que vous pouvez remplir comme un arbre DOM ordinaire à l’aide de innerHTML, appendChild, etc.

class MyCard extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({ mode: "open" });
    shadow.innerHTML = "<style>p{color:red}</style><p>Hello</p>";
  }
}

Mode ouvert ou fermé

mode: "open" expose l’arbre shadow via element.shadowRoot. mode: "closed" le masque : element.shadowRoot renvoie null, de sorte que les scripts externes ne peuvent pas entrer dans l’arbre. Le mode fermé est rarement utile en pratique, car le même code que celui qui a défini l’élément peut de toute façon conserver sa propre référence.

Encapsulation des styles

Les styles définis dans l’arbre shadow (via <style> ou des feuilles de style adoptées) s’appliquent uniquement dans cet arbre shadow. Les sélecteurs CSS du document principal ne ciblent jamais les descendants shadow, et les styles de l’arbre shadow ne se propagent jamais au document.

Le sélecteur :host

Depuis l’intérieur de l’arbre shadow, l’élément hôte (l’élément personnalisé lui-même) est sélectionné avec la pseudo-classe spéciale :host. :host(.large) correspond lorsque l’hôte possède la classe .large ; :host([disabled]) correspond lorsque l’hôte possède l’attribut disabled.

:host {
  display: block;
  padding: 16px;
  border: 1px solid #ccc;
}
:host([disabled]) {
  opacity: 0.5;
  pointer-events: none;
}

Affichage en bloc des éléments personnalisés

Les éléments personnalisés sont affichés en ligne par défaut. Dans la racine shadow, appliquez :host { display: block } afin que l’élément se comporte comme un composant de niveau bloc. Oublier cette règle est une cause fréquente des problèmes où « ma largeur de 100 % est ignorée ».

Composition des événements

Les événements qui remontent depuis l’arbre shadow sont réadressés au niveau de l’hôte. Un clic sur un bouton interne arrive auprès des écouteurs externes avec event.target === host. Utilisez event.composedPath() pour voir la véritable cible interne si nécessaire.

composed: true pour les événements personnalisés

Les événements personnalisés déclenchés à l'intérieur de la racine fantôme ne franchissent pas la frontière, sauf si vous les créez avec à la fois bubbles: true et composed: true. Sans composed, les écouteurs externes placés sur l'hôte ne voient jamais l'événement.

Les scripts ne peuvent pas s'infiltrer

Les scripts externes peuvent interroger l'élément hôte, mais pas ses descendants fantômes. document.querySelector("my-card span") ne renvoie rien si le <span> se trouve dans l'arbre fantôme. L'encapsulation protège les éléments internes contre les couplages accidentels.

DOM fantôme déclaratif

Avec <template shadowrootmode="open"> dans le code HTML d'un élément, le navigateur construit l'arbre fantôme lors de l'analyse, sans JavaScript. Cela rend les composants rendus côté serveur compatibles avec l'hydratation, car l'arbre fantôme existe avant l'exécution du JS.

Considérations de performance

Chaque racine fantôme entraîne un surcoût — une portée de style et une couche de rendu supplémentaires. Des centaines de racines fantômes ne posent aucun problème ; plusieurs dizaines de milliers peuvent avoir un impact. Pour les interfaces à très forte densité (grands tableaux, listes virtualisées), profilez votre application afin de vérifier que les coûts du DOM fantôme restent acceptables.

Vérification des connaissances

Que fait le mode open que le mode closed ne fait pas ?

Résumé

attachShadow({ mode: "open" }) crée une sous-arborescence DOM isolée où les CSS et les identifiants ne fuient dans aucune direction. Appliquez un style à l'hôte avec :host, n'oubliez pas display: block, et utilisez composed: true pour les événements qui doivent s'échapper. L'arbre fantôme se comporte sinon comme un DOM ordinaire — innerHTML, appendChild et querySelector fonctionnent tous normalement à l'intérieur.

Questions Fréquemment Posées

La leçon « `attachShadow` et racine d’ombre » est-elle gratuite ?

Oui — le texte complet de « `attachShadow` et racine d’ombre » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours HTML Academy, passe à CoddyKit PRO. Le cours HTML Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « `attachShadow` et racine d’ombre » ?

Créez un arbre d’ombre encapsulé sur un élément hôte. Tu pratiques HTML Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer HTML Academy ?

Aucune expérience préalable n'est requise. HTML Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « `attachShadow` et racine d’ombre » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon HTML Academy ?

Oui. Chaque leçon HTML Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. `attachShadow` et racine d’ombre
  2. Éléments `slot` pour distribuer le contenu
  3. Styles limités dans le DOM d’ombre
  4. `part` et `exportparts` pour le style externe
← Retour à HTML Academy