<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  <head>
    <title>Openweb.eu.org - Utilisation des images dans les CSS</title>
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
    <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" />
    <meta name="DC.Language" scheme="RFC3066" content="fr" />
    <meta name="DC.Identifier" content="images_css" />
    <meta name="DC.Creator" content="Sébastien Desvignes" />
    <meta name="DC.Date.created" scheme="W3CDTF" content="2003-04-21" />
    <meta name="DC.Date.modified" scheme="W3CDTF" content="2003-04-21" />
    <meta name="DC.Rights" content="Cet article est sous licence Creative Commons Attribution-ShareAlike." />
    <meta name="DC.Subject" content="expert, gourou, mise_en_page, css" />
  </head>
  <body>
    <h1>Utilisation des images dans les CSS</h1>
    <ul>
      <li>
        <strong>Profil :</strong> <a href="/expert/">Expert</a>, <a href="/gourou/">Gourou</a>
      </li>
      <li>
        <strong>Thème :</strong> <a href="/mise_en_page/">Mise en page</a>
      </li>
      <li>
        <strong>Technologie :</strong> <a href="/css/">CSS</a>
      </li>
      <li>
        <strong>Auteur :</strong> Sébastien Desvignes</li>
      <li>
        <strong>Mise à jour :</strong> 21/04/2003</li>
    </ul>
    <h2>En bref</h2>
    <p>Comment utiliser une feuille de style pour insérer dans le contenu <acronym title="HyperText Markup Language" lang="en">HTML</acronym> des images décoratives.</p>
    <hr />
    <p>Les techniques modernes de publication Web reposent désormais sur la séparation du fond de la forme. Le fond est pris en charge par le <a href="http://www.w3.org/MarkUp/">langage <acronym>HTML</acronym>
      </a>, et la forme par le <a href="http://www.w3.org/Style/CSS/">langage <acronym title="Cascading Style Sheets" lang="en">CSS</acronym>
      </a>. Un des points parfois délicats est l'utilisation d'images qui font logiquement partie de la forme et non du fond, dans un but purement esthétique. Nous allons voir dans cet article plusieurs méthodes permettant d'intégrer ces images dans un document <acronym>HTML</acronym> uniquement par le biais des <acronym>CSS</acronym>.</p>
    <h3>Quand utiliser les <acronym>CSS</acronym> pour les images ?</h3>
    <p>Beaucoup d'images sont utilisées dans le but unique d'embellir les pages <acronym>HTML</acronym>. Ces images n'apportent rien au contenu, et en toute logique ne devrait pas être présentes dans la partie <acronym>HTML</acronym> de la page. De plus, si l'on souhaite changer l'apparence de la page, il est plus pratique de n'avoir que le fichier <acronym>CSS</acronym> à changer, plutôt que de devoir parcourir le ou les fichiers <acronym>HTML</acronym> à la recherche des images de présentation.</p>
    <p>Mais attention : les images insérées par <acronym>CSS</acronym> sont complètement absentes du contenu, et donc inaccessibles pour les navigateurs non-graphiques. Elles ne peuvent pas être dotées d'attribut <code>alt</code> et ne peuvent donc pas avoir d'équivalent texte. Les images <acronym>CSS</acronym> ne doivent donc pas remplacer des images significatives, propres au contenu.</p>
    <h3>Les images de fond</h3>
    <p>La première méthode pour ajouter des images en utilisant les <acronym>CSS</acronym> est d'utiliser les images de fond. Outre l'utilisation classique qui consiste essentiellement à fournir un fond de page, les <acronym>CSS</acronym> permettent d'atteindre des effets plus qu'intéressants.</p>
    <h4>Remplacement d'un élément <code>img</code> isolé</h4>
    <p>En utilisant un élément <code>div</code> vide, on peut aisément remplacer une image purement décorative par une image de fond. Le principe consiste simplement à dimensionner le <code>div</code> à la même taille que l'image cible, et à lui appliquer l'image à remplacer comme image de fond. Un petit raffinement est de supprimer la répétition de l'image pour éviter des effets disgracieux sur les bords.</p>
    <p>Compatibilités :</p>
    <ul>
      <li>
        <acronym title="MicroSoft Internet Explorer" lang="en">MSIE</acronym> Windows : ne pas oublier les différences de calcul de la taille des éléments entre le modèle de boîtes <acronym>MSIE</acronym> et le modèle standard lors de la détermination des dimensions du <code>div</code>. A ce sujet, voir <a href="/articles/dimensions_boites_css/">Gérer les modèles de boîtes <acronym>CSS</acronym> standard et Microsoft</a> ;</li>
      <li>
        <acronym>MSIE</acronym> Mac, Gecko (Mozilla &amp; Netscape 6+), Opera 7.0, Konqueror 3.1.0 : support parfait.</li>
    </ul>
    <p>Code <acronym>HTML</acronym> :</p>
    <pre>
