Niveau : Confirmé

Les ombrages en CSS3

Tutoriel par (Intégrateur du Dimanche, Strasbourg)
Créé le , mis à jour le (789993 lectures)
Tags : css, css3, ombres, text-shadow, box-shadow

Grâce à des propriétés telles que box-shadow, text-shadow et border-colors, les feuilles de style offrent la possibilité de créer des ombrages sur les différents éléments de votre page sans nécessiter d'image décorative et de découpes intempestives.
Tout n'est pas rose puisque certains navigateurs à la traîne ne reconnaissent pas encore ces différentes propriétés et nécessitent des adaptations personnalisées. Faisons le tour du propriétaire...

Box-shadow

La propriété CSS box-shadow a été incluse dans le module "borders" de CSS3 et permet de générer une ombre portée sur n'importe quel élément HTML.

Parmi les différentes valeurs utilisables, il est possible d'indiquer le décalage vertical et horizontal ainsi que la force du dégradé. Sans oublier la couleur, bien-entendu. La propriété s'applique sur la boîte de l'élément, et non sur sa bordure. L'ombrage n'affecte pas la taille de la boîte de l'élément.

En voici une illustration (Voir le résultat sur votre navigateur) :
Illustration de box-shadow

img {
  box-shadow: 8px 8px 0px #aaa; 
}

