image de chargement
Retour au glossaire

Custom Elements

Standard web permettant de créer des composants HTML réutilisables avec leur propre comportement et encapsulation, natifs dans le navigateur.

Mis à jour le 25 janvier 2026

Les Custom Elements sont une API Web standard permettant aux développeurs de créer leurs propres balises HTML avec un comportement personnalisé. Faisant partie de la spécification Web Components, ils offrent un moyen natif de construire des composants réutilisables sans dépendre de frameworks tiers. Cette technologie permet d'étendre le vocabulaire HTML avec des éléments qui encapsulent fonctionnalité, style et structure.

Fondements des Custom Elements

  • API native du navigateur basée sur les classes JavaScript ES6 étendant HTMLElement
  • Enregistrement via customElements.define() créant un lien entre classe et nom de balise
  • Deux types : Autonomous (éléments autonomes) et Customized Built-in (extensions d'éléments natifs)
  • Lifecycle callbacks (connectedCallback, disconnectedCallback, attributeChangedCallback) pour gérer le cycle de vie
  • Compatibilité native avec Shadow DOM pour l'encapsulation des styles et du markup

Avantages des Custom Elements

  • Réutilisabilité maximale : composants indépendants du framework utilisable partout
  • Performance native : exécution directe par le navigateur sans couche d'abstraction
  • Maintenabilité accrue : encapsulation claire des responsabilités et de la logique
  • Interopérabilité complète : fonctionnent avec tous les frameworks modernes (React, Vue, Angular)
  • Longévité garantie : standard web stable supporté par tous les navigateurs modernes
  • SEO-friendly : rendu côté serveur possible et markup HTML valide

Exemple concret

user-card.ts
class UserCard extends HTMLElement {
  static get observedAttributes() {
    return ['username', 'avatar', 'role'];
  }

  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
  }

  connectedCallback() {
    this.render();
  }

  attributeChangedCallback(name: string, oldValue: string, newValue: string) {
    if (oldValue !== newValue) {
      this.render();
    }
  }

  render() {
    const username = this.getAttribute('username') || 'Anonymous';
    const avatar = this.getAttribute('avatar') || '/default-avatar.png';
    const role = this.getAttribute('role') || 'User';

    this.shadowRoot!.innerHTML = `
      <style>
        :host {
          display: block;
          border: 1px solid #e0e0e0;
          border-radius: 8px;
          padding: 16px;
          max-width: 300px;
        }
        .card-header {
          display: flex;
          align-items: center;
          gap: 12px;
        }
        .avatar {
          width: 48px;
          height: 48px;
          border-radius: 50%;
          object-fit: cover;
        }
        .username {
          font-weight: 600;
          font-size: 1.1em;
          margin: 0;
        }
        .role {
          color: #666;
          font-size: 0.9em;
        }
      </style>
      <div class="card-header">
        <img class="avatar" src="${avatar}" alt="${username}">
        <div>
          <h3 class="username">${username}</h3>
          <p class="role">${role}</p>
        </div>
      </div>
    `;
  }
}

// Enregistrement du custom element
customElements.define('user-card', UserCard);

Utilisation dans le HTML :

index.html
<user-card 
  username="Marie Dupont"
  avatar="/avatars/marie.jpg"
  role="Senior Developer">
</user-card>

<user-card 
  username="Jean Martin"
  avatar="/avatars/jean.jpg"
  role="Product Manager">
</user-card>

Mise en œuvre

  1. Créer une classe ES6 étendant HTMLElement ou un élément HTML existant (HTMLButtonElement, etc.)
  2. Définir les attributs observés avec la méthode statique observedAttributes si nécessaire
  3. Implémenter le constructor pour initialiser l'état et attacher le Shadow DOM si requis
  4. Coder les lifecycle callbacks (connectedCallback pour l'initialisation, disconnectedCallback pour le nettoyage)
  5. Enregistrer le custom element avec customElements.define('nom-element', ClasseElement)
  6. Vérifier le support navigateur et utiliser un polyfill si nécessaire pour les anciens navigateurs
  7. Documenter l'API du composant (attributs, propriétés, événements, slots)
  8. Tester l'accessibilité (ARIA attributes, keyboard navigation, screen readers)

Conseil pro

Respectez toujours la convention de nommage avec au moins un tiret (ex: user-card, custom-button) pour éviter les conflits avec les éléments HTML natifs actuels et futurs. Utilisez TypeScript pour typer vos custom elements et bénéficier de l'autocomplétion. Pensez à exposer des événements personnalisés pour la communication avec le monde extérieur plutôt que de dépendre de callbacks passés en propriétés.

Outils et écosystème

  • Lit : bibliothèque légère de Google pour créer des web components performants avec des templates réactifs
  • Stencil : compilateur générant des web components optimisés avec TypeScript et JSX
  • FAST : framework Microsoft pour construire des design systems basés sur web components
  • Webcomponents.org : registry communautaire de custom elements réutilisables
  • Custom Elements Everywhere : tests de compatibilité avec les principaux frameworks
  • @webcomponents/polyfills : polyfills officiels pour le support des anciens navigateurs

Les Custom Elements représentent un investissement stratégique pour toute organisation cherchant à construire une architecture frontend durable et indépendante. En s'appuyant sur des standards web natifs plutôt que sur des frameworks éphémères, ils garantissent la pérennité du code et réduisent la dette technique. Leur interopérabilité permet de moderniser progressivement les applications existantes et de créer des design systems réutilisables à travers différentes technologies, optimisant ainsi le retour sur investissement du développement frontend.

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