<!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 - Zoom d'images avec 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="zoom_image" />
    <meta name="DC.Creator" content="Pascale Lambert" />
    <meta name="DC.Date.created" scheme="W3CDTF" content="2004-06-01" />
    <meta name="DC.Date.modified" scheme="W3CDTF" content="2004-06-01" />
    <meta name="DC.Subject" content="debutant, mise_en_page, multimedia, css" />
  </head>
  <body>
    <h1>Zoom d'images avec les CSS</h1>
    <ul>
      <li>
        <strong>Profil :</strong> <a href="/debutant/">Débutant</a>
      </li>
      <li>
        <strong>Thème :</strong> <a href="/mise_en_page/">Mise en page</a>, <a href="/multimedia/">Multimédia</a>
      </li>
      <li>
        <strong>Technologie :</strong> <a href="/css/">CSS</a>
      </li>
      <li>
        <strong>Auteur :</strong> <a href="mailto:pascale.lambert%40openweb.eu.org">Pascale Lambert</a>
      </li>
      <li>
        <strong>Mise à jour :</strong> 01/06/2004</li>
    </ul>
    <h2>En bref</h2>
    <p>Parmi les multiples techniques permettant de zoomer une image à l'écran, voici celle qui, uniquement à l'aide de CSS2, permet un zoom au survol d'une image avec la souris.</p>
    <hr />
    <h3>Première technique</h3>
    <p>Zoomer une image, à l'aide des <a href="http://www.yoyodesign.org/doc/w3c/css2/cover.html#minitoc">
        <acronym title="Cascading Style Sheets" lang="en">CSS</acronym>2</a>, lors de son survol de la souris peut se faire très facilement. Il suffit de combiner la valeur <code>:hover</code> à la balise <code>img</code> (image).</p>
    <h4>Code <acronym>(X)HTML</acronym>
    </h4>
    <p>L'image est déclarée dans le code <acronym title="HyperText Markup Language" lang="en">HTML</acronym> sans valeurs de tailles (ni <code>width</code>, ni <code>height</code>) :</p>
    <pre>&lt;div class="zoom"&gt;
    &lt;p&gt;
        &lt;img src="machaon.jpg"
         alt="photo d'un papillon machaon butinant une fleur" /&gt;
    &lt;/p&gt;
&lt;/div&gt;</pre>
    <h4>Code <acronym>CSS</acronym>
    </h4>
    <p>Pour éviter tout saut ou recouvrement du texte sous-jacent lors du zoom, on peut déclarer cette image dans un cadre (ici appelé <code>zoom</code>) de hauteur égale à la photo zoomée (ici 400px). Ce cadre permettra aussi de limiter l'effet grossissant à cette seule image.</p>
    <p>Les valeurs de tailles sont déclarées au sein de la feuille de style tout d'abord dans son état initial (<code>img</code>), puis dans son état survolé (<code>img:hover</code>). Ici, les tailles de l'image passeront de 300x225 pixels à 400x300 pixels</p>
    <pre>.zoom {
height:400px;
margin:auto;
}
.zoom p {
text-align:center;
}
.zoom img {
width:300px;
height:225px;
}
.zoom img:hover {
width:400px;
height:300px;
}</pre>
    <h4>Résultat</h4>
    <p>
      <a href="annexes/#technique1">Testez le résultat dans votre navigateur</a>.</p>
    <p><img src="annexes/capt1_1.jpg" alt="image par défaut" /></p>
    <p>Au survol :</p>
    <p><img src="annexes/capt1_2.jpg" alt="image zoomée" /></p>
    <p>Hélas cette technique simplissime ne fonctionne pas avec <acronym title="MicroSoft Internet Explorer" lang="en">MSIE</acronym> car celui-ci ne supporte la règle <code>:hover</code> que pour les éléments liens.</p>
    <h3>Seconde technique</h3>
    <p>Pour avoir un effet similaire avec <acronym>MSIE</acronym>, il va donc falloir tricher en lui faisant croire que l'image est un lien.</p>
    <p>Cette fois elle ne sera plus déclarée dans la page <acronym>HTML</acronym> mais uniquement dans la feuille de style en fond d'écran (<code>background</code>). De plus, il faudra au préalable modifier l'image pour y faire figurer, l'une en dessous de l'autre, l'image initiale et l'image à apparaître lors du zoom.</p>
    <p>Cette méthode a trois inconvénients :</p>
    <ol>
      <li>l'image sera plus lourde, donc plus longue à charger ;</li>
      <li>l'image n'étant plus insérée à l'aide de l'élément <code>img</code>, il n'est plus possible d'en donner un équivalent textuel via l'attribut <code>"alt"</code>. Cet équivalent (description de l'image) doit donc figurer en clair dans le contenu de la page afin que celle-ci respecte les règles d'accessibilité ;</li>
      <li>en cas d'impression, la photo n'apparaîtra pas si l'internaute a configuré la non-impression des fonds d'écran.</li>
    </ol>
    <h4>Code <acronym>(X)HTML</acronym>
    </h4>
    <pre>&lt;div class="zoom1"&gt;
    &lt;p&gt;
        &lt;a href="#"
         title="photo d'un papillon machaon butinant une fleur"&gt;
         &lt;/a&gt;
    &lt;/p&gt;