&lt;div id="avatar"&gt;&amp;nbsp;&lt;/div&gt;
    </pre>
    <p>Feuille de style :</p>
    <pre>
div#avatar {
  background-image: url(avatar-p.png);
  background-repeat: no-repeat;
  width: 80px;
  height: 103px;
  padding: 0;
}
      </pre>
    <p>Le résultat est similaire à l'illustration suivante :</p>
    <div><img src="annexes/ex1.png" alt="Un portrait en arrière-plan d'un cadre" /></div>
    <p>Tester le résultat dans votre navigateur : <a href="annexes/#ex1">exemple 1 (remplacement d'un élément <acronym>img</acronym> isolé)</a>.</p>
    <h4>Création d'une bordure stylée</h4>
    <p>L'objectif ici est de créer une bordure stylée. Pour cela, nous allons utiliser une image de fond que l'on va répéter uniquement dans une direction grâce à <code>background-repeat</code>. On va la positionner à l'aide de la propriété <code>background-position</code>, et on joue un peu sur les marges intérieures pour 
bien séparer la bordure du reste. Le tour est joué !</p>
    <p>Malheureusement, pour mettre des bordures de chaque côté, il faut imbriquer plusieurs éléments <code>div</code>, ce qui n'est pas forcément idéal comme solution (mais c'est la seule en <acronym>CSS</acronym>2).</p>
    <p>Compatibilités :</p>
    <ul>
      <li>
        <acronym>MSIE</acronym> Windows, <acronym>MSIE</acronym> Mac, Gecko (Mozilla &amp; Netscape 6+), Opera 7.0, Konqueror 3.1.0 : support parfait.</li>
    </ul>
    <p>Code <acronym>HTML</acronym> :</p>
    <pre>
&lt;div class="bordure-top"&gt;
  &lt;div class="bordure-bottom"&gt;
    Texte d'exemple.
    &lt;/div&gt;
&lt;/div&gt;
      </pre>
    <p>Feuille de style :</p>
    <pre>
