<?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="overflow_fond_fixe">
  <articleinfo>
    <title>Overflow avec fond fixe en <acronym>CSS</acronym></title>
    <pubdate>2003-03-21</pubdate>
    <date>2003-03-21</date>
    <author>
      <firstname>Olivier</firstname>
      <surname>Meunier</surname>
      <email>olivier.meunier@openweb.eu.org</email>
    </author>
    <legalnotice>
      <para>Cet article est sous licence <ulink url="http://creativecommons.org/licenses/by-sa/1.0/legalcode">Creative Commons Attribution-ShareAlike</ulink>.</para>
    </legalnotice>
    <abstract>
      <para>Comment créer en <acronym>CSS</acronym> un overflow avec une image de fond fixée dans le bloc défilant ?</para>
    </abstract>
    <subjectset>
      <subject role="profil">
        <subjectterm>gourou</subjectterm>
      </subject>
      <subject role="theme">
        <subjectterm>mise_en_page</subjectterm>
      </subject>
      <subject role="technologie">
        <subjectterm>css</subjectterm>
      </subject>
    </subjectset>
  </articleinfo>
  <section id="introduction">
    <title>Introduction</title>
    <para>On appelle <emphasis>overflow</emphasis> 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 <token>iframe</token> avec une différence de taille&#160;: l'accessibilité.</para>
    <para>Un <emphasis>overflow</emphasis> 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.</para>
    <para>A l'inverse l'utilisation du <token>iframe</token> implique que le navigateur supporte cet élément et repose le problème d'accessibilité des cadres (<token>frame</token> ou <token>iframe</token>).</para>
    <para>Note&#160;: le contenu d'un <token>iframe</token> se trouve dans un fichier à part, comme avec les <token>frame</token>.</para>
  </section>
  <section id="motivations">
    <title>Motivations</title>
    <para>Cet article va se pencher sur le support de l'<emphasis>overflow</emphasis> par <acronym>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.</para>
    <para>Il doit vous permettre de créer un <emphasis>overflow</emphasis> avec une image de fond fixée dans le bloc défilant.</para>
  </section>
  <section id="realisation">
    <title>Réalisation</title>
    <section id="simple">
      <title>Overflow simple</title>
      <para>Voici un premier exemple de création d'un <emphasis>overflow</emphasis> très simple. Pensez à insérer du texte assez long dans le bloc.</para>
      <programlisting>
&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;<varname>Page de démonstration</varname>&lt;/title&gt;
    &lt;meta http-equiv="Content-Type"
      content="text/html; charset=iso-8859-1" /&gt;
    &lt;style type="text/css"&gt;
    &lt;!--
      <varname>div#bloc1</varname> {
      	width: <varname>300px</varname>;
      	height: <varname>150px</varname>;
      	overflow: auto;
      	border: <varname>1px</varname> solid <varname>#000</varname>;
      }
    --&gt;
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id="<varname>bloc1</varname>"&gt;
      <varname>texte</varname>
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
      </programlisting>
      <para>Comme on peut le constater, la création d'un <emphasis>overflow</emphasis> est très simple, il suffit de spécifier <token>overflow&#160;: auto</token> dans le style du bloc où l'on souhaite l'appliquer.</para>
      <para>Le résultat d'un telle page sera le suivant (n'oubliez pas de mettre du texte)&#160;:</para>
      <mediaobject>
        <imageobject>
          <imagedata fileref="annexes/overflow-1.gif"/>
        </imageobject>
        <textobject>
          <phrase>Overflow simple avec <acronym>MSIE</acronym></phrase>
        </textobject>
      </mediaobject>
    </section>
    <section id="image">
      <title>Overflow avec image de fond fixe</title>
      <para>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.</para>
      <para>En toute logique, pour fixer le fond, nous allons utiliser la propriété <acronym>CSS</acronym> <token>background-attachement: fixed</token> qui va forcer le fond à ne pas se déplacer avec le texte.</para>
      <para>Pour les besoins de l'exercice vous pouvez utiliser l'image de fond suivante.</para>
      <mediaobject>
        <imageobject>
          <imagedata fileref="annexes/background.gif"/>
        </imageobject>
        <textobject>
          <phrase>Image de fond pour l'exercice</phrase>
        </textobject>
      </mediaobject>
      <para>Voici le code qui permettra de réaliser l'effet escompté&#160;:</para>
      <programlisting>
