<?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_centrage">
  <articleinfo>
    <title>Initiation au centrage <acronym>CSS</acronym></title>
    <pubdate>2003-03-21</pubdate>
    <date>2003-03-21</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>Les différentes méthodes de centrage d'un contenu <acronym>HTML</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>Le centrage d'une boîte <acronym>CSS</acronym> repose sur l'utilisation de ses propriétés de marges latérales. La technique et le résultat obtenu dépendent cependant du comportement attendu de la boîte&#160;: elle peut être de largeur variable selon son conteneur, ou de largeur fixe.</para>
  <section id="specifie">
    <title>Centrage d'une boîte élastique par des marges spécifiées.</title>
    <para>Une boîte élastique aura une largeur variable en fonction de celle de son conteneur (fenêtre du navigateur, conteneur&#8230;).</para>
    <para>La boîte sera centrée en la dotant de <ulink url="http://www.yoyodesign.org/doc/w3c/css2/box.html#margin-properties">marges latérales</ulink> de largeurs identiques&#160;:</para>
    <itemizedlist>
      <listitem>
        <para>spécifiées en pixels si leur largeur doit être constante&#160;: <programlisting>.centre { margin-left: <varname>50px</varname>; margin-right: <varname>50px</varname>; }</programlisting>&#160;;
        </para>
      </listitem>
      <listitem>
        <para>spécifiées en pourcentages si leur largeur doit être également proportionnelle à celle du conteneur&#160;: <programlisting>.centre { margin-left: <varname>15%</varname>; margin-right: <varname>15%</varname>; }</programlisting>.
        </para>
      </listitem>
    </itemizedlist>
    <para>Le résultat peut être observé dans l'<ulink url="annexes/annexe1.html#ex1">exemple 1</ulink>.</para>
    <para>Les marges proportionnelles sont préférables aux marges en pixels, car elles s'adaptent mieux à un affichage de taille réduite&#160;: les marges diminuent avec la largeur d'affichage.</para>
  </section>
  <section id="calcul">
    <title>Centrage d'une boîte élastique par des marges calculées.</title>
    <para>La boîte sera centrée simplement en spécifiant la valeur <token>auto;</token> pour ses marges latérales.</para>
    <para>Cette solution très élégante&#8230; <ulink url="http://www.bluerobot.com/web/css/center1.html">échoue</ulink> dans <acronym>IE</acronym> Windows. Fort heureusement, il est possible de tirer parti d'une application impropre de la propriété <token>text-align</token> aux éléments de type bloc par <acronym>MSIE</acronym> Windows&#160;: il suffit de spécifier <token>text-align: center</token> pour le conteneur, et de rétablir <token>text-align: left;</token> pour la boîte elle-même.</para>
    <programlisting>
.conteneur {
  text-align: center;
}
.centre {
  margin-left: auto;
  margin-right: auto;
  width: <varname>70%</varname>;
  text-align: left;
}
    </programlisting>
    <para>Le résultat peut être observé dans l'<ulink url="annexes/annexe1.html#ex2">exemple 2</ulink>.</para>
    <para>Cette solution est équivalente à celle des marges proportionnelles dans un affichage de taille réduite.</para>
  </section>
  <section id="rigide">
    <title>Centrage d'une boîte rigide.</title>
    <section id="pixels">
      <title>Largeur de boîte en pixels</title>
      <para>Une boîte rigide aura une largeur spécifiée en pixels, constante quelque-soit celle de son conteneur (fenêtre du navigateur, conteneur&#8230;). Elle sera centrée également en spécifiant la valeur <token>auto;</token> pour ses marges latérales</para>
      <programlisting>
.conteneur {
  text-align: center;
}
.centre {
  margin-left: auto;
  margin-right: auto;
  width: <varname>400px</varname>;
  text-align: left;
}
      </programlisting>
      <para>Le résultat peut être observé dans l'<ulink url="annexes/annexe1.html#ex3">exemple 3</ulink>.</para>
      <para>Cette solution n'est pas à recommander, car elle entraîne un <emphasis>scroll</emphasis> horizontal ou un débordement dans un affichage de largeur réduite&#8230;</para>
    </section>
    <section id="em">
      <title>Largeur de boîte en <token>em</token></title>
      <para>La largeur de la boîte peut également être spéficiée en <ulink url="http://www.yoyodesign.org/doc/w3c/css2/syndata.html#values">unité em</ulink>, pour tenir compte de la taille de caractère propre à l'utilisateur&#160;:</para>
      <programlisting>
.conteneur {
  text-align: center;
}
.centre {
  margin-left: auto;
  margin-right: auto;
  width: <varname>20em;</varname>;
  text-align: left;
}
      </programlisting>
      <para>Le résultat peut être observé dans l'<ulink url="annexes/annexe1.html#ex4">exemple 4</ulink>.</para>
      <para>Si vous <ulink url="http://www.blog-and-blues.org/standards/test/centrage.asp#cen5">modifiez</ulink> dans Mozilla ou <acronym>MSIE</acronym> la taille d'affichage des caractères, la taille de la boîte augmentera en conséquence&#8230;</para>
      <para>Cette solution n'est à recommander que pour des boîtes de petite largeur, puisqu'elle entraîne également un <emphasis>scroll</emphasis> horizontal ou un débordement dans un affichage de largeur réduite&#8230;</para>
    </section>
    <section id="variante">
      <title>Variante&#160;: les marges négatives</title>
      <para>Enfin, signalons une dernière méthode de centrage proposée par <ulink url="http://bluerobot.com/web/css/center2.html">BlueRobot</ulink>&#160;: le centrage par des marges négatives.</para>
      <itemizedlist>
        <listitem>
          <para>la boîte est tout d'abord placée en position relative (ou absolue), sa marge gauche étant alignée à la moitié de la largeur de la zone d'affichage&#160;;</para>
        </listitem>
        <listitem>
          <para>puis elle est dotée de marges latérales négatives égales à la moitié de sa largeur propre.</para>
        </listitem>
      </itemizedlist>
      <programlisting> 
.centre {
  position: relative; /*ou absolute */
  left: <varname>50%</varname>;
  width: <varname>400px</varname>;
  margin-left: <varname>-200px</varname>;
}
      </programlisting>
      <para>Le résultat peut être observé dans l'<ulink url="annexes/annexe1.html#ex5">exemple 5</ulink>.</para>
    </section>
  </section>
</article>
