Apprendre à créer un Web Component basique

Apprenez à créer votre premier Web Component avec HTML, CSS et JavaScript. Ce guide pas à pas vous montre comment construire des éléments réutilisables et encapsulés grâce aux technologies du Web moderne.

Article publié le 19/05/2025, dernière mise à jour le 20/05/2025

Vous avez peut-être entendu parler des Web Components, ces composants HTML réutilisables, natifs et encapsulés, qui peuvent fonctionner sans framework.

Ils sont possibles grâce à une technologie clé du navigateur : le Shadow DOM.

Nous allons voir comment créer votre propre Web Component en JavaScript pur, avec son style, sa structure et sa logique embarquée.

Qu’est-ce qu’un Web Component ?

Un Web Component est une balise HTML personnalisée, que vous définissez vous-même. Une fois créée, vous pouvez l’utiliser comme n’importe quelle balise HTML dans votre page.

Voici un exemple de base :

<gift-box></gift-box>

Derrière cette simple balise se cache un composant autonome, qui peut contenir du HTML, du CSS, du JavaScript… le tout isolé du reste de la page.

Étape 1 : Créer une classe JavaScript

Un Web Component commence forcément par une classe qui étend HTMLElement :

class Gift extends HTMLElement {
  constructor() {
    super();
  }
}

Ensuite, on l’enregistre avec customElements.define :

customElements.define("gift-box", Gift);

customElements est une API fournie nativement par les navigateurs modernes !

La balise <user-badge> est maintenant reconnue par le navigateur.

Étape 2 : ajouter un Shadow DOM

Pour encapsuler notre composant, on utilise la méthode attachShadow :

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

Le mode "open" permet d’accéder au Shadow DOM depuis l’extérieur via .shadowRoot.

Mais on peut utiliser "closed" pour le rendre totalement privé.

Si vous n’êtes pas familier avec le concept de Shadow DOM, voici un article détaillé pour tout comprendre : https://code-garage.com/blog/comprendre-le-shadow-dom

Étape 3 : Créer un template HTML

On peut maintenant construire le contenu de notre composant :

this.shadow.innerHTML = `
  <style>
    .gift {
      display: inline-block;
      padding: 8px 12px;
      background-color: #eee;
      border-radius: 8px;
      font-weight: bold;
    }
  </style>
  <button class="gift">🎁 (cliquez pour ouvrir)</button>
`;

Le style est local au Shadow DOM : il n’affecte pas les autres éléments, et ne peut pas être affecté par des styles globaux.

Étape 4 : Ajouter de l’interaction JavaScript

On peut ajouter des événements comme dans un composant classique :

const gift = this.shadow.querySelector(".gift");
gift.addEventListener("click", () => {
  gift.textContent = "🌸🌹🌻 (voilà des fleurs)";
});

Le tout reste contenu dans le composant, sans dépendance ni pollution globale.

Exemple complet

class Gift extends HTMLElement {
  constructor() {
    super();
    this.shadow = this.attachShadow({ mode: "open" });

    this.shadow.innerHTML = `
      <style>
        .gift {
          padding: 8px 12px;
          background-color: #eee;
          border-radius: 8px;
          font-weight: bold;
          cursor: pointer;
        }
      </style>
      <button class="gift">🎁 (cliquez pour ouvrir)</button>
    `;

    const gift = this.shadow.querySelector(".gift");
    gift.addEventListener("click", () => {
      gift.textContent = "🌸🌹🌻 (voilà des fleurs)";
    });
  }
}

customElements.define("gift-box", Gift);

Et dans votre HTML :

<gift-box></gift-box>

Pourquoi utiliser les Web Components ?

Les Web Components permettent de :

  • Créer des interfaces réutilisables sans dépendance à un framework
  • Encapsuler le HTML, le CSS et la logique
  • Réduire les risques de conflits de styles
  • Intégrer facilement des composants dans n’importe quel projet

Ils sont supportés par tous les navigateurs modernes, et peuvent cohabiter avec React, Vue ou Angular sans problème.


Vous avez terminé l'article ?

Commentaires (0)

pour laisser un commentaire

Aucun commentaire pour l'instant