Maison >interface Web >Questions et réponses frontales >Comment utiliser Shadow Dom pour l'encapsulation dans les composants Web?
Utilisation de Shadow Dom pour l'encapsulation dans les composants Web
Shadow Dom est une partie cruciale de la création de composants Web vraiment encapsulés. Il vous permet de résumer la structure interne d'un composant (HTML, CSS et JavaScript) du reste de la page. Cela empêche les conflits de style et les effets secondaires involontaires. Vous créez un Dom Shadow en utilisant la méthode attachShadow()
sur un élément. Cette méthode prend un objet ShadowRootInit
en option comme un argument, qui vous permet de spécifier le mode de l'ombre Dom. Les deux modes sont:
'open'
(par défaut): les styles du document principal peuvent affecter le Dom Shadow et vice-versa. Cela offre plus de flexibilité mais réduit l'encapsulation.'closed'
: les styles du document principal ne peuvent pas affecter le Dom Shadow et vice-versa. Cela fournit une encapsulation plus forte, empêchant le saignement du style et les remplacements accidentels.Voici un exemple de création d'un composant Web avec Shadow Dom:
<code class="javascript">class MyComponent extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'closed' }); // Use 'open' if needed // Create internal HTML const div = document.createElement('div'); div.innerHTML = ` <style> :host { display: block; border: 1px solid black; } p { color: blue; } </style> <p>This is my component!</p> `; this.shadowRoot.appendChild(div); } } customElements.define('my-component', MyComponent);</code>
Ce code définit un élément personnalisé my-component
. La méthode attachShadow()
crée le Dom Shadow, et le HTML interne, y compris les styles, y est ajouté. Le :host
pseudo-selector vous permet de styliser l'élément personnalisé lui-même. Parce que nous avons utilisé mode: 'closed'
, les styles de la page principale ne affecteront pas l'apparence de ce composant.
Avantages de l'ombre Dom sur d'autres techniques d'encapsulation
Par rapport à d'autres techniques d'encapsulation comme l'utilisation de noms de classe CSS uniques ou d'espaces de noms JavaScript, Shadow Dom offre plusieurs avantages clés:
Styling composants avec Shadow Dom efficacement
Les composants de style dans Shadow Dom sont simples, mais nécessitent de comprendre comment le :host
et le fonctionnement de la portée CSS.
<style></style>
. Cela maintient les styles localisés et empêche les conflits.:host
pseudo-sélectionneur: ce pseudo-sélectionneur cible l'élément personnalisé lui-même, vous permettant de styliser l'élément hôte à l'intérieur de l'ombre Dom. Exemple utilisant la feuille de style interne et :host
:
<code class="html"><my-component style="--my-color: red;"></my-component> <style> my-component { /* styles applied to the outside of the shadow root */ } my-component::part(my-part) { /* styles applied to a specific part inside the shadow root */ } </style></code>
<code class="javascript">class MyComponent extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'open' }); // or 'closed' this.shadowRoot.innerHTML = ` <style> :host { display: block; border: 1px solid var(--my-color, black); /* Default to black if not specified */ } p { color: blue; } </style> <p>This is my component!</p> `; } }</code>
Cet exemple montre comment utiliser une variable CSS ( --my-color
) pour personnaliser la couleur de la bordure de l'extérieur. La couleur par défaut est noire.
Accéder et manipuler les éléments Shadow Dom de l'extérieur
L'accès directement à l'accès et à la manipulation des éléments dans un DOM de l'ombre de l'extérieur est généralement découragé car il casse l'encapsulation et peut entraîner un code fragile. Cependant, il y a des situations où cela pourrait être nécessaire. Voici quelques méthodes:
querySelector
et querySelectorAll
: Si vous connaissez le sélecteur d'un élément dans l'ombre DOM, vous pouvez utiliser ces méthodes pour y accéder. Cependant, cela est fragile car les modifications de la structure interne pourraient casser votre code. La méthode querySelector
doit être appelée sur la propriété shadowRoot
.shadowRoot
: si vous avez une référence à l'élément personnalisé, vous pouvez accéder à sa propriété shadowRoot
pour traverser le Dom Shadow. Exemple d'accès aux éléments à l'aide de querySelector
:
<code class="javascript">const myComponent = document.querySelector('my-component'); const paragraph = myComponent.shadowRoot.querySelector('p'); paragraph.textContent = 'This text has been changed from the outside!';</code>
Cet exemple accède directement à l'élément <p></p>
dans l'ombre DOM. Cependant, cela est généralement découragé. Il vaut bien mieux exposer une méthode dans votre classe MyComponent
qui permet de mettre à jour le texte de manière contrôlée et maintenable. Par exemple:
<code class="javascript">class MyComponent extends HTMLElement { // ... (constructor as before) ... set textContent(newText) { this.shadowRoot.querySelector('p').textContent = newText; } }</code>
Vous pouvez maintenant mettre à jour le texte en toute sécurité et prévisible à l'aide: myComponent.textContent = "New text";
Cette approche maintient l'encapsulation et maintient votre code plus robuste.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!