<!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 - Overflow avec fond fixe en 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="overflow_fond_fixe" />
    <meta name="DC.Creator" content="Olivier Meunier" />
    <meta name="DC.Date.created" scheme="W3CDTF" content="2003-03-21" />
    <meta name="DC.Date.modified" scheme="W3CDTF" content="2003-03-21" />
    <meta name="DC.Rights" content="Cet article est sous licence Creative Commons Attribution-ShareAlike." />
    <meta name="DC.Subject" content="gourou, mise_en_page, css" />
  </head>
  <body>
    <h1>Overflow avec fond fixe en CSS</h1>
    <ul>
      <li>
        <strong>Profil :</strong> <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> <a href="mailto:olivier.meunier%40openweb.eu.org">Olivier Meunier</a>
      </li>
      <li>
        <strong>Mise à jour :</strong> 21/03/2003</li>
    </ul>
    <h2>En bref</h2>
    <p>Comment créer en <acronym title="Cascading Style Sheets" lang="en">CSS</acronym> un overflow avec une image de fond fixée dans le bloc défilant ?</p>
    <hr />
    <h3>Introduction</h3>
    <p>On appelle <em>overflow</em> une méthode consistant à intégrer du texte dans une boite avec ascenseur dans une page Web. L'overflow ressemble beaucoup à ce qu'on appelle <code>iframe</code> avec une différence de taille : l'accessibilité.</p>
    <p>Un <em>overflow</em> n'étant rien de plus qu'un style <acronym>CSS</acronym> appliqué à un bloc, un navigateur qui ne saurait pas gérer ce style affichera quand même le contenu du bloc rendant ainsi votre travail accessible au plus grand nombre.</p>
    <p>A l'inverse l'utilisation du <code>iframe</code> implique que le navigateur supporte cet élément et repose le problème d'accessibilité des cadres (<code>frame</code> ou <code>iframe</code>).</p>
    <p>Note : le contenu d'un <code>iframe</code> se trouve dans un fichier à part, comme avec les <code>frame</code>.</p>
    <h3>Motivations</h3>
    <p>Cet article va se pencher sur le support de l'<em>overflow</em> par <acronym title="MicroSoft Internet Explorer" lang="en">MSIE</acronym> et Gecko (Mozilla, Netscape 7, Chimera, Phoenix, etc), sur les différences entre l'un et l'autre et sur les moyens de les supprimer.</p>
    <p>Il doit vous permettre de créer un <em>overflow</em> avec une image de fond fixée dans le bloc défilant.</p>
    <h3>Réalisation</h3>
    <h4>Overflow simple</h4>
    <p>Voici un premier exemple de création d'un <em>overflow</em> très simple. Pensez à insérer du texte assez long dans le bloc.</p>
    <pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;

&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;Page de démonstration&lt;/title&gt;
    &lt;meta http-equiv="Content-Type"
      content="text/html; charset=iso-8859-1" /&gt;
    &lt;style type="text/css"&gt;
    &lt;!--
      div#bloc1 {
      	width: 300px;
      	height: 150px;
      	overflow: auto;
      	border: 1px solid #000;
      }
    --&gt;
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id="bloc1"&gt;
      texte
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
      </pre>
    <p>Comme on peut le constater, la création d'un <em>overflow</em> est très simple, il suffit de spécifier <code>overflow : auto</code> dans le style du bloc où l'on souhaite l'appliquer.</p>
    <p>Le résultat d'un telle page sera le suivant (n'oubliez pas de mettre du texte) :</p>
    <div><img src="annexes/overflow-1.gif" alt="Overflow simple avec MSIE" /></div>
    <h4>Overflow avec image de fond fixe</h4>
    <p>Pour égayer la présentation de la page, nous allons ajouter un fond au bloc et nous allons fixer ce fond pour qu'il ne défile pas. Nous allons également décaler le bloc de 50 pixels vers la gauche et 20 vers le bas.</p>
    <p>En toute logique, pour fixer le fond, nous allons utiliser la propriété <acronym>CSS</acronym>
      <code>background-attachement: fixed</code> qui va forcer le fond à ne pas se déplacer avec le texte.</p>
    <p>Pour les besoins de l'exercice vous pouvez utiliser l'image de fond suivante.</p>
    <div><img src="annexes/background.gif" alt="Image de fond pour l'exercice" /></div>
    <p>Voici le code qui permettra de réaliser l'effet escompté :</p>
    <pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;

&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;Page de démonstration&lt;/title&gt;
    &lt;meta http-equiv="Content-Type"
      content="text/html; charset=iso-8859-1" /&gt;
    &lt;style type="text/css"&gt;
    &lt;!--
      div#bloc1 {
      	width: 300px;
      	height: 150px;
      	overflow: auto;
      	border: 1px solid #000;
      	position: absolute;
      	top: 20px;
      	left: 50px;
      	background-image: url('background.gif');
      	background-attachment: fixed;
      	color: #fff;
      }
    --&gt;
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id="bloc1"&gt;
      texte
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html &gt;
      </pre>
    <p>Avec <acronym>MSIE</acronym>, ceci est parfait, le fond est fixe, le bloc est bien placé comme on le désirait (20 pixels à gauche, 50 pixels à droite) et le texte en blanc.</p>
    <div><img src="annexes/overflow-2-ie.gif" alt="Overflow avec fond fixe, Internet Explorer" /></div>
    <p>Les choses se compliquent avec Gecko, jugez vous même :</p>
    <div><img src="annexes/overflow-2-moz.gif" alt="Overflow avec fond fixe, Mozilla" /></div>
    <p>Que s'est-il passé ? En réalité c'est très simple, la propriété <acronym>CSS</acronym>
      <code>background-attachment: fixed</code> ne fixe pas l'image par rapport au bloc mais <strong>par rapport à la page</strong>. Ce comportement n'est pas un bogue de Gecko mais bien un comportement standard.</p>
    <p>Comme l'énonce clairement le <acronym title="World Wide Web Consortium" lang="en">W3C</acronym> : <em>If a background image is specified, this property specifies whether it is fixed with regard to the viewport ('fixed')...</em>.
