Comment fonctionne box-shadow
box-shadow peint une ombre autour de la boîte de bordure d'un élément. Elle suit border-radius, ne prend pas de place dans la mise en page et demande au moins deux valeurs : le décalage horizontal et le décalage vertical.
La syntaxe
box-shadow: [inset] <offset-x> <offset-y> [<blur>] [<spread>] [<color>];
| Valeur | Sens | Par défaut |
|---|---|---|
inset | Dessine l'ombre à l'intérieur de la boîte, comme une zone enfoncée | À l'extérieur |
| offset-x | Positif vers la droite, négatif vers la gauche | Obligatoire |
| offset-y | Positif vers le bas, négatif vers le haut | Obligatoire |
| blur | La douceur du bord ; ne peut pas être négatif | 0 (un bord net) |
| spread | Agrandit (positif) ou réduit (négatif) l'ombre | 0 |
| color | N'importe quelle couleur ; un noir semi-transparent est en général le plus réussi | La couleur du texte |
Le nombre de longueurs décide de leur sens : deux sont les décalages, trois ajoutent le flou, quatre ajoutent le spread. Essayez :
Essayez 0 0 0 4px #f59e0b (un anneau), inset 0 0 12px #2563eb et -8px -8px 0 #16a34a.
Spread : anneaux et ombres d'un seul côté
Le spread change la taille de l'ombre avant le flou. Deux schémas en découlent :
- Un anneau : sans décalage, sans flou, seulement du spread. Contrairement à une bordure, il ne change pas la taille de l'élément, c'est donc un bon indicateur de focus (
:focus-visible { box-shadow: 0 0 0 3px #2563eb; }). - Un anneau avec un espace : empilez un spread blanc sous un spread coloré plus grand.
- Un seul côté : décalez l'ombre vers le bas et rétrécissez-la avec un spread négatif, pour qu'elle ne dépasse qu'en bas.
Des ombres superposées pour une profondeur réaliste
Les vraies ombres ont une partie sombre et nette près de l'objet, et une partie douce et pâle plus loin. Deux ou trois couches l'imitent bien mieux qu'un seul grand flou :
La première ombre de la liste est peinte au-dessus. Gardez des couleurs d'ombre en noir semi-transparent ou en teinte sombre du fond, jamais en gris pur, pour qu'elles assombrissent ce qui se trouve dessous.
Ombres intérieures
inset dessine l'ombre à l'intérieur de la boîte de padding, comme si la surface était enfoncée. Cela convient aux champs de texte, aux zones en creux et aux boutons pressés :
input {
box-shadow: inset 0 1px 3px rgb(0 0 0 / 20%);
}
button:active {
box-shadow: inset 0 3px 6px rgb(0 0 0 / 30%);
}
Une ombre intérieure est dessinée au-dessus du fond mais sous le contenu. Les ombres qui suivent la forme des lettres plutôt que la boîte relèvent de text-shadow.
Erreurs courantes
- Des ombres noires pures et entièrement opaques. Elles ressemblent à un contour sombre. Utilisez un alpha de 10 % à 30 %.
- Un seul énorme flou pour la profondeur. Superposez une petite ombre nette et une grande ombre douce.
- Une ombre coupée au bord. Un ancêtre avec
overflow: hiddenla découpe ; ajoutez du padding à l'ancêtre ou déplacez la règle overflow. - Un flou négatif. Il est invalide et toute la déclaration est ignorée.
- Animer
box-shadowsur de nombreux éléments. Cela repeint chaque image. Sur les pages lourdes, animez plutôt l'opacityd'un pseudo-élément qui porte l'ombre la plus grande.
Questions fréquentes
Quelle est la syntaxe de box-shadow ?
box-shadow: offset-x offset-y blur spread color;, par exemple box-shadow: 0 4px 12px 0 rgb(0 0 0 / 15%);. Seuls les deux décalages sont obligatoires ; ajoutez inset pour dessiner l'ombre à l'intérieur de la boîte.
À quoi sert spread dans box-shadow ?
Il agrandit (valeur positive) ou réduit (valeur négative) l'ombre avant qu'elle soit floutée. Une ombre sans décalage, sans flou et avec un spread de 3px forme un anneau plein de 3px autour de l'élément.
Comment mettre une ombre uniquement en bas ?
Décalez-la vers le bas et rétrécissez-la avec un spread négatif pour que les côtés disparaissent : box-shadow: 0 8px 6px -6px rgb(0 0 0 / 40%);.
box-shadow modifie-t-il la mise en page ?
Non. Une ombre ne prend pas de place et ne déplace pas les autres éléments : c'est donc un bon moyen d'ajouter un anneau de focus ou un effet de soulèvement au survol sans décalage de la mise en page. Elle peut être coupée par le overflow: hidden d'un ancêtre.
Peut-on avoir plusieurs box-shadow ?
Oui, séparez-les par des virgules. La première ombre est dessinée au-dessus. Superposer une petite ombre nette et une grande ombre douce donne un rendu plus naturel qu'une seule grosse ombre.