&lt;/div&gt;</pre>
    <h4>Image et code <acronym>CSS</acronym>
    </h4>
    <p>L'image <a href="annexes/machaon1.jpg">machaon1.jpg</a> a donc été créée avec un logiciel de traitement d'images. Elle a une taille finale de 400x600 pixels pour un poids de 45 ko.</p>
    <p>Toute l'astuce va être de faire apparaître les morceaux choisis de cette image : la partie haute par défaut (400x300 pixels) puis la partie basse (400x300 pixels aussi) au survol de la souris. Cette dernière devant « remonter » de 300 pixels vers le haut, on indiquera pour la position de fond de page <code>background-position:0px -300px</code> ; le <code>0</code> étant relatif à la position horizontale et le <code>-300px</code> à la position verticale.</p>
    <p>Ne pas oublier surtout le très important <code>display:block</code> qui permet ici le « remplacement » de la première portion d'image par la seconde.</p>
    <pre>.zoom1 {
 width: 400px;
 height: 300px;
 background-image: url(machaon1.jpg);
 background-repeat: no-repeat;
 margin: 0 auto;
}
.zoom1 p, .zoom1 a {
height: 300px; 
display: block;
margin:0
}

.zoom1 a:hover {
background-image: url(machaon1.jpg);
background-position: 0px -300px;
background-repeat:no-repeat;
cursor:help;
}</pre>
    <h5>Astuces</h5>
    <p>
      <code>margin:0 auto</code> déclaré dans <code>.zoom1</code> permet de centrer horizontalement l'image dans la page. (Attention : <acronym>MSIE</acronym> ne l'implémente pas.)</p>
    <p>
      <code>cursor:help</code> déclaré dans <code>zoom1_1 a:hover</code> permet de changer l'apparence du curseur lors du survol de l'image. D'autres valeurs, comme <code>cursor, crosshair, default</code> sont aussi disponibles.</p>
    <h4>Résultat</h4>
    <p>
      <a href="annexes/#technique2">Testez le résultat dans votre navigateur</a>.</p>
    <p><img src="annexes/capt2_1.jpg" alt="image par défaut" /></p>
    <p>Au survol :</p>
    <p><img src="annexes/capt2_2.jpg" alt="image zoomée" /></p>
    <h4>Variante</h4>
    <p>On peut choisir évidemment de garder les mêmes dimensions d'images pour ne zoomer qu'une partie.</p>
    <p>Pour cette variante, j'ai choisi de zoomer la partie colorée de l'aile du papillon. L'image (<a href="annexes/machaon2.jpg">machaon2.jpg</a>) a une taille de 300x450 pixels pour un poids de 31 ko. Cette fois, la « remontée » de l'image ne doit être que de 225 pixels.</p>
    <h5>Code <acronym>CSS</acronym>
    </h5>
    <p>Avec le même code <acronym title="(eXtensible) HyperText Markup Language" lang="en">(X)HTML</acronym> que ci-dessus, le code <acronym>CSS</acronym> devient :</p>
    <pre>.zoom1 {
 width: 300px;
 height: 225px;
 background: url(machaon2.jpg);
 background-repeat:no-repeat;
 margin: 0 auto; 
}
.zoom1 p, .zoom1 a {
height: 225px;
display: block;
margin:0 auto;
}
.zoom1 a:hover {
background-image: url(machaon2.jpg);
background-position: 0px -225px;
background-repeat: no-repeat;
cursor:help;
}</pre>
    <p>
      <a href="annexes/#technique3">Testez le résultat dans votre navigateur</a>.</p>
    <p>Par défaut :</p>
    <p><img src="annexes/capt3_1.jpg" alt="image par défaut" /></p>
    <p>Au survol :</p>
    <p><img src="annexes/capt3_2.jpg" alt="image zoomée" /></p>
    <h3>Compléments d'informations</h3>
    <p>Cette technique d'images « glissantes » appliquée au zoom est inspirée de l'article <a href="http://pompage.net/pompe/portescoulissantes2/">Les Portes Coulissantes de CSS - Chapitre II</a>.
Elle peut être aussi appliquée à des pseudo-découpes d'images, comme le décrit très bien cet autre article : <a href="http://pompage.net/pompe/sprites/">Sprites CSS :  Meurs, découpe d'images, meurs !</a>. (Traductions réalisées par l'équipe de <a href="http://pompage.net/">pompage.net</a>.)</p>
    <p>Photos 2004 - Pascale Lambert-Charreteur.</p>
  </body>
</html>