div.bordure-top {
  padding-top: 15px;
  border-left: 1px solid;
  border-right: 1px solid;
  background-image: url(borderh.gif);
  background-position: top;
  background-repeat: repeat-x;
}
div.bordure-bottom {
  padding: 0px 7px 15px 7px;
  background-image: url(borderh.gif);
  background-position: bottom;
  background-repeat: repeat-x;
}
      </pre>
    <p>Le résultat est similaire à l'illustration suivante :</p>
    <div><img src="annexes/ex2.png" alt="Une bordure graphique marron avant et après le texte" /></div>
    <p>Tester le résultat dans votre navigateur : <a href="annexes/#ex2">exemple 2 (création d'une bordure stylée)</a>.</p>
    <h4>Ajout d'une icône pour une classe (1)</h4>
    <p>Il arrive très souvent que l'on veuille ajouter une icône spécifique à une série d'éléments similaires. En particulier, on voit régulièrement sur certains sites des icônes jouxtant les liens pour signifier que le lien est extérieur au site. Il existe plusieurs moyens d'obtenir cet effet via les <acronym>CSS</acronym>, et nous allons étudier ici la solution utilisant les images de fond. L'avantage des <acronym>CSS</acronym> dans cette situation est énorme, il permet d'éliminer tous les éléments <code>img</code> de ce genre qui obscurcissent le code.</p>
    <p>Compatibilités :</p>
    <ul>
      <li>
        <acronym>MSIE</acronym> Windows 5.0 : la propriété <code>padding</code> n'est pas appliquée aux éléments de type inline, ce qui fait que le texte peut recouvrir l'îcone ;</li>
      <li>
        <acronym>MSIE</acronym> Windows 5.5 - 6.0 : si l'élément est de type inline et qu'il est réparti sur plusieurs lignes, alors l'image est mal positionnée ;</li>
      <li>Konqueror 3.1.0 : l'icône se répète en fond ;</li>
      <li>
        <acronym>MSIE</acronym> Mac, Gecko (Mozilla &amp; Netscape 6+), Opera 7.0 : support parfait.</li>
    </ul>
    <p>Code <acronym>HTML</acronym> :</p>
    <pre>
Texte d'exemple 
&lt;a href="http://www.w3.org/" class="extern"&gt;Lien d'exemple&lt;/a&gt; 
Texte d'exemple
      </pre>
    <p>Feuille de style :</p>
    <pre>
a.extern {
  background-image: url(extern.png);
  background-repeat: no-repeat;
  background-position: center right;
  padding-right: 18px;
}
      </pre>
    <p>Le résultat est similaire à l'illustration suivante :</p>
    <div><img src="annexes/ex3.png" alt="Un lien suivi d'une image de flèche" /></div>
    <p>Tester le résultat dans votre navigateur : <a href="annexes/#ex3">exemple 3 (ajout d'une icône pour une classe)</a>.</p>
    <h3>Le contenu généré</h3>
    <p>Le contenu généré est une technique permettant d'ajouter du contenu avant ou après un élément en utilisant les <acronym>CSS</acronym> (<acronym>MSIE</acronym> Windows ne supporte pas cette propriété).</p>
    <h4>Ajout d'une icône pour une classe (2)</h4>
    <p>C'est finalement l'utilisation la plus logique pour cette technique. Elle a l'avantage de garder la propriété <code>background-image</code> libre pour d'autres utilisations, mais comme je l'ai dit précédemment, elle n'est pas aussi universellement suportée que les images de fond. Le principe est relativement simple, il utilise les pseudo-éléments <code>:before</code> et <code>:after</code>. Ces pseudo-éléments sont justement conçus pour permettre l'ajout de contenu par <acronym>CSS</acronym> via la propriété <code>content</code>. Une petite remarque au passage, cette propriété n'est pas limitée à un seul contenu ; vous pouvez donc enchaîner ainsi du texte et des images.</p>
    <p>Compatibilités :</p>
    <ul>
      <li>
        <acronym>MSIE</acronym> Windows, <acronym>MSIE</acronym> Mac : le contenu généré n'est pas supporté ;</li>
      <li>Konqueror 3.1.0 : la propriété <code>content</code> est supportée dans la plupart des cas simple, mais peut poser des problèmes si on veut utiliser plusieurs contenus générés dans la même balise ;</li>
      <li>Gecko (Mozilla &amp; Netscape 6+), Opera 7.0 : support parfait.</li>
    </ul>
    <p>Code <acronym>HTML</acronym> :</p>
    <pre>
Texte d'exemple. 
&lt;a href="http://www.w3.org/"
class="extern2"&gt;Lien d'exemple&lt;/a&gt; 
Texte d'exemple
      </pre>
    <p>Feuille de style :</p>
    <pre>
a.extern2:after {
  content: ' *' url(extern.png);
}
      </pre>
    <p>Le résultat est similaire à l'illustration suivante :</p>
    <div><img src="annexes/ex4.png" alt="Un lien suivi d'une astérisque et d'une image de flèche" /></div>
    <p>Tester le résultat dans votre navigateur : <a href="annexes/#ex4">exemple 4 (ajout d'une icône pour une classe)</a>.</p>
    <h3>Les puces graphiques</h3>
    <p>Les puces des listes à puces peuvent aisément être remplacées par des images personnalisées. Mais
en approfondissant un peu, on peut aller plus loin que l'utilisation ordinaire.</p>
    <h4>Personnalisation d'une puce particulière dans une liste à puces</h4>
    <p>Pour personnaliser un peu plus certains éléments d'une liste, il peut être souhaitable de changer la puce associée. Un cas d'utilisation courant est la mise en valeur d'un élément particulier de la liste, mais on peut imaginer aussi des cas de représentation arborescente plus complexes où chaque élément dispose de sa puce individualisée. Pour bien comprendre le mécanisme impliqué, il faut assimiler le fait qu'habituellement, la propriété <code>list-style</code> définissant l'aspect d'une puce est positionnée au niveau de la liste, et non au niveau de l'élément de la liste. Les éléments de la liste héritent alors de cette propriété. Cela permet de simplifier les feuilles de style, mais inutile de rentrer trop dans les détails, car la conclusion, c'est que la propriété <code>list-style</code> n'a de sens que pour les éléments de liste et non pour la liste elle même. Nous pouvons donc styler un élément de la liste en particulier.</p>
    <p>Compatibilités :</p>
    <ul>
      <li>
        <acronym>MSIE</acronym> Windows, <acronym>MSIE</acronym> Mac, Gecko (Mozilla &amp; Netscape 6+), Opera 7.0, Konqueror 3.1.0 : support parfait.</li>
    </ul>
    <p>Code <acronym>HTML</acronym> :</p>
    <pre>
&lt;ul class="puces"&gt;
  &lt;li&gt;Article 1 bleu&lt;/li&gt;
  &lt;li&gt;Article 2 bleu&lt;/li&gt;
  &lt;li id="puce-rouge"&gt;Article 3 rouge&lt;/li&gt;
  &lt;li&gt;Article 4 bleu&lt;/li&gt;
&lt;/ul&gt;
      </pre>
    <p>Feuille de style :</p>
    <pre>
ul.puces {
  list-style-image: url(dot.png);
}
li#puce-rouge {
  list-style-image: url(dot-rouge.png);
}
      </pre>
    <p>Le résultat est similaire à l'illustration suivante :</p>
    <div><img src="annexes/ex5.png" alt="4 items de listes précédés chacun d'un boulet bleu. Le troisième a un boulet rouge." /></div>
    <p>Tester le résultat dans votre navigateur : <a href="annexes/#ex5">exemple 5 (personnalisation d'une puce particulière dans une liste à puces)</a>.</p>
    <h4>Ajout d'une puce à un titre</h4>
    <p>Pour embellir les titres d'un document, on peut souhaiter leur ajouter une puce. Pour cela nous pouvons bien sûr utiliser les techniques vues précédemment, mais il existe une autre méthode plus appropriée à ce genre d'élément. Sémantiquement, un titre est proche d'un élément de liste. Une fois rassemblés dans une table des matières, les titres deviennent d'ailleurs concrètement des éléments de liste. Nous allons donc donner aux titres l'aspect d'un élément de liste à puce, et nous pourrons ensuite le styler en conséquence. Pour changer l'aspect d'un élément, il faut utiliser la propriété <code>display</code>, et pour lui donner l'aspect d'un élément de liste à puce, il faut mettre la valeur <code>list-item</code>. Ensuite, il suffit de changer les propriétés classiques de style des listes pour obtenir l'effet désiré.</p>
    <p>Compatibilités :</p>
    <ul>
      <li>
        <acronym>MSIE</acronym> Windows 5.0 - 5.5 : la propriété <code>display: list-item</code> n'est pas supportée ;</li>
      <li>
        <acronym>MSIE</acronym> Windows 6.0, <acronym>MSIE</acronym> Mac, Gecko (Mozilla &amp; Netscape 6+), Opera 7.0, Konqueror 3.1.0 : support parfait.</li>
    </ul>
    <p>Code <acronym>HTML</acronym> :</p>
    <pre>
&lt;h5 class="puces"&gt;Titre d'exemple&lt;/h5&gt;
&lt;p&gt;Paragraphe d'exemple.&lt;/p&gt;
      </pre>
    <p>Feuille de style :</p>
    <pre>
h5.puces {
  display: list-item;
  list-style-image: url(dot.png);
  list-style-position: inside;
}
      </pre>
    <p>Le résultat est similaire à l'illustration suivante :</p>
    <div><img src="annexes/ex6.png" alt="Un titre précédé d'un boulet bleu" /></div>
    <p>Tester le résultat dans votre navigateur : <a href="annexes/#ex6">exemple 6 (ajout d'une puce à un titre)</a>.</p>
  </body>
</html>
