Skip to main content
Bases de Svelte
Introduction
Réactivité
Props
Logique
Évènements
Liaisons
Classes et styles
Actions
Transitions
Svelte avancé
Réactivité avancée
Réutiliser du contenu
Mouvements
Liaisons avancées
Transitions avancées
API de contexte
Éléments spéciaux
<script module>
Next steps
Bases de SvelteKit
Introduction
Routing
Chargement de données
En-têtes et cookies
Modules partagés
Formulaires
Routes d’API
$app/state
Erreurs et redirections
SvelteKit avancé
Hooks
Options de page
Options de lien
Routing avancé
Chargement avancé
Variables d’environnement
Conclusion

Il est parfois nécessaire d’influencer les styles au sein d’un composant enfant. Peut-être que nous voulons colorier ces boîtes en rouge, vert et bleu.

Une façon de faire cela est d’utiliser le modificateur CSS :global, qui vous permet de cibler sans discrimination les éléments au sein d’autres composants :

App
<style>
	.boxes :global(.box:nth-child(1)) {
		background-color: red;
	}

	.boxes :global(.box:nth-child(2)) {
		background-color: green;
	}

	.boxes :global(.box:nth-child(3)) {
		background-color: blue;
	}
</style>

Mais il y a beaucoup de raison de ne pas faire ça. D’abord, c’est extrêmement verbeux. Ensuite, c’est fragile — tout changement dans les détails d’implémentation de Box.svelte pourrait casser le sélecteur.

Mais surtout, c’est malpoli. Les composants devraient être capables de décider eux-mêmes quels styles peuvent être contrôlés “de l’extérieur”, de la même manière qu’ils décident quelles variables sont exposées en tant que props. :global ne devrait être utilisé qu’en dernier recours, pour contourner cette règle.

Dans Box.svelte, modifiez background-color pour qu’il soit déterminé par une propriété CSS personnalisée :

Box
<style>
	.box {
		width: 5em;
		height: 5em;
		border-radius: 0.5em;
		margin: 0 0 1em 0;
		background-color: var(--color, #ddd);
	}
</style>

Tout élément parent (comme <div class="boxes">) peut définir la valeur de --color, mais nous pouvons aussi la définir sur des composants individuels :

App
<div class="boxes">
	<Box --color="red" />
	<Box --color="green" />
	<Box --color="blue" />
</div>

Les valeurs peuvent être dynamiques, comme tout autre attribut.

Cette fonctionnalité fonctionne en entourant chaque composant dans un élément avec display: contents, lorsque nécessaire, et en y appliquant les propriétés personnalisées. Si vous inspectez les éléments, vous verrez ce genre de markup :

<svelte-css-wrapper style="display: contents; --color: red;">
	<!-- contents -->
</svelte-css-wrapper>

Grâce à display: contents, ceci n’affectera pas votre layout, mais l’élément supplémentaire peut impacter des sélecteurs comme .parent > .child.

Modifier cette page sur Github

1
2
3
4
5
6
7
8
9
<script>
	import Box from './Box.svelte';
</script>
 
<div class="boxes">
	<Box />
	<Box />
	<Box />
</div>