La traduction officielle énonçant : <em>Quand on spécifie une image d'arrière-plan, cette propriété
indique si l'image est fixe par rapport à la zone de visualisation (pour la valeur 'fixed')[...]</em>.</p>
    <p>Une très bonne page (à consulter avec un navigateur utilisant Gecko) montre toute l'étendue de cette fonctionnalité et les usages très intéressants que l'on peut en faire : <a href="http://www.meyerweb.com/eric/css/edge/complexspiral/glassy.html">Complexspiral Redux</a>.</p>
    <p>Bien ! Voici pour l'explication, mais ceci ne fait pas avancer notre problème. Heureusement une solution existe et nous allons maintenant la voir.</p>
    <h3>La solution : overflow avec fond fixe, espacement intérieur et décalage</h3>
    <p>Afin de permettre d'envisager tout type de mise en page, nous allons corser le problème. Maintenant nous voulons un bloc décalé de 50 pixels à gauche, 20 pixels en haut, une image de fond fixe et le texte à l'intérieur avec un espacement intérieur de 90 pixels à gauche et 40 pixels en haut.</p>
    <p>La solution va en fait consister à imbriquer 3 blocs les uns dans les autres. Pour les deux premiers blocs nous spécifions leur largeur. Ensuite, pour le premier on spécifie son positionnement, la couleur du texte et l'image de fond. Pour l'image de fond, on utilisera les propriété <acronym>CSS</acronym>
      <code>background-position: top left</code> et <code>background-repeat: no-repeat</code> afin de fixer le fond en haut à gauche du bloc.</p>
    <p>Dans le second bloc on réalise l'<em>overflow</em> et spécifie la bordure du bloc (ceci restant facultatif).</p>
    <p>Enfin, dans le troisième et dernier bloc on peut spécifier l'espacement intérieur du texte et si, on le souhaite, ajouter toute sorte de style qui s'appliqueront au texte.</p>
    <p>Voici donc le code source du document :</p>
    <pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
    
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;Page de démonstration&lt;/title&gt;
    &lt;meta http-equiv="Content-Type"
      content="text/html; charset=iso-8859-1" /&gt;
    &lt;style type="text/css"&gt;
    &lt;!--
      div#bloc1, div#bloc2 {
      	width : 300px;
      	height : 150px;
      }
      div#bloc1 {
      	position : absolute;
      	top : 30px;
      	left : 50px;
      	background-image : url(background.gif);
      	background-position : top left;
      	background-repeat : no-repeat;
      	color : #fff;
      }
      div#bloc2 {
      	border : 1px solid #000;
      	overflow : auto;
      }
      div#bloc3 {
      	padding : 40px 0 0 90px;
      }
    --&gt;
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id="bloc1"&gt;
      &lt;div id="bloc2"&gt;
        &lt;div id="bloc3"&gt;
          texte
        &lt;/div&gt;
      &lt;/div &gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
    </pre>
    <p>Le résultat est conforme à nos attentes, que ce soit avec Internet Explorer :</p>
    <div><img src="annexes/overflow-3-ie.gif" alt="Résultat de l'overflow avec fond fixe, Internet Explorer" /></div>
    <p>Ainsi qu'avec Gecko :</p>
    <div><img src="annexes/overflow-3-moz.gif" alt="Résultat de l'overflow avec fond fixe, Mozilla" /></div>
    <h3>Conclusion</h3>
    <p>La réalisation d'un <em>overflow</em> avec image de fond fixe n'est finalement pas si compliquée qu'il n'y paraît. Cependant le manque de respect des standards du <acronym>W3C</acronym> par certains navigateurs peut entraîner le développeur Web sur une mauvaise piste et apporter son lot de perte de temps et de frustration. C'est pourquoi les développeurs Web doivent, autant qu'ils le peuvent, respecter les standards du <acronym>W3C</acronym>. Si les concepteurs de navigateurs font de même, alors il deviendra très simple de réaliser des pages Web sophistiquées et accessibles à tous et ce, sans perdre un temps fou, temps qui pourra être consacré au contenu des pages lui-même.</p>
    <h3>Ressources</h3>
    <ul>
      <li>
        <a href="http://www.yoyodesign.org/doc/w3c/css2/cover.html">les
spécifications <acronym>CSS</acronym>2 en français</a> ;</li>
      <li>
        <a href="http://www.w3.org/TR/REC-CSS2/">les spécifications <acronym>CSS</acronym>2
en anglais</a> ;</li>
      <li>
        <a href="http://www.meyerweb.com/eric/css/edge/complexspiral/glassy.html">complexspiral redux</a> par Eric Meyer.</li>
    </ul>
  </body>
</html>
