<?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="initiation_absolue">
  <articleinfo>
    <title>Initiation au positionnement <acronym>CSS</acronym> : 3. position absolue et fixe</title>
    <pubdate>2003-03-21</pubdate>
    <date>2003-03-24</date>
    <author>
      <firstname>Laurent</firstname>
      <surname>Denis</surname>
      <email>laurent.denis@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>La position absolue et la position fixe permettent de placer une boîte par rapport aux limites de la zone d'affichage ou du conteneur. Comment les utiliser dans une mise en page <acronym>CSS</acronym> ?</para>
    </abstract>
    <subjectset>
      <subject role="profil">
        <subjectterm>expert</subjectterm>
      </subject>
      <subject role="theme">
        <subjectterm>mise_en_page</subjectterm>
      </subject>
      <subject role="technologie">
        <subjectterm>css</subjectterm>
      </subject>
    </subjectset>
  </articleinfo>
  <para>Cet article fait suite à l'<ulink url="/articles/initiation_float/">initiation au positionnement <acronym>CSS</acronym>: 2.position float</ulink>.</para>
  <para>Une boîte en positionnement absolu peut être placée n'importe-où dans le code <acronym>HTML</acronym> et s'afficher à l'endroit de votre choix. Ceci s'avère très utile en particulier pour&#160;:</para>
  <itemizedlist>
    <listitem>
      <para>placer les menus de navigation en fin de page, pour améliorer <ulink url="http://www.la-grange.net/accessibilite/day_10.html">l'accessibilité</ulink> de votre site en donnant un accès immédiat à son contenu dans les navigateurs textes, tout en les faisant apparaître en haut de page ou encore dans une colonne pour les navigateurs graphiques&#160;;</para>
    </listitem>
    <listitem>
      <para>créer plusieurs colonnes au positionnement indépendant de l'ordre dans lequel elles se trouvent en <acronym>HTML</acronym>.</para>
    </listitem>
  </itemizedlist>
  <section id="absolue">
    <title>Le fonctionnement de la position absolue</title>
    <para>Le positionnement absolu «&#160;retire&#160;» totalement du flux le contenu concerné&#160;: sa position est déterminée par référence aux limites du conteneur. Celui-ci peut-être&#160;:</para>
    <itemizedlist>
      <listitem>
        <para>une boîte <emphasis role="strong">elle-même positionnée</emphasis> (position relative ou absolue)&#160;;</para>
      </listitem>
      <listitem>
        <para>le bloc conteneur initial, à défaut de boîte positionnée, c'est à dire en pratique le plus souvent la fenêtre du navigateur.</para>
      </listitem>
    </itemizedlist>
    <para>Définissons un conteneur <varname>verte</varname> en position relative&#160;:</para>
    <programlisting>
.verte {
  position: relative;
  background-color: <varname>#00ff00</varname>;
  width: <varname>15em</varname>;
}
    </programlisting>
    <para>Et un positionnement absolu <varname>jaune</varname>&#160;:</para>
    <programlisting>
.jaune {
  position: absolute;
  top: <varname>1em</varname>;
  right: <varname>1em</varname>;
  background-color: <varname>#ffff00</varname>;
}
    </programlisting>
    <para>Et appliquons ces styles&#160;:</para>
    <programlisting>
&lt;div class="<varname>verte</varname>"&gt;
  &lt;p&gt;
    <varname>&#8230;</varname>
  &lt;/p&gt;
  &lt;p class="<varname>jaune</varname>"&gt;
    <varname>Boîte jaune en position absolue</varname>
  &lt;/p&gt;
&lt;/div&gt;
    </programlisting>
    <para>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <ulink url="annexes/annexe1.html#ex1">l'exemple 1</ulink> </para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/ex10.gif"/>
      </imageobject>
      <textobject>
        <phrase>La boîte jaune recouvre une partie du contenu de la boîte verte</phrase>
      </textobject>
    </mediaobject>
  </section>
  <section id="remplissage">
    <title>Ménager un espace pour la boîte en position absolue</title>
    <para>Inévitablement, la boîte en position absolue recouvre le contenu de notre paragraphe. Pour l'éviter, dotons la boîte conteneur verte d'un remplissage supérieur suffisant&#160;:</para>
    <programlisting>