&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;<varname>Page de démonstration</varname>&lt;/title&gt;
    &lt;meta http-equiv="Content-Type"
      content="text/html; charset=iso-8859-1" /&gt;
    &lt;style type="text/css"&gt;
    &lt;!--
      <varname>div#bloc1</varname> {
      	width: <varname>300px</varname>;
      	height: <varname>150px</varname>;
      	overflow: auto;
      	border: <varname>1px</varname> solid <varname>#000</varname>;
      	position: absolute;
      	top: <varname>20px</varname>;
      	left: <varname>50px</varname>;
      	background-image: url('<varname>background.gif</varname>');
      	background-attachment: fixed;
      	color: <varname>#fff</varname>;
      }
    --&gt;
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id="<varname>bloc1</varname>"&gt;
      texte
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html &gt;
      </programlisting>
      <para>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.</para>
      <mediaobject>
        <imageobject>
          <imagedata fileref="annexes/overflow-2-ie.gif"/>
        </imageobject>
        <textobject>
          <phrase>Overflow avec fond fixe, Internet Explorer</phrase>
        </textobject>
      </mediaobject>
      <para>Les choses se compliquent avec Gecko, jugez vous même&#160;:</para>
      <mediaobject>
        <imageobject>
          <imagedata fileref="annexes/overflow-2-moz.gif"/>
        </imageobject>
        <textobject>
          <phrase>Overflow avec fond fixe, Mozilla</phrase>
        </textobject>
      </mediaobject>
      <para>Que s'est-il passé&#160;? En réalité c'est très simple, la propriété <acronym>CSS</acronym> <token>background-attachment: fixed</token> ne fixe pas l'image par rapport au bloc mais <emphasis role="strong">par rapport à la page</emphasis>. Ce comportement n'est pas un bogue de Gecko mais bien un comportement standard.</para>
      <para>Comme l'énonce clairement le <acronym>W3C</acronym>&#160;: <emphasis>If a background image is specified, this property specifies whether it is fixed with regard to the viewport ('fixed')...</emphasis>.
La traduction officielle énonçant&#160;: <emphasis>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')[...]</emphasis>.</para>
      <para>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&#160;: <ulink url="http://www.meyerweb.com/eric/css/edge/complexspiral/glassy.html">Complexspiral Redux</ulink>.</para>
      <para>Bien&#160;! Voici pour l'explication, mais ceci ne fait pas avancer notre problème. Heureusement une solution existe et nous allons maintenant la voir.</para>
    </section>
  </section>
  <section id="solution">
    <title>La solution&#160;: overflow avec fond fixe, espacement intérieur et décalage</title>
    <para>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.</para>
    <para>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> <token>background-position: top left</token> et <token>background-repeat: no-repeat</token> afin de fixer le fond en haut à gauche du bloc.</para>
    <para>Dans le second bloc on réalise l'<emphasis>overflow</emphasis> et spécifie la bordure du bloc (ceci restant facultatif).</para>
    <para>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.</para>
    <para>Voici donc le code source du document&#160;:</para>
    <programlisting>
&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;<varname>Page de démonstration</varname>&lt;/title&gt;
    &lt;meta http-equiv="Content-Type"
      content="text/html; charset=iso-8859-1" /&gt;
    &lt;style type="text/css"&gt;
    &lt;!--
      <varname>div#bloc1</varname>, <varname>div#bloc2</varname> {
      	width : <varname>300px</varname>;
      	height : <varname>150px</varname>;
      }
      <varname>div#bloc1</varname> {
      	position : absolute;
      	top : <varname>30px</varname>;
      	left : <varname>50px</varname>;
      	background-image : url(<varname>background.gif</varname>);
      	background-position : top left;
      	background-repeat : no-repeat;
      	color : <varname>#fff</varname>;
      }
      <varname>div#bloc2</varname> {
      	border : <varname>1px</varname> solid <varname>#000</varname>;
      	overflow : auto;
      }
      <varname>div#bloc3</varname> {
      	padding : <varname>40px 0 0 90px</varname>;
      }
    --&gt;
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id="<varname>bloc1</varname>"&gt;
      &lt;div id="<varname>bloc2</varname>"&gt;
        &lt;div id="<varname>bloc3</varname>"&gt;
          texte
        &lt;/div&gt;
      &lt;/div &gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
    </programlisting>
    <para>Le résultat est conforme à nos attentes, que ce soit avec Internet Explorer&#160;:</para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/overflow-3-ie.gif"/>
      </imageobject>
      <textobject>
        <phrase>Résultat de l'overflow avec fond fixe, Internet Explorer</phrase>
      </textobject>
    </mediaobject>
    <para>Ainsi qu'avec Gecko&#160;:</para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/overflow-3-moz.gif"/>
      </imageobject>
      <textobject>
        <phrase>Résultat de l'overflow avec fond fixe, Mozilla</phrase>
      </textobject>
    </mediaobject>
  </section>
  <section id="conclusion">
    <title>Conclusion</title>
    <para>La réalisation d'un <emphasis>overflow</emphasis> 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.</para>
  </section>
  <section id="ressources">
    <title>Ressources</title>
    <itemizedlist>
      <listitem>
        <para><ulink url="http://www.yoyodesign.org/doc/w3c/css2/cover.html">les
spécifications <acronym>CSS</acronym>2 en français</ulink>&#160;;</para>
      </listitem>
      <listitem>
        <para><ulink url="http://www.w3.org/TR/REC-CSS2/">les spécifications <acronym>CSS</acronym>2
en anglais</ulink>&#160;;</para>
      </listitem>
      <listitem>
        <para><ulink url="http://www.meyerweb.com/eric/css/edge/complexspiral/glassy.html">complexspiral redux</ulink> par <personname><firstname>Eric</firstname><surname>Meyer</surname></personname>.</para>
      </listitem>
    </itemizedlist>
  </section>
</article>
