Aller au contenu

Slots Shadow DOM, Composition

Bienvenue dans notre guide complet sur la maîtrise des slots et de la composition au sein du Shadow DOM en JavaScript. Les bases du Shadow DOM sont décrites dans notre article précédent, Shadow DOM. Dans cet article, nous explorerons comment exploiter les slots et la composition pour améliorer la flexibilité, la modularité et la réutilisabilité des composants web. Plongeons au cœur de ces concepts avancés et découvrez comment ils peuvent élever vos compétences en développement web au niveau supérieur.

Comprendre les slots dans le Shadow DOM

Les slots sont des espaces réservés au sein du modèle d'un composant web qui permettent l'insertion dynamique de contenu provenant du parent du composant ou de sources externes. Ils offrent un mécanisme puissant pour composer des composants personnalisables et réutilisables. Explorons comment utiliser efficacement les slots dans le Shadow DOM en JavaScript.

Définir des slots

Pour définir un slot dans le modèle d'un composant web, nous utilisons l'élément <slot>. Les slots peuvent être par défaut (sans attribut name) ou nommés. Prenons un exemple simple avec un slot par défaut :


html
<body>
  <script>
    class CustomElement extends HTMLElement {
      constructor() {
        super();
        const shadowRoot = this.attachShadow({ mode: 'open' });
        shadowRoot.innerHTML = `
          <div class="container">
            <slot>Default content</slot>
          </div>
        `;
      }
    }
    
    customElements.define('custom-element', CustomElement);
    
    // Displaying the custom element
    const customElement = document.createElement('custom-element');
    document.body.appendChild(customElement);
  </script>
</body>

Dans cet exemple, l'élément <slot> sert d'espace réservé pour le contenu fourni par le parent du composant. L'omission de l'attribut name crée un slot par défaut, qui recevra tout contenu placé directement à l'intérieur de l'élément personnalisé sans attribut slot.

Distribuer du contenu avec des slots

Les slots peuvent recevoir du contenu du composant parent ou du contenu de repli fourni directement dans l'élément slot. Voyons comment fonctionne la distribution des slots :


html
<body>
  <!-- Define Custom Element -->
  <script>
    // Define Custom Element Class
    class CustomElement extends HTMLElement {
      constructor() {
        super();
        const shadowRoot = this.attachShadow({ mode: 'open' });
        shadowRoot.innerHTML = `
          <style>
            /* Define styles for the component */
            .container {
              border: 1px solid #ccc;
              padding: 20px;
            }
          </style>
          <div class="container">
            <slot name="content">Default content</slot>
          </div>
        `;
      }
    }

    // Define Custom Element
    customElements.define('custom-element', CustomElement);
  </script>

  <!-- Displaying the custom element -->
  <custom-element>
    <div slot="content">Content from parent</div>
  </custom-element>
</body>

Dans cet exemple, l'élément <div> avec l'attribut slot="content" sera inséré dans le slot nommé "content" à l'intérieur de custom-element, remplaçant le Default content.

Améliorer la composition dans le Shadow DOM

La composition dans le contexte du Shadow DOM désigne l'assemblage de composants d'interface utilisateur et de contenu en combinant des slots et leur contenu distribué pour créer des structures plus complexes et réutilisables. Appliquée dans le contexte du Shadow DOM, la composition permet de créer des composants web hautement personnalisables et réutilisables.

Pour styliser le contenu distribué dans les slots depuis le parent, utilisez la pseudo-classe CSS ::slotted(). Par exemple, ::slotted(div) { color: blue; } applique des styles au <div> inséré dans le slot.

Composer des composants avec des slots

L'un des moyens les plus puissants d'exploiter la composition dans le Shadow DOM consiste à combiner des composants à l'aide de slots. Créons un composant composite constitué de plusieurs composants enfants :


html
<body>
  <script>
    // Define Composite Element Class
    class CompositeElement extends HTMLElement {
      constructor() {
        super();
        const shadowRoot = this.attachShadow({ mode: 'open' });
        shadowRoot.innerHTML = `
          <style>
            /* Define styles for the composite component */
            .container {
              border: 1px solid #ccc;
              padding: 20px;
            }
          </style>
          <div class="container">
            <slot name="header"></slot>
            <slot name="content"></slot>
            <slot name="footer"></slot>
          </div>
        `;
      }
    }

    // Define Composite Element
    customElements.define('composite-element', CompositeElement);
  </script>
  <composite-element>
    <div slot="header">Header</div>
    <div slot="content">Content</div>
    <div slot="footer">Footer</div>
  </composite-element>
</body>

Dans cet exemple, le modèle du composant composite contient plusieurs slots pour les sections d'en-tête, de contenu et de pied de page. Ces slots peuvent accueillir le contenu fourni par le composant parent, permettant ainsi une composition flexible.

Conclusion

Maîtriser les slots et la composition dans le Shadow DOM en JavaScript permet aux développeurs de créer des composants web hautement personnalisables et réutilisables. En comprenant et en exploitant efficacement ces techniques avancées, vous pouvez construire des applications modulaires, flexibles et maintenables. Expérimentez avec les exemples fournis, explorez d'autres possibilités et libérez tout le potentiel du Shadow DOM dans vos projets. Bon codage !

Pratique

À quoi servent les slots dans le Shadow DOM en JavaScript ?

Trouvez-vous cela utile?

Aperçu dual-run — comparez avec les routes Symfony en production.