.verte {
  padding-top: <varname>5em</varname>;
}
    </programlisting>
    <para>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <ulink url="annexes/annexe1.html#ex2">l'exemple 2</ulink></para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/ex11.gif"/>
      </imageobject>
      <textobject>
        <phrase>La boîte jaune occupe l'espace libre en haut de la boîte verte</phrase>
      </textobject>
    </mediaobject>
    <para>Nous pourrions aussi bien fixer la largeur de la boîte jaune et doter le texte de la boîte verte d'un remplissage à droite&#160;:</para>
    <programlisting>
.verte {
  padding-right: <varname>7em</varname>;
}
.jaune {
  width: <varname>4em</varname>;
}
    </programlisting>
    <para>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <ulink url="annexes/annexe1.html#ex3">l'exemple 3</ulink></para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/ex12.gif"/>
      </imageobject>
      <textobject>
        <phrase>La boîte jaune occupe l'espace libre à droite de la boîte verte</phrase>
      </textobject>
    </mediaobject>
  </section>
  <section id="troiscolonnes">
    <title>Utilisation&#160;: une mise en page à trois colonnes</title>
    <para>La position absolue offre donc une alternative aux flottants pour réaliser des mises en pages à plusieurs colonnes. Le cas typique est celui des trois colonnes dont voici le code&#160;:</para>
    <para>En <acronym>CSS</acronym>&#160;:</para>
    <programlisting>
centre {
  margin: <varname>1em 25%</varname>;
}
.gauche {
  position: absolute;
  top: <varname>1em</varname>;
  left: <varname>1%</varname>;
  width: <varname>18%</varname>;
}
.droite {
  position: absolute;
  top: <varname>1em</varname>;
  right: <varname>1%</varname>;
  width: <varname>18%</varname>;
}
    </programlisting>
    <para>En <acronym>HTML</acronym>&#160;:</para>
    <programlisting>
&lt;body&gt;
  &lt;div class="<varname>centre</varname>"&gt;
    <varname>&#8230;</varname>
  &lt;/div&gt;
  &lt;div class="<varname>gauche</varname>"&gt;
    <varname>&#8230;</varname>
  &lt;/div&gt;
  &lt;div class="<varname>droite</varname>"&gt;
    <varname>&#8230;</varname>
  &lt;/div&gt;
&lt;/body&gt;
    </programlisting>
    <para>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <ulink url="annexes/annexe7.html">la page-exemple 1</ulink>&#160;:</para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/ex19.gif"/>
      </imageobject>
      <textobject>
        <phrase>Trois colonnes dans la largeur de la page</phrase>
      </textobject>
    </mediaobject>
  </section>
  <section id="fixe">
    <title>La position fixe</title>
    <para>Comme dans un positionnement absolu, le contenu concerné est retiré totalement du flux. Mais il est cette fois positionné uniquement par rapport aux limites de la zone de visualisation, autrement dit la fenêtre du navigateur. Le défilement de la page n'a aucun effet sur un contenu en position fixe.</para>
    <para>Le positionnement fixe n'étant pas reconnu par Internet Explorer 5 et 6 Windows, un positionnement absolu doit s'y substituer dans ce navigateur. Ce résultat peut être atteint grâce à diverses formulations des styles jouant sur des syntaxes  <acronym>CSS2</acronym> ignorées par <acronym>MSIE</acronym>. Par exemple&#160;:</para>
    <programlisting>
