Skip to content

Commit ae4daa2

Browse files
committed
docs: add slotted section
1 parent 864835d commit ae4daa2

File tree

1 file changed

+112
-1
lines changed

1 file changed

+112
-1
lines changed

8-web-components/6-shadow-dom-style/article-fr.md

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,115 @@ customElements.define('custom-dialog', class extends HTMLElement {
111111

112112
Maintenant les styles additionnels concernant le centrage sont uniquement appliqués au premier dialogue : `<custom-dialog centered>`.
113113

114-
Pour résumé, nous pouvons utiliser une famille de sélecteur `:host` pour appliquer des styles à l'élément principal du composant. Ces styles (excepté `!important`) peuvent être outrepasser par le document.
114+
Pour résumé, nous pouvons utiliser une famille de sélecteur `:host` pour appliquer des styles à l'élément principal du composant. Ces styles (excepté `!important`) peuvent être outrepasser par le document.
115+
116+
## Application de style au contenu "slotted"
117+
118+
Maintenant considèrons la situation avec des slots.
119+
120+
Les éléments "slotted" proviennent du light DOM, donc ils utilisent les styles du document. Les styles locaux n'affectent pas les contenus "slotted".
121+
122+
Dans l'exemple ci-dessous, la `<span>` "slotted" est en gras, de par le style du document, mais `background` du style local n'est pas pris en compte :
123+
124+
```html run autorun="no-epub" untrusted height=80
125+
<style>
126+
*!*
127+
span { font-weight: bold }
128+
*/!*
129+
</style>
130+
131+
<user-card>
132+
<div slot="username">*!*<span>John Smith</span>*/!*</div>
133+
</user-card>
134+
135+
<script>
136+
customElements.define('user-card', class extends HTMLElement {
137+
connectedCallback() {
138+
this.attachShadow({mode: 'open'});
139+
this.shadowRoot.innerHTML = `
140+
<style>
141+
*!*
142+
span { background: red; }
143+
*/!*
144+
</style>
145+
Name: <slot name="username"></slot>
146+
`;
147+
}
148+
});
149+
</script>
150+
```
151+
152+
Le résultat est gras, mais pas rouge.
153+
154+
Si nous voulions appliquer du style sur les éléments "slotted" dans notre composant, il y a deux possibilités.
155+
156+
La première, on pourrait appliquer du style à `<slot>` elle même et compter sur l'héritage du CSS :
157+
158+
```html run autorun="no-epub" untrusted height=80
159+
<user-card>
160+
<div slot="username">*!*<span>John Smith</span>*/!*</div>
161+
</user-card>
162+
163+
<script>
164+
customElements.define('user-card', class extends HTMLElement {
165+
connectedCallback() {
166+
this.attachShadow({mode: 'open'});
167+
this.shadowRoot.innerHTML = `
168+
<style>
169+
*!*
170+
slot[name="username"] { font-weight: bold; }
171+
*/!*
172+
</style>
173+
Name: <slot name="username"></slot>
174+
`;
175+
}
176+
});
177+
</script>
178+
```
179+
180+
Ici `<p>John Smith</p>` devient gras, grâce à l'héritage du CSS entre `<slot>` et son contenu. Mais dans le CSS lui-même, toutes les propriétés ne sont pas héritée.
181+
182+
Une autre option est d'utiliser la pseudo classe `::slotted(selector)`. Elle fait correspondre deux éléments selon deux conditions :
183+
184+
1. Il s'agit d'un élément "slotted", ça vient du light DOM. Le nom du slot n'a pas d'importance. Ça fonctionne pour tout élément "slotted", mais seulement pour l'élément lui-même, pas pour ses enfants.
185+
2. L'élément correspond au `sélecteur`.
186+
187+
Dans notre exemple, `::slotted(div)` selectionne uniquement `<div slot="username">`, mais pas ses enfants :
188+
189+
```html run autorun="no-epub" untrusted height=80
190+
<user-card>
191+
<div slot="username">
192+
<div>John Smith</div>
193+
</div>
194+
</user-card>
195+
196+
<script>
197+
customElements.define('user-card', class extends HTMLElement {
198+
connectedCallback() {
199+
this.attachShadow({mode: 'open'});
200+
this.shadowRoot.innerHTML = `
201+
<style>
202+
*!*
203+
::slotted(div) { border: 1px solid red; }
204+
*/!*
205+
</style>
206+
Name: <slot name="username"></slot>
207+
`;
208+
}
209+
});
210+
</script>
211+
```
212+
213+
Veuillez noter, le sélecteur `::slotted` ne peut pas descendre plus bas dans le slot. Ces sélecteurs sont invalides :
214+
215+
```css
216+
::slotted(div span) {
217+
/* Notre <div> "slotted" ne correspond pas */
218+
}
219+
220+
::slotted(div) p {
221+
/* Ne peut pas aller dans le light DOM */
222+
}
223+
```
224+
225+
Aussi, `::slotted` peut être utilisé uniquement en CSS. On ne peut pas l'utiliser dans `querySelector`.

0 commit comments

Comments
 (0)