Trucs et Astuces CSS
Chapitre 1 : Généralités sur les éléments

Retour Accueil CSS

12 Ombres bizarres

Termes CSS clés employés : border-radius, ::before, ::after,
transform:rotate, box-shadow, radial-gradient, linear-gradient.
Compatibilité navigateurs : IE10+, Firefox16.0+, Chrome et Safari
avec préfixe, Opera16+.

Problèmatique

Créer des ombres plus sophistiquées que ce qui peut être obtenu simplement avec la propriété box-shadow.

Résolution théorique

Une ombre box-shadow suit obligatoirement la forme de l’élément qui la créée. Pour obtenir d’autres formes, il faut tricher avec un élément ::before et ou ::after, auquel il est possible de donner la forme et la position de son choix. Nous allons ici raisonner sur des boutons, mais cela est applicable à tout élément.

Résolution pratique

Le code HTML est simpliste : il suffit d’un élément quelconque, ici DIV, auquel on attribue une classe particulière.
<div class="bloc">texte<div>
Le code CSS commence par définir l’élément de base : il s’agit essentiellement ici de code « décoratif », sans importance réelle quand au but recherché.
.bloc { position: relative; display: inline-block; margin-left:25%; margin-top:10px; padding: 25px; width: 220px; height: 80px; background: rgb(250, 250, 250); line-height: 15px; text-align: center; border-radius:15px; border: 1px solid black; background-image: linear-gradient(center bottom, white 11%, grey 56%); box-shadow: 0 0 65px grey inset, 0 0 20px white inset; }

Bloc de base
>

Nous commençons par définir les caractéristiques par défaut d’éléments ::before et ::after pour notre élément principal. Par défaut, ils ne sont pas affichés, et leur position z-index est fixée à –1 pour s’assurer qu’ils soient sous l’élément principal.
.bloc::after, .bloc::before { display:none; content: " "; position: absolute; z-index: -1; }
Passons ensuite au premier cas : nous voulons ici deux bordures latérales cintrées, à droite et à gauche de l’élément principal (ici de classe bloc lateraux). Cela va être obtenu à l’aide d’un unique élément ::before. Commençons par afficher l’élément (il était masqué par défaut). Nous lui appliquons une bordure elliptique grâce à border-radius, et une ombre portée avec box-shadow. L’élément étant légèrement plus large et moins haut que l’élément principal, et positionné de façon à être centré (cela dépend des dimensions de l’élément de base), nous ne verrons donc que ses côtés.
.lateraux::before { display:inline-block; top: 8px; left: -2px; width: 102%; height: 98%x; background-color:black; border-radius: 12px / 65px; box-shadow: 0 0 10px black; }

Ombres latérales courbes

Pour obtenir des bordures haute et basse cintrées, le principe est analogue : un unique élément ::before, avec une bordure elliptique grâce à border-radius, et une ombre portée avec box-shadow. L’élément étant ici légèrement moins large et plus haut que l’élément principal, et positionné de façon à être centré (cela dépend des dimensions de l’élément de base), nous ne verrons donc que son haut et son bas.
.horizontales::before { display:inline-block; top: -2%; left: 1%; width: 98%; height: 104%; background-color:black; border-radius: 125px / 12px; box-shadow: 0 0 8px black; }

Ombres horizontales courbes

Remarquez qu’en jouant sur les dimensions, vous pourriez obtenir une ombre cintrée uniquement d’un côté, et même lui donner une forme plus irrégulière à l’aide d’une légère rotation. Par exemple, pour obtenir une unique ombre en biseau en bas à gauche, le processus est similaire, mais nous appliquons une rotation à un élément à coins droits de façon à n’en laisser dépasser qu’une fraction :
.biseau::before { display:inline-block; top: 112px; left: -2%; width: 95%; height:10%; transform: rotate(-3deg); box-shadow: 12px 8px 10px black; }

Ombre horizontale en biseau

Un effet intéressant peut être obtenu en doublant ce biseau, à l’aide d’un élément complémentaire ::after, aux caractéristiques inversées :
.biseau2::after { display:inline-block; top: 112px; right: -2%; width: 95%; height:10%; transform: rotate(3deg); box-shadow: -12px 8px 10px black; }

Ombre horizontale en chevron

Enfin, il est possible de créer l’illusion d’un reflet, à l’aide d’un unique élément :
.reflet::before { display:inline-block; left: -5px; top: 150px; width: 100%; height: 4px; background-image: radial-gradient(black, black 11%, grey 56%, grey); border-radius: 140px / 2px; box-shadow: 0 0 5px #aaa, 0 0 10px #888, 0 0 15px #666; }
Voici les résultats :

Reflet

Retour Accueil CSS

© 1999-2014 Fabrice "Fyndhorn Elder" Lemainque