.fixe {
  position: absolute;
  top: <varname>10px</varname>;
  left: <varname>10px;</varname>
}
html&gt;body .fixe {
  position: fixed;
}
    </programlisting>
    <para><acronym>MSIE</acronym> Windows ne lira que la première définition de <varname>.fixe</varname> et ignorera la seconde car il ne comprend pas la syntaxe <token>html&gt;body</token>. Les navigateurs supportant la position fixe liront les deux positionnements, mais le second se substituera au premier car il est placé <emphasis>après</emphasis> celui-ci dans la feuille de style.</para>
    <para>Notons que <ulink url="http://arcok.ujevangelizacio.hu/bubu/examples/ie-fixed.html">ie-fixed.htc, un hack <acronym>CSS</acronym> dû à Gellért Gyuris</ulink>, permet cependant de corriger l'absence de support de la position fixe dans <acronym>MSIE</acronym> Windows, grâce au <acronym>DOM</acronym>.</para>
    <para>Tout comme le positionnement absolu, le positionnement fixe est susceptible de provoquer des chevauchements. On employera donc des méthodes similaires pour l'exploiter.</para>
  </section>
  <section id="menufixe">
    <title>Utilisation&#160;: un menu fixe en colonne</title>
    <para>Pour fixer un menu de navigation dans une colonne vide à gauche du contenu, on définira les largeurs du contenu et du menu&#160;:</para>
    <para>En <acronym>CSS</acronym>&#160;:</para>
    <programlisting>
.content {
  width: <varname>65%</varname>;
  border: <varname>1px</varname> solid <varname>#000000</varname>;
  padding: <varname>1em 1%</varname>;
}
.menu {
  position: absolute;
  top: <varname>1em</varname>;
  right: <varname>1%</varname>;
  border: <varname>1px</varname> solid <varname>#000000</varname>;
  padding: <varname>1em</varname>;
  width: <varname>20%</varname>;
}
html&gt;body .menu {
  position: fixed;
}
    </programlisting>
    <para>En <acronym>HTML</acronym>&#160;:</para>
    <programlisting>
&lt;body&gt;
  &lt;div class="<varname>content</varname>"&gt;
  <varname>&#8230;</varname>
  &lt;/div&gt;
  &lt;div class="<varname>menu</varname>"&gt;
  <varname>&#8230;</varname>
  &lt;/div&gt;
&lt;/body&gt;
    </programlisting>
    <para>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <ulink url="annexes/annexe3.html">la page-exemple 2</ulink></para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/ex15.gif"/>
      </imageobject>
      <textobject>
        <phrase>Un menu fixe dans la colonne droite flanquant le contenu de la page</phrase>
      </textobject>
    </mediaobject>
  </section>
  <section id="barrefixe">
    <title>Utilisation&#160;: une barre de menu fixe</title>
    <para>Lorsqu'il s'agit de créer une mise en page avec contenu et menus, la position fixe a l'inconvénient apparent de sacrifier une partie de la largeur d'affichage disponible, pour éviter les chevauchements.</para>
    <para>En fait, cet inconvénient disparaît sitôt qu'on tire profit du chevauchement au lieu de chercher à l'éviter, à la manière d'<ulink url="http://emmanuel.clement.free.fr/"><personname><firstname>Emmanuel</firstname><surname>Clément</surname></personname></ulink> (notre designer d'OpenWeb). Imaginons une barre de menu horizontale, fixée en permanence en haut de la fenêtre d'affichage&#160;:</para>
    <para>En <acronym>CSS</acronym>&#160;:</para>
    <programlisting>
.menufixe {
  top: <varname>0</varname>;
  left: <varname>0</varname>;
  width: <varname>100%</varname>;
  border: <varname>1px</varname> solid <varname>#000000</varname>;
  position: absolute;
  z-index: <varname>2</varname>;
  text-align: center;
  background-color: <varname>#ffffff</varname>;
  line-height: <varname>2em</varname>;
}
html&gt;body .menufixe {
  position: fixed
}
.content {
  z-index: <varname>1</varname>;
  padding-top: <varname>3em</varname>;
}
    </programlisting>
    <para>En <acronym>HTML</acronym>&#160;:</para>
    <programlisting>
&lt;body&gt;
  &lt;div class="<varname>content</varname>"&gt;
    <varname>&#8230;</varname>
  &lt;/div&gt;
  &lt;p class="<varname>menufixe</varname>"&gt;
    <varname>&#8230;</varname>
  &lt;/p&gt;
