From 8bdcf31f79fdecafb6d4a5e13fd1fd01c767a823 Mon Sep 17 00:00:00 2001 From: julieng Date: Thu, 11 Nov 2021 08:43:25 +0100 Subject: convert content to md --- files/fr/web/web_components/index.md | 168 ++++----- .../web_components/using_custom_elements/index.md | 204 ++++++----- .../web/web_components/using_shadow_dom/index.md | 192 +++++----- .../using_templates_and_slots/index.md | 398 ++++++++++----------- 4 files changed, 472 insertions(+), 490 deletions(-) diff --git a/files/fr/web/web_components/index.md b/files/fr/web/web_components/index.md index 61c90c9a2a..c94b26038a 100644 --- a/files/fr/web/web_components/index.md +++ b/files/fr/web/web_components/index.md @@ -5,108 +5,66 @@ tags: - Composants Web translation_of: Web/Web_Components --- -

{{DefaultAPISidebar("Web Components")}}{{ draft }}

- -

Les Composants Web sont constitués de plusieurs technologies distinctes permettant de créer des composants d'interface graphique personnalisés et réutilisables, qui ont été créés en utilisant des technologies web libres. Ils font partie du navigateur, et donc ne nécessitent pas de bibliothèque externe comme jQuery ou Dojo. Un Composant Web existant peut être utilisé sans l'écriture de code, en ajoutant simplement une déclaration d'importation à une page HTML. Les Composants Web utilisent les nouvelles capacités standard de navigateur, ou celles en cours de développement.

- -

Concepts et utilisation

- -

En tant que développeurs, nous savons tous à quel point la réutilisation de code est une bonne chose. Malgré cela, historiquement, il a toujours été difficile de réutiliser les languages balisés. Prenez par exemple tous ces éléments complexes en HTML que vous avez créés et dû répéter dans vos applications avec le risque que votre code devienne incompréhensible.

- -

Les composants Web ont pour but de résoudre ce problème et consistent en 3 technologies qui peuvent être utilisées ensemble pour créer des éléments réutilisables, encapsulés, versatiles et sans risquer une collision avec d'autre morceaux de code.

- - - -

Au début de la spécification, il y avait aussi la technologie HTML Imports. Celle-ci servait à packager ses composants (CSS, JavaScript, etc.) et permettre leur intégration dans d'autres pages. Elle a néanmoins été abandonnée au profit des imports javascript qui permettent la même chose en utilisant une syntaxe plus moderne.

- -

La description ci-dessus fonctionne assez bien à l'heure actuelle, mais cela laisse de côté plusieurs choses pour lesquelles les Composants Web pourraient être utilisés. Avec un Composant Web, vous pouvez faire presque tout ce qui peut être fait en HTML, CSS et JavaScript, et celui-ci peut devenir un élément réutilisable facilement.

- -

Il y a parfois une certaine confusion concernant les Composants Web et Google Polymer. Polymer est un framework qui repose sur la technologie des Composants Web. Vous pouvez faire et utiliser des Composants Web sans Polymer.

- -

Généralement, l'approche basique pour la création d'un composant Web est la suivante:

- -
    -
  1. Créer une classe dans laquelle est spécifié la fonctionnalité du composant Web en utilisant la syntaxe de classe ECMAScript 2015 (voir les Classes pour de plus amples informations).
  2. -
  3. Enregistrer le nouvel élément personnalisé en utilisant la méthode {{domxref("CustomElementRegistry.define()")}}, avec en paramètre le nom de l'élément à définir, la classe ou la fonction dans laquelle la fonctionnalité est spécifiée, et optionnellement, de quel élément celui-ci hérite-t-il.
  4. -
  5. Si nécessaire, connecter un shadow DOM à l'élément personnalisé en utilisant la méthode {{domxref("Element.attachShadow()")}}. Ajouter les éléments-fils, les écouteurs d'événements, etc., au shadow DOM en utilisant les méthodes DOM usuelles.
  6. -
  7. Si nécessaire, définir un template HTML en utilisant {{htmlelement("template")}} et {{htmlelement("slot")}}. Toujours en utilisant les méthodes DOM usuelles pour cloner le template et le connecter au shadow DOM.
  8. -
  9. Utiliser l'élément personnalisé à l'endroit désiré sur la page, comme tous les autres éléments HTML.
  10. -
