Flouter un élément
filter: blur() prend une longueur, le rayon du flou. Plus il est grand, plus l'élément est flou :
filter fonctionne sur n'importe quel élément, pas seulement les images : une div floutée floute aussi son texte, sa bordure et ses enfants. Remarquez les bords doux des images floutées : le flou étale l'image vers l'extérieur et la mélange avec la zone transparente qui l'entoure. La solution se trouve plus bas, dans « Le problème des bords flous ».
Flouter le fond : backdrop-filter
Pour flouter ce qui se trouve derrière un élément (un panneau en verre dépoli sur une photo ou une page), utilisez backdrop-filter. Le contenu de l'élément reste net. Il faut un fond transparent pour voir le flou :
Les rayures et les cercles sont nets autour du panneau et flous derrière lui, tandis que le texte du panneau n'est pas touché. Gardez le texte lisible : une teinte plus claire ou plus foncée dans la couleur de fond aide sur les images chargées.
Toutes les fonctions de filtre, en direct
Déplacez n'importe quel curseur. La ligne sous l'image est la valeur filter exacte, prête à copier :
Seules les fonctions que vous avez éloignées de leur valeur neutre sont écrites, ce qui garde la valeur courte. brightness(1) ou blur(0px) ne changent rien, il n'y a donc aucune raison de les lister.
Les fonctions de filtre
| Fonction | Valeur neutre | Effet | Exemple |
|---|---|---|---|
blur(r) | 0 | flou gaussien de rayon r | blur(4px) |
brightness(n) | 1 | plus sombre sous 1, plus lumineux au-dessus | brightness(0.7) |
contrast(n) | 1 | plus terne sous 1, plus contrasté au-dessus | contrast(1.3) |
grayscale(n) | 0 | 1 (ou 100%) est entièrement gris | grayscale(100%) |
sepia(n) | 0 | ton brun chaud | sepia(0.6) |
saturate(n) | 1 | 0 est gris, au-dessus de 1 plus vif | saturate(1.5) |
hue-rotate(a) | 0deg | décale chaque teinte sur le cercle chromatique | hue-rotate(90deg) |
invert(n) | 0 | 1 donne un négatif complet des couleurs | invert(1) |
opacity(n) | 1 | comme la propriété opacity | opacity(0.5) |
drop-shadow(x y blur color) | une ombre qui suit la forme | drop-shadow(2px 4px 6px rgb(0 0 0 / 0.3)) |
Les nombres peuvent aussi être des pourcentages (grayscale(100%) équivaut à grayscale(1)). Plusieurs fonctions se placent dans une seule valeur, séparées par des espaces, et sont appliquées dans l'ordre : filter: grayscale(1) sepia(1) donne une teinte brune, alors que sepia(1) grayscale(1) finit en simple gris.
drop-shadow suit la forme
box-shadow est toujours un rectangle (aux coins arrondis tout au plus). drop-shadow() est dessinée à partir des pixels visibles, si bien qu'une icône transparente reçoit une ombre au contour de l'icône :
La première étoile projette une ombre carrée depuis sa boîte invisible. La seconde en projette une en forme d'étoile. Contrairement à box-shadow, drop-shadow() n'a ni valeur de diffusion ni inset ; la page box-shadow traite de ces options.
Le problème des bords flous
Une image floutée s'estompe sur ses bords, car le flou y attire les pixels transparents qui l'entourent. Pour garder un bord net (pour un fond de bannière flouté, par exemple), placez l'image dans un conteneur en overflow: hidden et agrandissez légèrement l'image pour couper le bord doux :
.hero { overflow: hidden; }
.hero img { filter: blur(8px); transform: scale(1.1); }
Effets de survol avec filter
filter peut être animé par une transition : un mur de logos qui passent du gris à la couleur, ou une carte atténuée jusqu'au survol, tiennent en deux règles :
Survolez une tuile (ou atteignez-la avec Tab) et sa couleur apparaît en fondu.
Bon à savoir
- Performances. Les grands rayons de flou sur de grandes surfaces coûtent le plus, surtout
backdrop-filtersur des éléments qui bougent ou défilent. Testez sur un téléphone. - Lisibilité. Ne floutez jamais un texte que les gens doivent lire, et vérifiez le contraste du texte sur un panneau en verre dépoli.
- Empilement. Tout
filterautre quenonecrée un nouveau contexte d'empilement et devient le bloc conteneur des descendants enposition: fixed, commetransform.
Erreurs courantes
filter: blur(5). Le rayon demande une unité :blur(5px).- Utiliser
filter: blur()pour un panneau en verre dépoli. Cela floute le texte du panneau lui-même. Utilisezbackdrop-filteravec un fond transparent. - Un backdrop-filter qui n'affiche rien. Le fond de l'élément doit être au moins partiellement transparent, et il doit y avoir quelque chose derrière.
- Deux déclarations
filter. La seconde remplace la première. Mettez toutes les fonctions dans une seule valeur. - Des ombres rectangulaires sur des icônes transparentes. Utilisez
filter: drop-shadow()au lieu debox-shadow.
Questions fréquentes
Comment flouter un élément en CSS ?
Utilisez filter: blur(5px);. La longueur est le rayon du flou : 0 est net et les valeurs plus grandes sont plus floues. Cela floute l'élément et tout ce qu'il contient, texte et images compris.
Comment flouter le fond derrière un élément ?
Utilisez backdrop-filter: blur(10px); sur l'élément, avec un fond partiellement transparent comme rgb(255 255 255 / 0.5). Le contenu de l'élément reste net et ce qui se trouve derrière est flouté : c'est l'effet verre dépoli.
Quelle est la différence entre drop-shadow() et box-shadow ?
box-shadow suit toujours la boîte rectangulaire de l'élément. filter: drop-shadow() suit la forme visible, y compris les zones transparentes d'un PNG ou d'un SVG, si bien que l'ombre d'une icône a le contour de l'icône.
Comment mettre une image en noir et blanc en CSS ?
Utilisez filter: grayscale(100%); (ou grayscale(1)). Ajoutez une transition et filter: grayscale(0) au survol pour faire revenir la couleur.
Peut-on utiliser plusieurs filtres à la fois ?
Oui, listez-les séparés par des espaces : filter: grayscale(1) brightness(1.2) blur(1px);. Ils sont appliqués dans l'ordre, donc l'ordre peut changer le résultat. Une seconde déclaration filter remplace la première.