Syntaxe

  • La première valeur indique le décalage horizontal vers la droite (ici 8px)
  • le deuxième correspond au décalage vertical vers le bas (ici 8px)
  • le chiffre suivant indique la force du dégradé (ici 0px)
  • et enfin, la couleur (ici #aaa)

Compatibilité et utilisation concrète
Seuls les navigateurs modernes, reconnaissent la propriété box-shadow. Il s'agit d'Internet Explorer 9+, Firefox 4+, Chrome 10+, Safari 5.1+, Opera 10.5+, Opera Mobile 11+.
La propriété doit être préfixée sur des versions antérieures par -moz- pour Firefox <4, ou -webkit- pour Chrome <10, Safari <5.1 et Android ainsi que Safari Mobile <5.0, pour fonctionner sur les premières versions de ces navigateurs à avoir accepté les ombrages, ce qui devient donc -moz-box-shadow et -webkit-box-shadow.
Par souci de clarté, l'article se passe de ces préfixes. Les exemples construits utilisent naturellement ces préfixes pour fonctionner et anticiper une implémentation complète sur tous les navigateurs dans le futur.

Voici une illustration d'ombre portée dégradée (Voir le résultat sur votre navigateur) :
Illustration de box-shadow

img {
  box-shadow: 8px 8px 12px #aaa;
}

Et voici enfin une variante sous forme de "halo" dégradé (Voir le résultat sur votre navigateur) :
Illustration de box-shadow

img {
  box-shadow: 1px 1px 12px #555;
}

Adaptation pour Internet Explorer <9

Le filtre Shadow

Internet Explorer, jusqu'à la version IE8 incluse, ne reconnaît pas la propriété box-shadow.

Cependant, tout comme pour la transparence de couleur, il existe un filtre propriétaire Microsoft permettant d'obtenir un résultat similaire. Il s'agit du filtre Shadow (cousin du filtre DropShadow).

Il suffit d'appliquer ce filtre à l'élément en indiquant une couleur, une direction (en degrés) et l'intensité du dégradé.

Voici ce que donne une ombre portée "classique" à l'aide du filtre Shadow sur Internet Explorer (Voir le résultat sur votre navigateur) :
filtre Shadow sur IE

img {
  filter:progid:DXImageTransform.Microsoft.Shadow(color='#aaaaaa', Direction=135, Strength=12);
  zoom: 1;
}

Pour éviter de gêner les bons élèves, nous pouvons appliquer cette bidouille uniquement sur Internet Explorer à l'aide d'un commentaire conditionnel.

Au final, les styles CSS devraient ressembler à ceci :

<style type="text/css">   
.ombrage {
  border: 5px solid #fff;
  -moz-box-shadow: 8px 8px 12px #aaa; 
  -webkit-box-shadow: 8px 8px 12px #aaa; 
  box-shadow: 8px 8px 12px #555; 
} 
</style>
    
<!--[if lte IE 8]>
  <style type="text/css">
  .ombrage {
    filter:progid:DXImageTransform.Microsoft.Shadow(color='#aaaaaa', Direction=135, Strength=12);
    zoom: 1;
  } 
  </style>
<![endif]-->

Le filtre Glow

La syntaxe :

filter:progid:DXImageTransform.Microsoft.Glow(Color=#c0c0c0,Strength=8);

L'attribut Color désigne la couleur du halo.
L'attribut Strength désigne la taille de l'effet.

Voici une illustration : (Voir le résultat sur votre navigateur)

ie-glow

Le rendu est loin d'être parfait... mais dans certains (rares?) cas, il peut suffire.

Code utilisé :

<!--[if lte IE 8]>
<style type="text/css">
.ombrage {
  filter:progid:DXImageTransform.Microsoft.Glow(Color=#c0c0c0,Strength=8);
  zoom: 1;
} 
</style>
<![endif]-->

Outil WYSIWYG

Pour vous familiariser avec le concept de box-shadow et pouvoir jouer en direct avec cette propriété et ses effets, sachez qu'il existe un outil WYSIWYG publié chez Westciv.com

Text-shadow

text-shadow est une propriété permettant de produire une ombre portée sur le texte de contenu sur lequel elle est appliquée.

Il est possible de spécifier les décalages de l'ombrage, la couleur et sa zone de flou. Ces effets s'appliquent dans l'ordre spécifié et peuvent ainsi se recouvrir, mais ceux-ci ne recouvriront jamais le texte lui-même. L'ombrage n'affecte pas la taille de la boîte de texte.

Voici une illustration de cette propriété text-shadow en action (Voir le résultat sur votre navigateur) :
Illustration de text-shadow

h1 {
  text-shadow: 0px 0px 9px #777;
  color: #fff;
}

Compatibilité et syntaxe

A l'instar de box-shadow, cette propriété n'est pas reconnue par Internet Explorer (version 8 comprise). Par contre, Opera 9.5+ l'implémente correctement.

Notez également que puisqu'il s'agit d'une propriété finalisée, il n'y a pas lieu de lui affecter un préfixe (-moz-, -webkit-, ...). La propriété demeure text-shadow quel que soit le navigateur.

Adaptation pour Internet Explorer

Là encore, nous allons devoir ruser en appliquant le filtre Shadow à nos éléments, de la même manière que nous l'avons fait précédemment pour adapter la propriété box-shadow.

Le résultat sur Internet Explorer est malheureusement moins excitant que sur les autres navigateurs (Voir le résultat sur votre navigateur) :
Illustration de shadow sur IE

Au final, les styles CSS devraient ressembler à ceci :

.ombrage {
  text-shadow: 2px 2px 4px #999;
} 
</style>
<!--[if lte IE 8]>
<style type="text/css">
.ombrage {
  filter:progid:DXImageTransform.Microsoft.Shadow(color='#999999', Direction=135, Strength=4);
  zoom: 1;
} 
</style>
<![endif]-->

Outil WYSIWYG

Pour vous familiariser avec le concept de text-shadow il existe aussi un outil WYSIWYG publié chez Westciv.com

Border-colors

border-colors est une propriété uniquement reconnue par Mozilla Firefox 3.0+ et qui permet de déclarer plusieurs valeurs de couleurs à appliquer sur la bordure d'un élément.

En voici une illustration (Voir le résultat sur votre navigateur) :
Illustration de border-gradient

.gradient {
  -moz-border-bottom-colors:#897048 #917953 #a18a66 #b6a488 #c5b59b #d4c5ae #e2d6c4 #eae1d2;
  -moz-border-top-colors:  #897048 #917953 #a18a66 #b6a488 #c5b59b #d4c5ae #e2d6c4 #eae1d2;
  -moz-border-left-colors: #897048 #917953 #a18a66 #b6a488 #c5b59b #d4c5ae #e2d6c4 #eae1d2;
  -moz-border-right-colors:#897048 #917953 #a18a66 #b6a488 #c5b59b #d4c5ae #e2d6c4 #eae1d2;
}

Puisque cette propriété n'est pas vraiment répandue, nous n'allons pas entrer dans les détails, mais sachez que vous pouvez l'étudier sur le site ZenElements.com.

Conclusion

Associées aux coins arrondis et aux transparences de couleurs, les propriétés d'ombrage sont très puissantes pour une mise en forme avancée, sans utiliser d'images.

En production, il est nécessaire de prendre quelques précautions d'usage et de se poser des questions préalables : puis-je m'offrir une version dégradée (graceful degradation) sur les navigateurs à la traîne, voire tout simplement les ignorer ? Quel est mon public et ses attentes ? Combien de temps puis-je passer à bidouiller des équivalences sur IE ?... La réponse est uniquement entre vos mains.