- -
-

Note : Les Composants Web ne sont pas encore pleinement mis en œuvre dans tous les navigateurs, et pour les utiliser dès maintenant dans la plupart des navigateurs (janvier 2015), vous devrez probablement utiliser des polyfills (ce sont des bibliothèques JavaScript destinées à émuler des fonctionnalités qui ne sont pas encore implémentées nativement dans les navigateurs). Les polyfills sont disponibles dans le projet Google Polymer. Pour savoir quels navigateurs implémentent les Composants Web, voir Are We Componentized Yet?

-
- - -

Les spécifications des Composants Web définissent les éléments suivants :

- - - -

Activer les Web Components dans Firefox

- -

Les capacités des Web Components sont désactivées par défaut dans Firefox. Pour les activer, allez sur la page about:config et rejetez toutes les alertes qui apparaissent. Cherchez ensuite la préférence nommée dom.webcomponents.enabled, et changez la à true par un double clic.

- -

Firefox enable web components

- -

Spécifications

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SpécificationStatutCommentaire
{{SpecName('Custom Elements', "", "")}}{{Spec2('Custom Elements')}}
{{SpecName('HTML WHATWG','/scripting-1.html#the-template-element','template element')}}{{Spec2('HTML WHATWG')}}Pas de changement
{{SpecName('HTML5 W3C','/scripting-1.html#the-template-element','template element')}}{{Spec2('HTML5 W3C')}}Définition initiale
{{SpecName('Shadow DOM', "", "")}}{{Spec2('Shadow DOM')}}
{{SpecName('HTML Imports', "", "")}}{{Spec2('HTML Imports')}}
{{SpecName("CSS Scope", "", "")}}{{Spec2('CSS Scope')}}
+{{DefaultAPISidebar("Web Components")}}{{ draft }} + +Les Composants Web sont constitués de plusieurs technologies distinctes permettant de créer des composants d'interface graphique personnalisés et réutilisables, qui ont été créés en utilisant des technologies web libres. Ils font partie du navigateur, et donc ne nécessitent pas de bibliothèque externe comme jQuery ou Dojo. Un Composant Web existant peut être utilisé sans l'écriture de code, en ajoutant simplement une déclaration d'importation à une page HTML. Les Composants Web utilisent les nouvelles capacités standard de navigateur, ou celles en cours de développement. + +## Concepts et utilisation + +En tant que développeurs, nous savons tous à quel point la réutilisation de code est une bonne chose. Malgré cela, historiquement, il a toujours été difficile de réutiliser les languages balisés. Prenez par exemple tous ces éléments complexes en HTML que vous avez créés et dû répéter dans vos applications avec le risque que votre code devienne incompréhensible. + +Les composants Web ont pour but de résoudre ce problème et consistent en 3 technologies qui peuvent être utilisées ensemble pour créer des éléments réutilisables, encapsulés, versatiles et sans risquer une collision avec d'autre morceaux de code. + +- [Custom Elements: ](/fr/docs/Web/Web_Components/Custom_Elements)pour créer et enregistrer de nouveaux éléments HTML et les faire reconnaître par le navigateur. +- [HTML Templates: ](/fr/docs/Web/HTML/Element/template)squelette pour créer des éléments HTML instanciables. +- [Shadow DOM: ](/fr/docs/Web/Web_Components/Shadow_DOM)permet d'encapsuler le JavaScript et le CSS des éléments. + +Au début de la spécification, il y avait aussi la technologie [HTML Imports](/fr/docs/Web/Web_Components/HTML_Imports). Celle-ci servait à packager ses composants (CSS, JavaScript, etc.) et permettre leur intégration dans d'autres pages. Elle a néanmoins été abandonnée au profit des imports javascript qui permettent la même chose en utilisant une syntaxe plus moderne. + +La description ci-dessus fonctionne assez bien à l'heure actuelle, mais cela laisse de côté plusieurs choses pour lesquelles les Composants Web pourraient être utilisés. Avec un Composant Web, vous pouvez faire presque tout ce qui peut être fait en HTML, CSS et JavaScript, et celui-ci peut devenir un élément réutilisable facilement. + +Il y a parfois une certaine confusion concernant les Composants Web et Google Polymer. Polymer est un framework qui repose sur la technologie des Composants Web. Vous pouvez faire et utiliser des Composants Web sans Polymer. + +Généralement, l'approche basique pour la création d'un composant Web est la suivante: + +1. Créer une classe dans laquelle est spécifié la fonctionnalité du composant Web en utilisant la syntaxe de classe ECMAScript 2015 (voir les [Classes](/fr/docs/Web/JavaScript/Reference/Classes) pour de plus amples informations). +2. Enregistrer le nouvel élément personnalisé en utilisant la méthode {{domxref("CustomElementRegistry.define()")}}, avec en paramètre le nom de l'élément à définir, la classe ou la fonction dans laquelle la fonctionnalité est spécifiée, et optionnellement, de quel élément celui-ci hérite-t-il. +3. Si nécessaire, connecter un shadow DOM à l'élément personnalisé en utilisant la méthode {{domxref("Element.attachShadow()")}}. Ajouter les éléments-fils, les écouteurs d'événements, etc., au shadow DOM en utilisant les méthodes DOM usuelles. +4. Si nécessaire, définir un template HTML en utilisant {{htmlelement("template")}} et {{htmlelement("slot")}}. Toujours en utilisant les méthodes DOM usuelles pour cloner le template et le connecter au shadow DOM. +5. Utiliser l'élément personnalisé à l'endroit désiré sur la page, comme tous les autres éléments HTML. + +> **Note :** Les Composants Web ne sont pas encore pleinement mis en œuvre dans tous les navigateurs, et pour les utiliser dès maintenant dans la plupart des navigateurs (janvier 2015), vous devrez probablement utiliser des polyfills (ce sont des bibliothèques JavaScript destinées à émuler des fonctionnalités qui ne sont pas encore implémentées nativement dans les navigateurs). Les polyfills sont disponibles dans le [projet Google Polymer](http://www.polymer-project.org/). Pour savoir quels navigateurs implémentent les Composants Web, voir [Are We Componentized Yet?](http://jonrimmer.github.io/are-we-componentized-yet/) + +Les spécifications des Composants Web définissent les éléments suivants : + +- De nouveaux éléments HTML : {{HTMLElement("template")}}, {{HTMLElement("content")}} et {{HTMLElement("shadow")}} ({{HTMLElement("element")}} et {{HTMLElement("decorator")}} ont été retirés). +- Les interfaces d'API associées pour les nouveaux éléments: {{domxref("HTMLTemplateElement")}}, {{domxref("HTMLContentElement")}} et {{domxref("HTMLShadowElement")}}. +- Des extensions à l'interface {{domxref("HTMLLinkElement")}} et l'élément {{HTMLElement("link")}}. +- Une API pour enregistrer les custom elements, {{domxref("Document.registerElement()")}}, et des modifications de {{domxref("Document.createElement()")}} et {{domxref("Document.createElementNS()")}}. +- De nouvelles fonctions liées au cycle de vie ("_lifecycle callbacks_") peuvent être ajoutées à un prototype sur lequel est basé un custom element. +- Une nouvelle pseudo-classe CSS pour les éléments de style par defaut, {{cssxref(":unresolved")}}. +- Le Shadow DOM : {{domxref("ShadowRoot")}} et {{domxref("Element.createShadowRoot()")}}, {{domxref("Element.getDestinationInsertionPoints()")}}, {{domxref("Element.shadowRoot")}}. +- Une extension à l'interface {{domxref("Event")}}, {{domxref("Event.path")}}. +- Une extension à l'interface {{domxref("Document")}}. +- Pour le style des Composants Web: + + - de nouvelles pseudo-classes : {{cssxref(":host")}}, {{cssxref(":host()")}}, {{cssxref(":host-context()")}}. + - de nouveaux pseudo-elements : {{cssxref("::shadow")}} et {{cssxref("::content")}}. + - un nouveau combinateur, `/deep/`. + +## Activer les Web Components dans Firefox + +Les capacités des Web Components sont désactivées par défaut dans Firefox. Pour les activer, allez sur la page `about:config` et rejetez toutes les alertes qui apparaissent. Cherchez ensuite la préférence nommée **dom.webcomponents.enabled**, et changez la à **true** par un double clic. + +![Firefox enable web components](https://mdn.mozillademos.org/files/10145/enable-wc.png) + +## Spécifications + +| Spécification | Statut | Commentaire | +| -------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | ------------------- | +| {{SpecName('Custom Elements', "", "")}} | {{Spec2('Custom Elements')}} | | +| {{SpecName('HTML WHATWG','/scripting-1.html#the-template-element','template element')}} | {{Spec2('HTML WHATWG')}} | Pas de changement | +| {{SpecName('HTML5 W3C','/scripting-1.html#the-template-element','template element')}} | {{Spec2('HTML5 W3C')}} | Définition initiale | +| {{SpecName('Shadow DOM', "", "")}} | {{Spec2('Shadow DOM')}} | | +| {{SpecName('HTML Imports', "", "")}} | {{Spec2('HTML Imports')}} | | +| {{SpecName("CSS Scope", "", "")}} | {{Spec2('CSS Scope')}} | | diff --git a/files/fr/web/web_components/using_custom_elements/index.md b/files/fr/web/web_components/using_custom_elements/index.md index e01061d005..5fe0e7d7d6 100644 --- a/files/fr/web/web_components/using_custom_elements/index.md +++ b/files/fr/web/web_components/using_custom_elements/index.md @@ -10,35 +10,34 @@ tags: - customized translation_of: Web/Web_Components/Using_custom_elements --- -
{{DefaultAPISidebar("Web Components")}}
+{{DefaultAPISidebar("Web Components")}} -

L'un des aspects les plus importants des composants web est la possibilité de créer des éléments personnalisés qui encapsulent bien vos fonctionnalités sur une page HTML, plutôt que de devoir se contenter d'une soupe de balises définissant des fonctionnalités personnalisées. Cet article passe en revue les bases de l'utilisation d'éléments personnalisés.

+L'un des aspects les plus importants des composants web est la possibilité de créer des éléments personnalisés qui encapsulent bien vos fonctionnalités sur une page HTML, plutôt que de devoir se contenter d'une soupe de balises définissant des fonctionnalités personnalisées. Cet article passe en revue les bases de l'utilisation d'éléments personnalisés. -
-

Note : Les éléments personnalisés sont pris en charge par défaut dans Chrome et Opera. Firefox en est très proche, ils sont disponibles si vous mettez les préférences dom.webcomponents.enabled et dom.webcomponents.customelements.enabled à true, leur implémentation étant prévue pour être activée par défaut dans la version 60/61. Safari ne prend en charge que les éléments personnalisés indépendants pour l'instant, et Edge travaille de même sur une implémentation.

-
+> **Note :** Les éléments personnalisés sont pris en charge par défaut dans Chrome et Opera. Firefox en est très proche, ils sont disponibles si vous mettez les préférences dom.webcomponents.enabled et dom.webcomponents.customelements.enabled à true, leur implémentation étant prévue pour être activée par défaut dans la version 60/61. Safari ne prend en charge que les éléments personnalisés indépendants pour l'instant, et Edge travaille de même sur une implémentation. -

Vue d'ensemble

+## Vue d'ensemble -

Le contrôleur des éléments personnalisés d'un document Web est l'objet {{domxref("CustomElementRegistry")}} ; cet objet vous permet d'enregistrer un élément personnalisé sur une page, de renvoyer des informations sur les éléments personnalisés enregistrés, etc..

+Le contrôleur des éléments personnalisés d'un document Web est l'objet {{domxref("CustomElementRegistry")}} ; cet objet vous permet d'enregistrer un élément personnalisé sur une page, de renvoyer des informations sur les éléments personnalisés enregistrés, etc.. -

Pour enregistrer un élément personnalisé sur la page, vous utilisez la méthode {{domxref ("CustomElementRegistry.define()")}}. Elle prend comme arguments :

+Pour enregistrer un élément personnalisé sur la page, vous utilisez la méthode {{domxref ("CustomElementRegistry.define()")}}. Elle prend comme arguments : - +- une {{domxref("DOMString")}} représentant le nom que vous donnez à l'élément ; notez que les noms d'éléments personnalisés doivent comprendre un tiret ; ils ne peuvent pas être des mots simples ; +- un objet de classe définissant le comportement de l'élément ; +- facultativement, un objet d'options contenant une propriété extends, qui indique l'élément intégré dont votre élément hérite, le cas échéant. -

Ainsi, par exemple, la définition de notre élément word-count personnalisé ressemble à ce qui suit :

+Ainsi, par exemple, la définition de notre [élément word-count](https://mdn.github.io/web-components-examples/word-count-web-component/) personnalisé ressemble à ce qui suit : -
customElements.define('word-count', WordCount, { extends: 'p' });
+```js +customElements.define('word-count', WordCount, { extends: 'p' }); +``` -

L'élément est appelé word-count, son objet de classe est WordCount, et il étend l'élément {{htmlelement("p")}}.

+L'élément est appelé `word-count`, son objet de classe est `WordCount`, et il étend l'élément {{htmlelement("p")}}. -

L'objet de classe d'un élément personnalisé est écrit en utilisant la syntaxe de classe ES 2015 standard. Par exemple, WordCount est structuré comme suit :

+L'objet de classe d'un élément personnalisé est écrit en utilisant la syntaxe de classe ES 2015 standard. Par exemple, `WordCount` est structuré comme suit : -
class WordCount extends HTMLParagraphElement {
+```js
+class WordCount extends HTMLParagraphElement {
   constructor() {
     // Toujours appeler "super" d'abord dans le constructeur
     super();
@@ -47,32 +46,32 @@ translation_of: Web/Web_Components/Using_custom_elements
 
     ...
   }
-}
+} +``` -

C'est juste un exemple simple, mais vous pouvez faire plus ici. Il est possible de définir des rappels de cycle de vie particuliers dans le constructeur, rappels qui s'exécutent à des points particuliers du cycle de vie de l'élément. Par exemple, connectedCallback est appelé lorsque l'élément personnalisé est connecté pour la première fois au DOM du document, tandis que attributeChangedCallback est appelé lorsque l'un des attributs de l'élément personnalisé est ajouté, supprimé ou modifié.

+C'est juste un exemple simple, mais vous pouvez faire plus ici. Il est possible de définir des rappels de cycle de vie particuliers dans le constructeur, rappels qui s'exécutent à des points particuliers du cycle de vie de l'élément. Par exemple, `connectedCallback` est appelé lorsque l'élément personnalisé est connecté pour la première fois au DOM du document, tandis que `attributeChangedCallback` est appelé lorsque l'un des attributs de l'élément personnalisé est ajouté, supprimé ou modifié. -

Vous en apprendrez plus à ce sujet dans notre section {{anch("Using the lifecycle callbacks")}} ci-dessous.

+Vous en apprendrez plus à ce sujet dans notre section {{anch("Using the lifecycle callbacks")}} ci-dessous. -

Il existe deux types d'éléments personnalisés :

+Il existe deux types d'éléments personnalisés : - +- les **éléments personnalisés autonomes** sont indépendants : ils n'héritent pas des éléments HTML standard ; vous les utilisez sur une page en les écrivant littéralement en tant qu'élément HTML ; par exemple ``, ou `document.createElement("popup-info")` ; +- les `éléments intégrés personnalisés` héritent des éléments HTML de base. Pour en créer un, vous devez spécifier quel élément ils étendent (comme indiqué dans les exemples ci-dessus), et ils sont utilisés en écrivant l'élément de base, mais en indiquant le nom de l'élément personnalisé dans l'attribut (ou la propriété) {{htmlattrxref("is" )}} ; par exemple \

ou document.createElement("p", {is: "word-count"}). -

Passage en revue de quelques exemples simples

+## Passage en revue de quelques exemples simples -

À ce stade, examinons quelques exemples plus simples pour vous montrer plus en détail comment des éléments personnalisés sont créés.

+À ce stade, examinons quelques exemples plus simples pour vous montrer plus en détail comment des éléments personnalisés sont créés. -

Éléments personnalisés indépendants

+### Éléments personnalisés indépendants -

Jetons un coup d'oeil à un élément personnalisé indépendant : <popup-info-box> (voir un exemple en direct). Il prend une icône d'image et une chaîne de texte, et intègre l'icône dans la page.

+Jetons un coup d'oeil à un élément personnalisé indépendant : [\](https://github.com/mdn/web-components-examples/tree/master/popup-info-box-web-component) (voir un [exemple en direct](https://mdn.github.io/web-components-examples/popup-info-box-web-component/)). Il prend une icône d'image et une chaîne de texte, et intègre l'icône dans la page. -

Lorsque l'icône reçoit la focalisation, elle affiche le texte dans une boîte d'information contextuelle pour fournir d'autres informations contextuelles.

+Lorsque l'icône reçoit la focalisation, elle affiche le texte dans une boîte d'information contextuelle pour fournir d'autres informations contextuelles. -

Pour commencer, dans notre fichier JavaScript, nous définissons une classe appelée PopUpInfo qui étend {{domxref("HTMLElement")}}. Les éléments personnalisés indépendants étendent presque toujours HTMLElement.

+Pour commencer, dans notre fichier JavaScript, nous définissons une classe appelée `PopUpInfo` qui étend {{domxref("HTMLElement")}}. Les éléments personnalisés indépendants étendent presque toujours `HTMLElement`. -
class PopUpInfo extends HTMLElement {
+```js
+class PopUpInfo extends HTMLElement {
   constructor() {
     // Toujours appeler "super" d'abord dans le constructeur
     super();
@@ -80,13 +79,15 @@ translation_of: Web/Web_Components/Using_custom_elements
     // Ecrire la fonctionnalité de l'élément ici
     ...
   }
-}
+} +``` -

On y trouve la définition {{jsxref("Classes.constructor","constructor")}} de la classe, qui commence comme toujours par appeler super(), afin que la chaîne de prototype correcte soit définie.

+On y trouve la définition {{jsxref("Classes.constructor","constructor")}} de la classe, qui commence comme toujours par appeler super(), afin que la chaîne de prototype correcte soit définie. -

Dans le constructeur, nous définissons toutes les fonctionnalités que l'élément aura lorsqu'une instance de celui-ci sera instanciée. Dans ce cas, nous attachons une racine fantôme à l'élément personnalisé, nous utilisons une manipulation DOM pour créer la structure DOM interne de l'élément - qui est ensuite attachée à la racine fantôme ; et finalement, nous attachons du CSS à la racine fantôme pour la mettre en forme.

+Dans le constructeur, nous définissons toutes les fonctionnalités que l'élément aura lorsqu'une instance de celui-ci sera instanciée. Dans ce cas, nous attachons une racine fantôme à l'élément personnalisé, nous utilisons une manipulation DOM pour créer la structure DOM interne de l'élément - qui est ensuite attachée à la racine fantôme ; et finalement, nous attachons du CSS à la racine fantôme pour la mettre en forme. -
// Création d'une racine fantôme
+```js
+// Création d'une racine fantôme
 var shadow = this.attachShadow({mode: 'open'});
 
 // Création des spans
@@ -124,29 +125,33 @@ style.textContent = '.wrapper {' +
 shadow.appendChild(style);
 shadow.appendChild(wrapper);
 wrapper.appendChild(icon);
-wrapper.appendChild(info);
+wrapper.appendChild(info); +``` -

Enfin, nous enregistrons notre élément personnalisé dans le CustomElementRegistry à l'aide de la méthode define() mentionnée précédemment ; dans les paramètres, nous spécifions le nom de l'élément, puis le nom de la classe qui définit sa fonctionnalité :

+Enfin, nous enregistrons notre élément personnalisé dans le `CustomElementRegistry` à l'aide de la méthode `define()` mentionnée précédemment ; dans les paramètres, nous spécifions le nom de l'élément, puis le nom de la classe qui définit sa fonctionnalité : -
customElements.define('popup-info', PopUpInfo);
+```js +customElements.define('popup-info', PopUpInfo); +``` -

Il est maintenant disponible pour utilisation dans notre page. Dans notre code HTML, nous l'utilisons comme ceci :

+Il est maintenant disponible pour utilisation dans notre page. Dans notre code HTML, nous l'utilisons comme ceci : -
<popup-info img="img/alt.png" text="Your card validation code (CVC)
+```html
+
+  back of your card.">
+```
 
-
-

Note : Vous pouvez voir le full JavaScript source code ici.

-
+> **Note :** Vous pouvez voir le [full JavaScript source code](https://github.com/mdn/web-components-examples/blob/master/popup-info-box-web-component/main.js) ici. -

Eléments intégrés personnalisés

+### Eléments intégrés personnalisés -

Jetons maintenant un coup d'œil à un autre exemple d'élément intégré - expanding-list (voir aussi en direct). Cela transforme n'importe quelle liste non ordonnée en un menu déployable/refermable.

+Jetons maintenant un coup d'œil à un autre exemple d'élément intégré - [expanding-list](https://github.com/mdn/web-components-examples/tree/master/expanding-list-web-component) ([voir aussi en direct](https://mdn.github.io/web-components-examples/expanding-list-web-component/)). Cela transforme n'importe quelle liste non ordonnée en un menu déployable/refermable. -

Tout d'abord, nous définissons la classe de notre élément, de la même manière que précédemment :

+Tout d'abord, nous définissons la classe de notre élément, de la même manière que précédemment : -
class ExpandingList extends HTMLUListElement {
+```js
+class ExpandingList extends HTMLUListElement {
   constructor() {
     // Toujours appeler "super" d'abord dans le constructeur
     super();
@@ -155,58 +160,64 @@ wrapper.appendChild(info);
... } -}
+} +``` -

Nous n'expliquerons pas en détail la fonctionnalité de l'élément ici, mais vous pouvez découvrir comment elle fonctionne en regardant le code source. La seule vraie différence ici est que notre élément étend l'interface {{domxref("HTMLUListElement")}}, et non {{domxref("HTMLElement")}}. Il a donc toutes les caractéristiques d'un élément {{htmlelement ("ul")}} avec la fonctionnalité que nous définissons par dessus, plutôt que d'être un élément indépendant. C'est ce qui en fait un élément intégré personnalisé plutôt qu'un élément indépendant.

+Nous n'expliquerons pas en détail la fonctionnalité de l'élément ici, mais vous pouvez découvrir comment elle fonctionne en regardant le code source. La seule vraie différence ici est que notre élément étend l'interface {{domxref("HTMLUListElement")}}, et non {{domxref("HTMLElement")}}. Il a donc toutes les caractéristiques d'un élément {{htmlelement ("ul")}} avec la fonctionnalité que nous définissons par dessus, plutôt que d'être un élément indépendant. C'est ce qui en fait un élément intégré personnalisé plutôt qu'un élément indépendant. -

Ensuite, nous enregistrons l'élément en utilisant la méthode define() comme précédemment, sauf que cette fois, il comprend également un objet options qui détaille l'élément dont notre élément personnalisé hérite :

+Ensuite, nous enregistrons l'élément en utilisant la méthode `define()` comme précédemment, sauf que cette fois, il comprend également un objet options qui détaille l'élément dont notre élément personnalisé hérite : -
customElements.define('expanding-list', ExpandingList, { extends: "ul" });
+```js +customElements.define('expanding-list', ExpandingList, { extends: "ul" }); +``` -

L'utilisation de l'élément intégré dans un document web se présente également de façon quelque peu différente :

+L'utilisation de l'élément intégré dans un document web se présente également de façon quelque peu différente : -
<ul is="expanding-list">
+```html
+
    ... -</ul>
+ +``` -

Vous utilisez l'élément <ul> comme d'habitude, mais vous spécifiez le nom de l'élément personnalisé dans l'attribut is.

+Vous utilisez l'élément `
    ` comme d'habitude, mais vous spécifiez le nom de l'élément personnalisé dans l'attribut `is`. -
    -

    Note : à nouveau, vous pouvez voir le JavaScript source code complet ici.

    -
    +> **Note :** à nouveau, vous pouvez voir le [JavaScript source code](https://github.com/mdn/web-components-examples/blob/master/expanding-list-web-component/main.js) complet ici. -

    Utilisation des rappels de cycle de vie

    +## Utilisation des rappels de cycle de vie -

    Vous pouvez définir plusieurs rappels différents dans le constructeur d'un élément personnalisé, qui se déclenchent à différents points du cycle de vie de l'élément :

    +Vous pouvez définir plusieurs rappels différents dans le constructeur d'un élément personnalisé, qui se déclenchent à différents points du cycle de vie de l'élément : -
      -
    • connectedCallback : appelé lorsque l'élément personnalisé est connecté pour la première fois au DOM du document ;
    • -
    • disconnectedCallback : appelé lorsque l'élément personnalisé est déconnecté du DOM du document ;
    • -
    • adoptedCallback : appelé lorsque l'élément personnalisé est déplacé vers un nouveau document ;
    • -
    • attributeChangedCallback : appelé lorsque l'un des attributs de l'élément personnalisé est ajouté, supprimé ou modifié.
    • -
    +- connectedCallback : appelé lorsque l'élément personnalisé est connecté pour la première fois au DOM du document ; +- disconnectedCallback : appelé lorsque l'élément personnalisé est déconnecté du DOM du document ; +- adoptedCallback : appelé lorsque l'élément personnalisé est déplacé vers un nouveau document ; +- attributeChangedCallback : appelé lorsque l'un des attributs de l'élément personnalisé est ajouté, supprimé ou modifié. -

    Jetons un coup d'œil à un exemple de ceux-ci en cours d'utilisation. Le code ci-dessous est tiré de notre exemple de rappels de cycle de vie (le voir s'exécuter en direct). C'est un exemple trivial qui génère simplement un carré coloré de taille fixe sur la page. L'élément personnalisé ressemble à ceci :

    +Jetons un coup d'œil à un exemple de ceux-ci en cours d'utilisation. Le code ci-dessous est tiré de notre exemple de [rappels de cycle de vie](https://github.com/mdn/web-components-examples/tree/master/life-cycle-callbacks) ([le voir s'exécuter en direct](https://mdn.github.io/web-components-examples/life-cycle-callbacks/)). C'est un exemple trivial qui génère simplement un carré coloré de taille fixe sur la page. L'élément personnalisé ressemble à ceci : -
    <custom-square l="100" c="red"></custom-square>
    +```html + +``` -

    Le constructeur de classe est vraiment simple - ici, nous attachons un DOM à l'élément, puis nous attachons les éléments vides {{htmlelement("div")}} et {{htmlelement("style")}} à la racine fantôme :

    +Le constructeur de classe est vraiment simple - ici, nous attachons un DOM à l'élément, puis nous attachons les éléments vides {{htmlelement("div")}} et {{htmlelement("style")}} à la racine fantôme : -
    var shadow = this.attachShadow({mode: 'open'});
    +```js
    +var shadow = this.attachShadow({mode: 'open'});
     
     var div = document.createElement('div');
     var style = document.createElement('style');
     shadow.appendChild(style);
    -shadow.appendChild(div);
    +shadow.appendChild(div); +``` -

    La fonction clé dans cet exemple est updateStyle() : elle prend un élément, récupère sa racine fantôme, retrouve son élément <style>, et ajoute {{cssxref("width")}}, {{cssxref("height")}}, et {{cssxref("background-color")}} au style.

    +La fonction clé dans cet exemple est `updateStyle()` : elle prend un élément, récupère sa racine fantôme, retrouve son élément ` +

    My paragraph

    + +``` -

    On peut maintenent utiliser le modèle dans le document HTML:

    +On peut maintenent utiliser le modèle dans le document HTML: -
    -<my-paragraph></my-paragraph>
    -
    +```html + +``` -
    -

    Note : Les modèles sont bien pris en charge par les navigateurs ; l'API Shadow DOM est pris en charge par défaut dans Firefox (à partir de la version 63), Chrome, Opera, Safari et Edge (à partir de la version 70).

    -
    +> **Note :** Les modèles sont bien pris en charge par les navigateurs ; l'API Shadow DOM est pris en charge par défaut dans Firefox (à partir de la version 63), Chrome, Opera, Safari et Edge (à partir de la version 70). -

    Plus de flexibilité avec les slots

    +## Plus de flexibilité avec les slots -

    Jusque-là, nous avons vu une première utilisation de l'élément <template>. Cette implémentation n'est pas très flexible ; elle ne permet d'afficher que du texte, c'est-à-dire qu'il est aussi utile qu'un paragraphe classique ! Il est possible d'insérer du texte dans chaque instance d'élément de façon déclarative grâce à <slot>. Cette fonction est moins bien prise en charge que <template>, disponible sur Chrome 53, Opera 40, Safari 10, Firefox 59 et Edge 79.

    +Jusque-là, nous avons vu une première utilisation de l'élément `