En une phrase
La propriété CSS box-shadow vous permet de projeter une ou plusieurs ombres à partir du cadre d'un élément, créant une illusion de profondeur, d'élévation ou de lueur interne sur une page web.
Le problème que ça résout
Dans le « Flatland » du design web des débuts, tout était plat. Il n'y avait ni profondeur, ni élévation. Si vous vouliez qu'un élément ressorte, vous le faisiez plus grand ou d'une couleur plus vive. Et si vous vouliez vraiment une ombre pour qu'un bouton ait l'air cliquable, vous étiez parti pour un long calvaire.
La « solution » était de lancer Photoshop, de créer une boîte avec une ombre portée et de l'exporter en tant qu'image. Vous utilisiez ensuite cette image comme arrière-plan pour votre élément. C'était, pour le dire gentiment, une bidouille infâme. Les images étaient lourdes, ralentissant votre site. Elles avaient l'air pixellisées sur les écrans haute résolution. Elles ne pouvaient pas s'adapter si la taille de la boîte devait changer. Et si le designer voulait changer l'ombre de « gris flou » à « gris un peu plus flou », il fallait retourner dans Photoshop et tout recommencer. C'était fragile, inefficace et un cauchemar à maintenir.
Puis, CSS3 a débarqué tel un super-héros. La propriété box-shadow a donné aux développeurs un moyen de créer des ombres avec du code. Soudain, les ombres n'étaient plus de lourds artefacts bitmap ; elles sont devenues des parties dynamiques, redimensionnables et animables du document lui-même.
Au début, les développeurs l'ont utilisée pour créer les mêmes ombres portées simplistes qu'ils faisaient dans Photoshop. Mais la vraie puissance de box-shadow n'était pas seulement de recréer l'ancienne méthode, mais d'en permettre une nouvelle. C'est devenu la pierre angulaire des systèmes de design comme le Material Design de Google, qui utilise l'ombre et l'élévation pour communiquer la hiérarchie et créer une interface tactile, semblable à du papier. box-shadow a résolu le problème de la fausse profondeur avec des images en nous donnant un moyen natif, basé sur le code, de peindre avec la lumière et l'ombre directement dans le navigateur.
Comment ça marche sous le capot
À première vue, box-shadow semble simple. Mais comme un bon tour de magie, son élégance cache une profondeur surprenante (jeu de mots intentionnel).
L'anatomie d'une seule ombre
Une seule ombre est définie par une série de valeurs qui indiquent au navigateur où la placer, son niveau de flou, sa taille et sa couleur.
La syntaxe de base est box-shadow: offset-x offset-y blur-radius spread-radius color;. Décortiquons ça.
| Paramètre | Ce qu'il fait | Exemple de valeur |
|---|---|---|
offset-x |
Déplace l'ombre horizontalement. Les valeurs positives la déplacent vers la droite, les négatives vers la gauche. | 10px |
offset-y |
Déplace l'ombre verticalement. Les valeurs positives la déplacent vers le bas, les négatives vers le haut. | 10px |
blur-radius |
Contrôle le flou. 0 donne une ombre nette aux bords durs. Des valeurs plus grandes créent un flou plus doux et plus diffus. |
20px |
spread-radius |
Étend ou rétrécit la forme source de l'ombre. Les valeurs positives rendent l'ombre plus grande que l'élément ; les négatives la rétrécissent. | 5px |
color |
La couleur de l'ombre. Utiliser une couleur semi-transparente comme rgba(0, 0, 0, 0.1) est la clé pour des effets réalistes. |
rgba(0,0,0,0.5) |
Seuls offset-x et offset-y sont strictement requis, mais une ombre sans flou ni couleur n'est pas vraiment une ombre.
/* Une ombre simple : 10px vers le bas, 10px vers la droite, 20px de flou, noir à 50% d'opacité */
.card {
box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);
}
Le mot-clé inset : à l'intérieur de la boîte
Par défaut, les ombres sont projetées vers l'extérieur de l'élément, comme si l'élément flottait au-dessus de la page. En ajoutant le mot-clé inset au début, vous pouvez inverser complètement cela.
.pressed-button {
/* Cette ombre est projetée *à l'intérieur* de la padding-box de l'élément */
box-shadow: inset 5px 5px 10px rgba(0, 0, 0, 0.2);
}
Une ombre inset est dessinée à l'intérieur de la bordure de l'élément, par-dessus son arrière-plan. C'est parfait pour créer des effets de boutons « pressés », des champs de saisie qui semblent en creux, ou des effets de vignette sur les images. C'est comme sculpter dans la page au lieu de construire dessus.
Superposer les ombres : le secret d'une profondeur réaliste
C'est là que la vraie magie opère. La propriété box-shadow peut accepter une liste d'ombres séparées par des virgules. C'est le secret pour créer des ombres qui semblent naturelles et non comme un effet Photoshop maladroit de 2008.
Les ombres du monde réel ne sont pas une seule masse uniforme. Pensez à un objet sur votre bureau. Il y a généralement une petite ombre sombre et nette juste en dessous (l'ombre propre), et une ombre plus grande, plus douce et plus transparente qui s'étend (la pénombre).
Nous pouvons reproduire cela en superposant plusieurs définitions de box-shadow. Le navigateur les empile, la première ombre de la liste se trouvant au-dessus des autres.
.super-card {
box-shadow:
/* Couche 1 (en haut) : Une ombre serrée et sombre pour l'« umbra » (ombre propre) */
0 4px 6px -1px rgba(0, 0, 0, 0.1),
/* Couche 2 (en bas) : Une ombre plus large et plus douce pour la « penumbra » (pénombre) */
0 2px 4px -1px rgba(0, 0, 0, 0.06);
}
Ce petit bout de code crée une ombre bien plus réaliste que n'importe quelle ombre à une seule couche. En combinant deux, trois (ou plus !) ombres subtiles, vous pouvez créer une illusion convaincante de profondeur et d'élévation qui rend votre interface plus tangible et soignée. Cette technique est à la base de nombreux systèmes de design modernes, et des outils génèrent souvent ces piles de couches pour vous.
Histoires vécues
Le cas du bouton d'action "flottant"
Une startup développait une version web de son application mobile populaire. L'élément d'interface signature était un bouton d'action flottant (FAB - Floating Action Button) qui restait dans le coin inférieur droit. Le développeur junior chargé de la tâche a balancé un simple box-shadow: 0 5px 10px black; dessus. Lors de la revue du design, la lead designer a grincé des dents. « On n'a pas l'impression qu'il flotte », a-t-elle dit. « On dirait qu'il a une tache sombre et bizarre. » Le bouton semblait collé à la page, pas élevé au-dessus.
Frustré, le dev s'est plongé dans les techniques d'ombres avancées. Il a découvert la superposition. En remplaçant l'unique ombre dure par une pile de trois, il a trouvé la solution. La première était une très petite ombre, relativement sombre, juste sous le bouton pour l'ancrer. La deuxième était une ombre moyenne, légèrement plus claire, pour définir sa forme. La troisième était une grande ombre, très transparente et très floue, pour simuler la diffusion de la lumière dans la zone environnante. Le résultat fut transformateur. Le bouton avait maintenant l'air de vraiment flotter, projetant une ombre douce et complexe qui lui donnait un vrai sens de l'élévation.
La leçon : Une profondeur réaliste vient de l'imitation de la lumière réelle. Superposer des ombres subtiles de tailles, de flous et d'opacités variés est la clé pour faire « flotter » les éléments.
Le mystère de la performance disparue
Une entreprise d'analyse de données a lancé un nouveau tableau de bord magnifique. Il était rempli de cartes, chacune affichant une métrique différente, et chacune avec un effet de survol stylé où la carte se soulevait avec une ombre grandissante. Sur leurs ordinateurs portables de développeur haut de gamme, tout était fluide comme du beurre. Mais les tickets de support ont commencé à affluer. « Le nouveau tableau de bord est si lent ! » « Le défilement fait tourner le ventilateur de mon ordinateur comme un réacteur d'avion ! »
L'équipe de performance s'est penchée sur le problème. En utilisant les outils de développement du navigateur, ils ont vu une mer de rouge dans le profiler de la timeline chaque fois qu'un utilisateur défilait ou survolait une carte. Le navigateur passait une éternité sur l'opération « Paint ». Le coupable ? Chaque carte avait une seule ombre monstrueuse au survol : box-shadow: 0 50px 100px -20px rgba(0,0,0,0.5);. L'énorme rayon de flou (100px) signifiait que le navigateur devait redessiner une zone massive de l'écran à chaque image de l'animation.
La solution a été double. D'abord, ils ont remplacé l'unique ombre coûteuse par une ombre multi-couches plus optimisée qui obtenait un aspect similaire avec des rayons de flou beaucoup plus petits. Ensuite, pour l'effet de survol, ils ont fait la transition sur la propriété transform: scale(1.05) au lieu de box-shadow elle-même. C'était beaucoup moins coûteux à animer pour le navigateur. Les saccades ont disparu et les utilisateurs étaient contents.
La leçon : Rien n'est gratuit. L'attrait visuel d'une grande ombre floue a un coût de performance réel. Soyez attentif au rayon de flou, surtout lors de l'animation des ombres.
Le bouton "enfoncé" qui ne l'était pas
Un designer UI voulait un ensemble de filtres à bascule qui semblaient « enfoncés » lorsqu'ils étaient actifs. La première tentative d'un développeur utilisait un simple changement de classe : le bouton actif obtenait un fond plus sombre et une bordure inset de 1px. Ça fonctionnait, mais le ressenti n'était pas bon. On aurait dit un bouton plat avec une ligne dessinée à l'intérieur, pas un bouton enfoncé dans une surface.
Un dev senior a vu le code et a offert une suggestion en une ligne. « Essaie box-shadow: inset ... ». Au lieu de faire semblant avec des bordures, ils ont utilisé une véritable ombre inset. Une ombre inset douce et sombre en haut et à gauche, et une ombre inset très claire, presque blanche, en bas et à droite. Cela simulait parfaitement une source de lumière venant d'en haut à gauche projetant une ombre à l'intérieur de la zone « enfoncée » et une surbrillance sur les bords opposés. L'effet fut immédiat et convaincant. Le bouton n'avait plus seulement l'air « actif » ; il avait l'air physiquement enfoncé.
La leçon : Quand vous voulez créer des effets de creux ou d'enfoncement, ne vous battez pas avec les bordures et les arrière-plans. Le mot-clé inset pour box-shadow est le bon outil pour le travail, conçu spécifiquement pour créer cette illusion d'ombre intérieure.
Erreurs et pièges courants
- Utiliser du noir pur : Rien dans le monde réel ne projette une ombre
#000000. Les vraies ombres sont influencées par la lumière ambiante et prennent la couleur de leur environnement. Un grand pas en avant est d'utiliser un noir semi-transparent, commergba(0, 0, 0, 0.1). Une étape encore meilleure est d'utiliser une version sombre et désaturée de la couleur principale ou de fond de votre application. - L'ombre unique et dure : Une seule
box-shadowsombre et aux bords nets est le moyen le plus rapide de donner à votre design un aspect démodé. C'était bien en 2010, mais aujourd'hui, ça crie « fait par un dev ». La superposition est la voie vers des interfaces modernes et professionnelles. - Animer la propriété
box-shadow: C'est possible, mais c'est souvent un piège de performance. Animer des propriétés commeblur-radiusouspread-radiusforce le navigateur à effectuer des opérations de redessin (repaint) coûteuses à chaque image, ce qui peut entraîner des animations saccadées. Il est souvent plus fluide d'animertransformouopacityà la place. - Oublier la source de lumière : Une erreur courante est d'appliquer exactement la même
box-shadow(par exemple,10px 10px ...) à chaque élément de la page, quelle que soit sa position. Un bon design implique une source de lumière virtuelle cohérente, généralement en haut à gauche. Cela signifie que les ombres devraient généralement tomber vers le bas et vers la droite (offset-yest positif,offset-xest positif ou nul). Des ombres incohérentes rendent une interface chaotique et peu naturelle. - Pas d'ombre vaut mieux qu'une mauvaise ombre : Si vous n'avez pas le temps ou l'outil pour créer une belle ombre superposée, il est souvent préférable d'utiliser d'autres techniques (comme les bordures ou de subtils changements de couleur de fond) pour créer une séparation. Une ombre mal exécutée peut dévaloriser un design plus que l'absence totale d'ombre.
Pourquoi ça doit être sur votre radar
Comprendre box-shadow est incontournable pour quiconque touche au code front-end ou au design. C'est l'un des outils les plus puissants de l'arsenal CSS pour créer des interfaces modernes et intuitives.
- Ça crée de la hiérarchie : Les ombres disent à notre cerveau ce qui est important. Un élément avec une ombre plus proéminente semble « plus proche » de nous et donc plus significatif. C'est fondamental pour guider l'attention d'un utilisateur à travers une interface complexe, d'une boîte de dialogue modale qui apparaît par-dessus la page à un bouton d'appel à l'action principal.
- Ça définit les frontières en douceur : Avant
box-shadow, on utilisaitborder: 1px solid grey;pour séparer les éléments. Les ombres nous permettent de créer cette même séparation d'une manière beaucoup plus douce et organique. Une ombre subtile entre une barre latérale et le contenu principal est plus agréable qu'une ligne dure. - Ça construit des interfaces tactiles : Des ombres bien conçues, tant
outsetqueinset, peuvent donner à une interface numérique une sensation tangible. Elles donnent aux boutons l'impression d'être cliquables et aux champs de saisie l'impression d'être remplissables. Ce n'est pas seulement de la décoration ; c'est une partie fonctionnelle de l'ergonomie.
Maîtriser box-shadow — en particulier l'art de la superposition et de la subtilité — est un marqueur clair qui distingue un développeur qui se contente de faire en sorte que ça marche d'un autre qui fait en sorte que ça marche et que ce soit beau.
Pour aller plus loin
- MDN Web Docs :
box-shadow: La référence ultime au quotidien. Complète, avec des exemples interactifs. - W3C Spec: CSS Backgrounds and Borders Module Level 3 : La spécification officielle. C'est la source de vérité que les fabricants de navigateurs implémentent. C'est dense, mais c'est là que les règles sont écrites.
- Designing Beautiful Shadows in CSS par Josh W. Comeau : Un article fantastique et approfondi qui plonge dans l'art et la science de la création d'ombres magnifiques, réalistes et superposées.
- Smashing Magazine: A New Way To Create “Glassmorphism” : Un exemple de la façon dont
box-shadowpeut être combiné avec d'autres propriétés CSS (commebackdrop-filter) pour créer des effets de design complexes et modernes.