&lt;/body&gt;
    </programlisting>
    <para>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <ulink url="annexes/annexe6.html">la page-exemple 3</ulink>&#160;:</para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/ex18.gif"/>
      </imageobject>
      <textobject>
        <phrase>Une barre de menu fixe en permanence en haut de la fenêtre du navigateur</phrase>
      </textobject>
    </mediaobject>
  </section>
  <section id="fixeabsolue">
    <title>Combinaisons des positions fixe et absolue</title>
    <para>Imaginons à présent deux menus différents, tous deux placés dans la même colonne&#160;:</para>
    <itemizedlist>
      <listitem><para>le premier sera fixe en haut de la colonne&#160;;</para></listitem>
      <listitem><para>le second sera en position absolue plus bas dans la même colonne.</para></listitem>
    </itemizedlist>
    <para>La propriété <token>CSS</token> <token>z-index</token> permet de spécifier le <emphasis>niveau d'empilement</emphasis> de chaque menu&#160;: avec un <token>z-index</token> supérieur à celui du menu fixe et un arrière-plan opaque, le menu en position absolue masquera temporairement celui-ci lors du défilement de la page. Le code nécessaire est&#160;:</para>
    <para>En <acronym>CSS</acronym>&#160;:</para>
    <programlisting>
.content {
  width: <varname>65%</varname>;
  border: <varname>1px</varname> solid <varname>#000000</varname>;
  padding: <varname>1em 1%</varname>;
}
.menufixe {
  position: absolute;
  top: <varname>1em</varname>;
  right: <varname>2%</varname>;
  border: <varname>1px</varname> solid <varname>#000000</varname>;
  padding: <varname>1em</varname>;
  width: <varname>18%</varname>;
  z-index: <varname>2</varname>;
}
html&gt;body .menufixe {
  position: fixed;
}
.menuabsolu {
  position: absolute;
  top: <varname>15em</varname>;
  right: <varname>1%</varname>;
  border: <varname>1px</varname> solid <varname>#000000</varname>;
  padding: <varname>1em</varname>;
  width: <varname>20%</varname>;
  background-color: <varname>#ffffff</varname>;
  z-index: <varname>3</varname>;
}
    </programlisting>
    <para>En <acronym>HTML</acronym>&#160;:</para>
    <programlisting>
&lt;body&gt;
  &lt;div class="<varname>content</varname>"&gt;
    <varname>&#8230;</varname>
  &lt;/div&gt;
  &lt;div class="<varname>menu</varname>"&gt;
    <varname>&#8230;</varname>
  &lt;/div&gt;
&lt;/body&gt;
    </programlisting>
    <para>Le point délicat est, bien-sûr, le choix de la valeur donnée à la propriété <token>top</token> du menu en position absolu, afin d'être sûr qu'il n'empiète pas sur l'espace du menu en position fixe.</para>
    <para>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <ulink url="annexes/annexe4.html">la page-exemple 4</ulink>&#160;:</para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/ex16.gif"/>
      </imageobject>
      <textobject>
        <phrase>Un menu fixe et un menu absolu dans la colonne droite flanquant le contenu de la page</phrase>
      </textobject>
    </mediaobject>
  </section>
  <section id="conclusion">
    <title>Conclusion</title>
    <para>Le positionnement <acronym>CSS</acronym> donne donc toute liberté dans la mise en page. Comparée à l'utilisation des tableaux, cette technique offre des avantages essentiels&#160;:</para>
    <itemizedlist>
      <listitem>
        <para>gestion de la présentation à partir d'un document unique pour un nombre quelconque de pages&#160;;</para>
      </listitem>
      <listitem>
        <para>stricte séparation du contenu et de la présentation, d'où un contenu mieux structuré, dénué de balisage superflu&#160;;</para>
      </listitem>
      <listitem>
        <para>meilleure accessibilité, le contenu pouvant être organisé correctement dans les navigateurs non graphiques, tout en étant librement disposé dans les navigateurs graphiques&#160;;</para>
      </listitem>
      <listitem>
        <para>
          <emphasis>elasticité</emphasis> des mises en page obtenues, qui s'adaptent plus facilement aux différentes configurations des utilisateurs (taille de la zone d'affichage, règlages de tailles de caractères&#8230;)&#160;;</para>
      </listitem>
      <listitem><para>effets graphiques nouveaux, tels le recouvrement en position fixe/absolue.</para></listitem>
    </itemizedlist>
  </section>
</article>
