Styles et CSS
Astro a été conçu pour rendre la mise en forme et l’écriture CSS un jeu d’enfant. Écrivez votre propre CSS directement dans un composant Astro ou importez votre bibliothèque CSS préférée comme Tailwind. Les langages avancés de mise en forme comme Sass et Less sont également pris en charge.
Styliser avec Astro
Titre de la section Styliser avec AstroLa mise en forme d’un composant Astro est aussi simple que l’ajout d’une balise <style>
à votre composant ou à votre modèle de page. Lorsque vous placez une balise <style>
à l’intérieur d’un composant Astro, Astro détecte le CSS et gère vos styles pour vous, automatiquement.
<style> h1 { color: red; }</style>
Styles à portée limitée
Titre de la section Styles à portée limitéeLes règles CSS définies dans la balise <style>
d’Astro disposent automatiquement d’une portée limitée par défaut (« scoped » en anglais). Les styles à portée limitée sont compilés en arrière-plan pour s’appliquer uniquement au code HTML écrit à l’intérieur de ce même composant. Le CSS que vous écrivez à l’intérieur d’un composant Astro est automatiquement encapsulé à l’intérieur de ce composant.
Ce CSS:
<style> h1 { color: red; }
.text { color: blue; }</style>
Est compilé comme ceci :
<style> h1[data-astro-cid-hhnqfkh6] { color: red; }
.text[data-astro-cid-hhnqfkh6] { color: blue; }</style>
Les styles à portée limitée ne fuient pas et n’auront pas d’impact sur le reste de votre site. Dans Astro, il est possible d’utiliser des sélecteurs peu spécifiques comme h1 {}
ou p {}
car ils seront compilés avec une portée limitée dans la sortie finale.
Les styles à portée limitée ne s’appliquent pas non plus aux autres composants Astro contenus dans votre modèle. Si vous devez mettre en forme un composant enfant, pensez à envelopper ce composant dans un <div>
(ou un autre élément) que vous pourrez ensuite mettre en forme.
La spécificité des styles à portée limitée est préservée, ce qui leur permet de fonctionner de manière cohérente avec d’autres fichiers CSS ou bibliothèques CSS tout en préservant les limites exclusives qui empêchent les styles de s’appliquer en dehors du composant.
Styles globaux
Titre de la section Styles globauxBien que nous recommandions des styles à portée limitée pour la plupart des composants, il se peut que vous trouviez une raison valable d’écrire du CSS global et sans portée limitée. Vous pouvez désactiver la portée CSS automatique avec l’attribut <style is:global>
.
<style is:global> /* Sans portée limitée, livré tel quel au navigateur. S'applique à toutes les balises <h1> de votre site. */ h1 { color: red; }</style>
Vous pouvez également mélanger des règles CSS globales et à portée limitée dans la même balise <style>
en utilisant le sélecteur :global()
. Cela devient un modèle puissant pour appliquer des styles CSS aux enfants de votre composant.
<style> /* Pour ce composant, seulement. */ h1 { color: red; } /* Mixte : S'applique uniquement aux éléments enfants `h1`. */ article :global(h1) { color: blue; }</style><h1>Titre</h1><article><slot /></article>
C’est un excellent moyen de mettre en forme des éléments tels que des articles de blog ou des documents dont le contenu est géré par un CMS et qui se trouvent en dehors d’Astro. Mais attention : les composants dont l’apparence diffère selon qu’ils ont ou non un certain composant parent peuvent devenir difficiles à dépanner.
Les styles à portée limitée doivent être utilisés aussi souvent que possible. Les styles globaux ne doivent être utilisés qu’en cas de besoin.
Combiner des classes avec class:list
Titre de la section Combiner des classes avec class:listSi vous avez besoin de combiner dynamiquement des classes sur un élément, vous pouvez utiliser l’attribut utilitaire class:list
dans les fichiers .astro
.
---const { isRed } = Astro.props;---<!-- Si `isRed` est vrai, la classe sera "box red". --><!-- Si `isRed` est faux, la classe sera "box". --><div class:list={['box', { red: isRed }]}><slot /></div>
<style> .box { border: 1px solid blue; } .red { border-color: red; }</style>
class:list
.
Variables CSS
Titre de la section Variables CSS
Ajouté à la version :
[email protected]
La balise <style>
d’Astro peut référencer n’importe quelle variable CSS disponible sur la page. Vous pouvez également passer des variables CSS directement à partir du frontmatter de votre composant en utilisant la directive define:vars
.
---const foregroundColor = "rgb(221 243 228)";const backgroundColor = "rgb(24 121 78)";---<style define:vars={{ foregroundColor, backgroundColor }}> h1 { background-color: var(--backgroundColor); color: var(--foregroundColor); }</style><h1>Bonjour</h1>
define:vars
.
Transmettre une classe à un composant enfant
Titre de la section Transmettre une classe à un composant enfantDans Astro, les attributs HTML comme class
ne sont pas automatiquement transmis aux composants enfants.
Au lieu de cela, il faut accepter un attribut class
dans le composant enfant et l’appliquer à l’élément racine. Lors de la déstructuration, vous devez le renommer, car class
est un mot réservé en JavaScript.
En utilisant la stratégie de style à portée limitée par défaut, vous devez également passer l’attribut data-astro-cid-*
. Vous pouvez le faire en passant le reste des props au composant. Si vous avez changé scopedStyleStrategy
en 'class'
ou 'where'
, la propriété ...rest
n’est pas nécessaire.
---const { class: className, ...rest } = Astro.props;---<div class={className} {...rest}> <slot/></div>
---import MyComponent from "../components/MyComponent.astro"---<style> .red { color: red; }</style><MyComponent class="red">Ce sera rouge !</MyComponent>
Parce que l’attribut data-astro-cid-*
inclut l’enfant dans la portée de son parent, il est possible que les styles passent en cascade du parent à l’enfant. Pour éviter que cela n’ait des effets secondaires inattendus, assurez-vous d’utiliser des noms de classe uniques dans le composant enfant.
Styles en ligne
Titre de la section Styles en ligneVous pouvez mettre en forme les éléments HTML en ligne en utilisant l’attribut style
. Il peut s’agir d’une chaîne CSS ou d’un objet de propriétés CSS :
// Ils sont équivalents:<p style={{ color: "brown", textDecoration: "underline" }}>Mon texte</p><p style="color: brown; text-decoration: underline;">Mon texte</p>
Styles externes
Titre de la section Styles externesIl y a deux façons de résoudre les feuilles de style globales externes : une importation ESM pour les fichiers situés dans la source de votre projet, et un lien URL absolu pour les fichiers dans votre répertoire public/
, ou hébergés en dehors de votre projet.
public/
ou src/
.
Importer une feuille de style locale
Titre de la section Importer une feuille de style localeVous pouvez avoir besoin de mettre à jour votre astro.config
lorsque vous importez des paquets npm. Voir la section « importer des feuilles de style depuis un paquet npm » ci-dessous.
Vous pouvez importer des feuilles de style dans le frontmatter de vos composants Astro en utilisant la syntaxe d’importation ESM. Les importations CSS fonctionnent comme toute autre importation ESM dans un composant Astro, qui doit être référencé comme relatif au composant et doit être écrit en haut du script de votre composant, avec toutes les autres importations.
---// Astro regroupera et optimisera automatiquement ce CSS pour vous// Cela fonctionne également pour les fichiers de préprocesseur tels que .scss, .styl, etc.import '../styles/utils.css';---<html><!-- Votre page ici --></html>
L’importation de CSS via ESM est supportée à l’intérieur de n’importe quel fichier JavaScript, y compris les composants JSX comme React et Preact. Cela peut être utile pour écrire des styles granulaires par composant pour vos composants React.
Importer une feuille de style à partir d’un paquet npm
Titre de la section Importer une feuille de style à partir d’un paquet npmVous pouvez également avoir besoin de charger des feuilles de style à partir d’un paquet npm externe. Ceci est particulièrement courant pour les utilitaires comme Open Props. Si votre paquet recommande l’utilisation d’une extension de fichier (ex. nom-du-paquet/styles.css
au lieu de nom-du-paquet/styles
), cela devrait fonctionner comme n’importe quelle feuille de style locale :
---import 'package-name/styles.css';---<html><!-- Votre page ici --></html>
Si votre paquet ne suggère pas l’utilisation d’une extension de fichier (c’est-à-dire nom-du-paquet/styles
), vous devrez d’abord mettre à jour votre configuration Astro !
Disons que vous importez un fichier CSS depuis nom-du-paquet
appelé normalize
(avec l’extension de fichier omise). Pour s’assurer que nous pouvons rendre votre page correctement, ajoutez nom-du-paquet
au tableau vite.ssr.noExternal
:
import { defineConfig } from 'astro/config';
export default defineConfig({ vite: { ssr: { noExternal: ['nom-du-paquet'], } }})
Il s’agit d’un paramètre spécifique à Vite qui n’a pas de rapport avec (ou ne nécessite pas) Astro SSR.
Maintenant, vous êtes libre d’importer nom-du-paquet/normalize
. Celle-ci sera regroupée et optimisée par Astro comme n’importe quelle autre feuille de style locale.
---import 'package-name/normalize';---<html><!-- Votre page ici --></html>
Charger une feuille de style statique via les balises “link”
Titre de la section Charger une feuille de style statique via les balises “link”Vous pouvez également utiliser l’élément <link>
pour charger une feuille de style sur la page. Il doit s’agir d’un chemin d’URL absolu vers un fichier CSS situé dans votre répertoire /public
, ou d’une URL vers un site web externe. Les valeurs href <link>
relatives ne sont pas supportées.
<head> <!-- Local : /public/styles/global.css --> <link rel="stylesheet" href="/styles/global.css" /> <!-- Externe --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/themes/prism-tomorrow.css" /></head>
Comme cette approche utilise le répertoire public/
, elle ne tient pas compte du traitement CSS normal, du regroupement et des optimisations fournis par Astro. Si vous avez besoin de ces transformations, utilisez la méthode Importer une feuille de style ci-dessus.
Ordre de cascade
Titre de la section Ordre de cascadeLes composants Astro doivent parfois évaluer plusieurs sources de CSS. Par exemple, votre composant peut importer une feuille de style CSS, inclure sa propre balise <style>
, et être rendu à l’intérieur d’une mise en page qui importe du CSS.
Lorsque des règles CSS contradictoires s’appliquent au même élément, les navigateurs utilisent d’abord la spécificité, puis l’ordre d’apparition pour déterminer la valeur à afficher.
Si une règle est plus spécifique qu’une autre, sa valeur sera prioritaire, quel que soit l’endroit où la règle CSS apparaît :
<style> h1 { color: red } div > h1 { color: purple }</style><div> <h1> Cette en-tête sera mauve ! </h1></div>
Si deux règles ont la même spécificité, l’ordre d’apparition est évalué et la valeur de la dernière règle est prioritaire :
<style> h1 { color: purple } h1 { color: red }</style><div> <h1> Cette en-tête sera rouge ! </h1></div>
Les règles CSS Astro sont évaluées dans cet ordre d’apparition :
- balises
<link>
dans l’en-tête (priorité la plus faible) - styles importés
- styles à portée limitée (priorité la plus élevée)
Styles à portée limitée
Titre de la section Styles à portée limitéeEn fonction de la valeur choisie pour scopedStyleStrategy
, les styles à portée limitée peuvent ou non augmenter la spécificité de la colonne CLASS.
Cependant, les styles à portée limitée apparaissent toujours en dernier. Ces derniers auront donc la priorité sur les autres styles de même spécificité. Par exemple, si vous importez une feuille de style qui entre en conflit avec un style à portée limitée, c’est la valeur du style à portée limitée qui s’appliquera :
h1 { color: purple;}
---import "./make-it-purple.css"---<style> h1 { color: red }</style><div> <h1> Cette en-tête sera rouge ! </h1></div>
Les styles à portée limitée seront écrasés si le style importé est plus spécifique. Le style le plus spécifique aura la priorité sur le style à portée limitée :
#intro { color: purple;}
---import "./make-it-purple.css"---<style> h1 { color: red }</style><div> <h1 id="intro"> Cette en-tête sera mauve ! </h1></div>
Ordre d’importation
Titre de la section Ordre d’importationLors de l’importation de plusieurs feuilles de style dans un composant Astro, les règles CSS sont évaluées dans l’ordre dans lequel elles sont importées. Une spécificité plus élevée déterminera toujours les styles à afficher, quel que soit le moment où la feuille de style CSS est évaluée. Mais lorsque des styles conflictuels ont la même spécificité, c’est le dernier importé qui l’emporte :
div > h1 { color: purple;}
div > h1 { color: green;}
---import "./make-it-green.css"import "./make-it-purple.css"---<style> h1 { color: red }</style><div> <h1> Cette en-tête sera mauve ! </h1></div>
Alors que les balises <style>
sont à portée limitée et ne s’appliquent qu’au composant qui les déclare, le CSS importé peut « fuir ». L’importation d’un composant applique toutes les feuilles de style CSS qu’il importe, même si le composant n’est jamais utilisé :
---import "./make-it-purple.css"---<div> <h1>J'importe du CSS violet.</h1></div>
---import "./make-it-green.css"import PurpleComponent from "./PurpleComponent.astro";---<style> h1 { color: red }</style><div> <h1> Cette en-tête sera mauve ! </h1></div>
Un modèle courant dans Astro consiste à importer des feuilles de style CSS globales à l’intérieur d’un Layout. Veillez à importer le composant Layout avant les autres importations afin qu’il ait la priorité la plus faible.
Balises de lien
Titre de la section Balises de lienLes feuilles de style chargées via les balises de lien sont évaluées dans l’ordre, avant tout autre style dans un fichier Astro. Par conséquent, ces styles ont une priorité inférieure à celle des feuilles de style importées et des styles à portée limitée :
---import "../components/make-it-purple.css"---
<html lang="efr"> <head> <meta charset="utf-8" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <meta name="viewport" content="width=device-width" /> <meta name="generator" content={Astro.generator} /> <title>Astro</title> <link rel="stylesheet" href="/styles/make-it-blue.css" /> </head> <body> <div> <h1>Cette en-tête sera mauve</h1> </div> </body></html>