<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://openweb.eu.org/dtd/docbkx42/docbookx.dtd">
<article lang="fr" role="article" id="zoom_image">
  <articleinfo>
    <title>Zoom d'images avec les <acronym>CSS</acronym>
    </title>
    <pubdate>2004-06-01</pubdate>
    <date>2004-06-01</date>
    <author>
      <firstname>Pascale</firstname>
      <surname>Lambert</surname>
      <email>pascale.lambert@openweb.eu.org</email>
    </author>
    <abstract>
      <para>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.</para>
    </abstract>
    <subjectset>
      <subject role="profil">
        <subjectterm>debutant</subjectterm>
      </subject>
      <subject role="theme">
        <subjectterm>mise_en_page</subjectterm>
        <subjectterm>multimedia</subjectterm>
      </subject>
      <subject role="technologie">
        <subjectterm>css</subjectterm>
      </subject>
    </subjectset>
  </articleinfo>
  <section id="tech_1">
    <title>Première technique</title>
    <para>Zoomer une image, à l'aide des <ulink url="http://www.yoyodesign.org/doc/w3c/css2/cover.html#minitoc"><acronym>CSS</acronym>2</ulink>, lors de son survol de la souris peut se faire très facilement. Il suffit de combiner la valeur <token>:hover</token> à la balise <sgmltag>img</sgmltag> (image).</para>
    <section>
      <title>Code <acronym>(X)HTML</acronym></title>
      <para>L'image est déclarée dans le code <acronym>HTML</acronym> sans valeurs de tailles (ni <token>width</token>, ni <token>height</token>) :</para>
      <programlisting><![CDATA[<div class="zoom">
    <p>
        <img src="machaon.jpg"
         alt="photo d'un papillon machaon butinant une fleur" />
    </p>
</div>]]></programlisting>
    </section>
    <section>
      <title>Code <acronym>CSS</acronym></title>
      <para>Pour éviter tout saut ou recouvrement du texte sous-jacent lors du zoom, on peut déclarer cette image dans un cadre (ici appelé <token>zoom</token>) de hauteur égale à la photo zoomée (ici 400px). Ce cadre permettra aussi de limiter l'effet grossissant à cette seule image.</para>
      <para>Les valeurs de tailles sont déclarées au sein de la feuille de style tout d'abord dans son état initial (<token>img</token>), puis dans son état survolé (<token>img:hover</token>). Ici, les tailles de l'image passeront de 300x225 pixels à 400x300 pixels</para>
      <programlisting><![CDATA[.zoom {
height:400px;
margin:auto;
}
.zoom p {
text-align:center;
}
.zoom img {
width:300px;
height:225px;
}
.zoom img:hover {
width:400px;
height:300px;
}]]></programlisting>
    </section>
    <section>
      <title>Résultat</title>
      <para><ulink url="annexes/#technique1">Testez le résultat dans votre navigateur</ulink>.</para>
      <para>
        <inlinemediaobject>
          <imageobject>
            <imagedata fileref="annexes/capt1_1.jpg"/>
          </imageobject>
          <textobject>
            <phrase>image par défaut</phrase>
          </textobject>
        </inlinemediaobject>
      </para>
      <para>Au survol :</para>
      <para>
        <inlinemediaobject>
          <imageobject>
            <imagedata fileref="annexes/capt1_2.jpg"/>
          </imageobject>
          <textobject>
            <phrase>image zoomée</phrase>
          </textobject>
        </inlinemediaobject>
      </para>
      <para>Hélas cette technique simplissime ne fonctionne pas avec <acronym>MSIE</acronym> car celui-ci ne supporte la règle <token>:hover</token> que pour les éléments liens.</para>
    </section>
  </section>
  <section id="tech_2">
    <title>Seconde technique</title>
    <para>Pour avoir un effet similaire avec <acronym>MSIE</acronym>, il va donc falloir tricher en lui faisant croire que l'image est un lien.</para>
    <para>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 (<token>background</token>). 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.</para>
    <para>Cette méthode a trois inconvénients :</para>
    <orderedlist>
      <listitem>
        <para>l'image sera plus lourde, donc plus longue à charger ;</para>
      </listitem>
      <listitem>
        <para>l'image n'étant plus insérée à l'aide de l'élément <sgmltag>img</sgmltag>, il n'est plus possible d'en donner un équivalent textuel via l'attribut <sgmltag class="attribute">alt</sgmltag>. 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é ;</para>
      </listitem>			
      <listitem>
        <para>en cas d'impression, la photo n'apparaîtra pas si l'internaute a configuré la non-impression des fonds d'écran.</para>
      </listitem>
    </orderedlist>
    <section>
      <title>Code <acronym>(X)HTML</acronym></title>
      <programlisting><![CDATA[<div class="zoom1">
    <p>
        <a href="#"
         title="photo d'un papillon machaon butinant une fleur">
         </a>
    </p>
</div>]]></programlisting>
    </section>
    <section>
      <title>Image et code <acronym>CSS</acronym></title>
      <para>L'image <ulink url="annexes/machaon1.jpg">machaon1.jpg</ulink> 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.</para>
      <para>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 <token>background-position:0px -300px</token> ; le <token>0</token> étant relatif à la position horizontale et le <token>-300px</token> à la position verticale.</para>
      <para>Ne pas oublier surtout le très important <token>display:block</token> qui permet ici le « remplacement » de la première portion d'image par la seconde.</para>
      <programlisting><![CDATA[.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;
}]]></programlisting>
      <section>
        <title>Astuces</title>
        <para>
          <token>margin:0 auto</token> déclaré dans <token>.zoom1</token> permet de centrer horizontalement l'image dans la page. (Attention : <acronym>MSIE</acronym> ne l'implémente pas.)</para>
        <para>
          <token>cursor:help</token> déclaré dans <token>zoom1_1 a:hover</token> permet de changer l'apparence du curseur lors du survol de l'image. D'autres valeurs, comme <token>cursor, crosshair, default</token> sont aussi disponibles.</para>
      </section>
    </section>
    <section>
      <title>Résultat</title>
      <para><ulink url="annexes/#technique2">Testez le résultat dans votre navigateur</ulink>.</para>
      <para>
        <inlinemediaobject>
          <imageobject>
            <imagedata fileref="annexes/capt2_1.jpg"/>
          </imageobject>
          <textobject>
            <phrase>image par défaut</phrase>
          </textobject>
        </inlinemediaobject>
      </para>
      <para>Au survol :</para>
      <para>
        <inlinemediaobject>
          <imageobject>
            <imagedata fileref="annexes/capt2_2.jpg"/>
          </imageobject>
          <textobject>
            <phrase>image zoomée</phrase>
          </textobject>
        </inlinemediaobject>
      </para>
    </section>
    <section>
      <title>Variante</title>
      <para>On peut choisir évidemment de garder les mêmes dimensions d'images pour ne zoomer qu'une partie.</para>
      <para>Pour cette variante, j'ai choisi de zoomer la partie colorée de l'aile du papillon. L'image (<ulink url="annexes/machaon2.jpg">machaon2.jpg</ulink>) 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.</para>
      <section>
        <title>Code <acronym>CSS</acronym></title>
        <para>Avec le même code <acronym>(X)HTML</acronym> que ci-dessus, le code <acronym>CSS</acronym> devient :</para>
        <programlisting><![CDATA[.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;
}]]></programlisting>
      <para><ulink url="annexes/#technique3">Testez le résultat dans votre navigateur</ulink>.</para>
        <para>Par défaut :</para>
        <para><inlinemediaobject>
            <imageobject>
              <imagedata fileref="annexes/capt3_1.jpg"/>
            </imageobject>
            <textobject>
              <phrase>image par défaut</phrase>
            </textobject>
          </inlinemediaobject>
        </para>
        <para>Au survol :</para>
        <para>
          <inlinemediaobject>
            <imageobject>
              <imagedata fileref="annexes/capt3_2.jpg"/>
            </imageobject>
            <textobject>
              <phrase>image zoomée</phrase>
            </textobject>
          </inlinemediaobject>
        </para>
      </section>
    </section>
  </section>
  <section>
    <title>Compléments d'informations</title>
    <para>Cette technique d'images « glissantes » appliquée au zoom est inspirée de l'article <ulink url="http://pompage.net/pompe/portescoulissantes2/">Les Portes Coulissantes de CSS - Chapitre II</ulink>.
Elle peut être aussi appliquée à des pseudo-découpes d'images, comme le décrit très bien cet autre article : <ulink url="http://pompage.net/pompe/sprites/">Sprites CSS :  Meurs, découpe d'images, meurs !</ulink>. (Traductions réalisées par l'équipe de <ulink url="http://pompage.net/">pompage.net</ulink>.)</para>
    <para>Photos 2004 - Pascale Lambert-Charreteur.</para>
  </section>
</article>
