<?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_float">
  <articleinfo>
    <title>Initiation au positionnement <acronym>CSS</acronym>&#160;: 2.position float</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>La position float retire une boîte du flux normal pour la placer le plus à droite ou le plus gauche possible dans son conteneur. Comment l'utiliser dans une mise en page <acronym>CSS</acronym>&#160;?</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_flux/">initiation au positionnement <acronym>CSS</acronym>&#160;: 1.Flux et position relative</ulink>.</para>
  <para>Une boîte flottante est <emphasis role="strong">retirée du flux normal</emphasis>, et placée le plus à droite (<token>float: right</token>) ou le plus à gauche (<token>float: left</token>) possible dans son conteneur. <emphasis role="strong">Le contenu suivant cette boîte flottante s'écoule le long de celle-ci</emphasis>, dans l'espace laissé libre.</para>
  <section id="fonctionnement">
    <title>Le fonctionnement des flottants</title>
    <para>Ajoutons aux styles précédents une règle de positionnement flottant à droite et une mesure de largeur (facultative, mais utile pour certains navigateurs)&#160;:</para>
    <para>En <acronym>HTML</acronym>:</para>
    <programlisting>
&lt;p class="<varname>jaune</varname>"&gt;<varname>Une boîte jaune flottant</varname>&lt;/p&gt;
&lt;p class="<varname>verte</varname>"&gt;<varname>Une boîte verte doté d'un contenu plus long&#8230;</varname>&lt;/p&gt;
</programlisting>
    <para>En <acronym>CSS</acronym>:</para>
    <programlisting>
.jaune {
  background-color: <varname>#ffff00</varname>;
  float: right;
  width: <varname>100px</varname>;
  margin: <varname>0</varname>;
}
.verte {
  background-color: <varname>#00ff00</varname>;
}
    </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/ex5.gif"/>
      </imageobject>
      <textobject>
        <phrase>Le texte de la boîte verte passe à la ligne à hauteur de la boîte jaune</phrase>
      </textobject>
    </mediaobject>
    <para>Le navigateur <emphasis>place</emphasis> tout d'abord la boîte jaune, alignée sur le bord droit de cette partie de notre page, puis reprend le cours normal du flux dans l'espace laissé libre à sa gauche pour afficher la boîte verte. Le flux occupe tout l'espace disponible: la boîte verte reprend donc toute la largeur de la page sitôt <emphasis>passée</emphasis> la limite inférieure de la boîte flottante jaune.</para>
    <para>Dans les navigateurs n'appliquant pas la feuille de style (navigateurs texte ou non conformes aux standards&#8230;), la boîte flottante sera simplement inscrite en flux normal avant la boîte qui la suit.</para>
  </section>
  <section id="deuxcolonnes">
    <title>Première utilisation&#160;: une mise en page à deux colonnes</title>
    <para>La combinaison de la position flottante et du flux permet de réaliser aisément une mise en page à deux colonnes (un contenu et un menu)&#160;:</para>
    <para>En <acronym>CSS</acronym>&#160;:</para>
    <programlisting>
.content {
  float: left;
  width: <varname>70%</varname>;
}
.menu {
  margin-left: <varname>80%</varname>;
  border: <varname>1px</varname> solid <varname>#000000</varname>;
  padding: <varname>1em</varname>;
}
    </programlisting>
    <para>Et en <acronym>HTML</acronym>&#160;:</para>
    <programlisting>
<varname>&#8230;</varname>
&lt;body&gt;
  &lt;div class="<varname>content</varname>"&gt;
    <varname>&#8230;</varname>
  &lt;/div&gt;
  &lt;div class="<varname>menu</varname>"&gt;
    &lt;ul&gt;
      &lt;li&gt;<varname>lien_1</varname>&lt;/li&gt;
      &lt;li&gt;<varname>lien_2</varname>&lt;/li&gt;
      &lt;li&gt;<varname>lien_3</varname>&lt;/li&gt;
    &lt;/ul&gt;
  &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/annexe2.html">la page-exemple 1</ulink></para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/ex15.gif"/>
      </imageobject>
      <textobject>
        <phrase>Un menu dans la colonne droite flanquant le contenu de la page</phrase>
      </textobject>
    </mediaobject>
  </section>
  <section id="troiscolonnes">
    <title>Seconde utilisation&#160;: une mise en page à trois colonnes et plus</title>
    <para>Mais on peut tout aussi bien multiplier les flottants pour créer autant de colonnes que voulu&#160;:</para>
    <para>En <acronym>CSS</acronym>&#160;:</para>
    <programlisting>
body {
  margin: <varname>0</varname>;
  padding: <varname>0</varname>;
}
.float {
  float: left;
  width: <varname>25%</varname>;
  margin: <varname>1em 0</varname>;
}
p,h1,h2 {
  margin: <varname>1em</varname>;
}
    </programlisting>
    <para>Et en <acronym>HTML</acronym>&#160;:</para>
    <programlisting>
<varname>&#8230;</varname>
&lt;body&gt;
  <varname>&#8230;</varname>
  &lt;div class="<varname>float</varname>"&gt;
    <varname>&#8230;</varname>
  &lt;/div&gt;
  &lt;div class="<varname>float</varname>"&gt;
    <varname>&#8230;</varname>
  &lt;/div&gt;
  &lt;div class="<varname>float</varname>"&gt;
    <varname>&#8230;</varname>
  &lt;/div&gt;
  &lt;div class="<varname>float</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>&#160;:</para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/ex17.gif"/>
      </imageobject>
      <textobject>
        <phrase>Sous le titre, 4 colonnes d'égale largeur.</phrase>
      </textobject>
    </mediaobject>
  </section>
  <section id="spacer">
    <title>Débordement et <emphasis>spacer</emphasis>
    </title>
    <section id="probleme">
      <title>Le probleme du débordement</title>
      <para>Reprenons notre exemple, mais inversons les contenus: celui de la boîte flottante jaune est à présent plus long que celui de la boîte verte&#160;:</para>
      <para>En <acronym>HTML</acronym>&#160;:</para>
      <programlisting>
&lt;p class="<varname>jaune</varname>"&gt;
  <varname>Une boîte jaune flottant doté d'un contenu plus long&#8230;</varname>
&lt;/p&gt;
&lt;p class="<varname>verte</varname>"&gt;
  <varname>Une boîte verte</varname>
&lt;/p&gt;
      </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>&#160;:</para>
      <mediaobject>
        <imageobject>
          <imagedata fileref="annexes/ex6.gif"/>
        </imageobject>
        <textobject>
          <phrase>La boîte jaune déborde vers le bas au-delà de la boîte verte</phrase>
        </textobject>
      </mediaobject>
      <para>La boîte flottante, plus longue que la boîte verte, <emphasis>déborde</emphasis> verticalement plus bas que celle-ci.</para>
    </section>
    <section id="solution">
      <title>La solution&#160;: le <emphasis>spacer</emphasis>
      </title>
      <para>Pour éviter cet effet parfois disgracieux, la solution la plus répandue est le <emphasis>spacer</emphasis> de <ulink url="http://www.alistapart.com/stories/practicalcss/">Mark Newhouse</ulink>&#160;: elle consiste à inclure dans la boîte verte un élément bloc au contenu fictif (l'espace insécable <token>&amp;nbsp;</token>), doté de la propriété <token>clear</token> qui lui interdit d'être adjacent à une boîte flottante.</para>
      <para>En <acronym>HTML</acronym>&#160;:</para>
      <programlisting>
&lt;div class="<varname>verte5</varname>"&gt;
  &lt;p class="<varname>jaune5</varname>"&gt;
    <varname>Une boîte jaune flottant doté d'un contenu plus long&#8230;</varname>
  &lt;/p&gt;
  &lt;p&gt;
    <varname>Une boîte verte</varname>
  &lt;/p&gt;
  &lt;div class="<varname>spacer</varname>"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
      </programlisting>
      <para>En <acronym>CSS</acronym>&#160;:</para>
      <programlisting>
.jaune {
  background-color: <varname>#ffff00</varname>;
  float: right;
  width: <varname>100px</varname>;
  text-align: center;
  margin: <varname>0</varname>;
}
.verte {
  width: <varname>100%</varname>;
  background-color: <varname>#00ff00</varname>;
}
.spacer {
  clear: both;
}
      </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/ex7.gif"/>
        </imageobject>
        <textobject>
          <phrase>La boîte jaune ne déborde plus vers le bas au-delà de la boîte verte</phrase>
        </textobject>
      </mediaobject>
      <para>Le bloc <emphasis>spacer</emphasis>, ne pouvant se placer <emphasis>à côté</emphasis> du bloc flottant, se trouve décalé <emphasis>plus bas</emphasis> que celui-ci.</para>
      <note>
        <para><acronym>IE</acronym> a parfois quelques difficultés à représenter correctement les arrières-plans et les bordures dans les combinaisons intégrant des boîtes flottantes à droite et des séparateurs dotés de la propriété <token>clear: both</token>.</para>
      </note>
    </section>
    <section id="vignettes">
      <title>Les vignettes&#160;: une utilisation du <emphasis>spacer</emphasis> et des flottantes</title>
      <para>
        <ulink url="http://www.alistapart.com/stories/practicalcss/"><personname><firstname>Mark</firstname><surname>Newhouse</surname></personname></ulink> appliquait en particulier cette solution à une série de boîtes flottantes placées dans une boîte conteneur dont le contenu propre se réduit au spacer&#160;: elle ne sert qu'à créer une boîte délimitant l'espace visuel où s'affichent les boîtes flottantes.</para>
      <para>En <acronym>CSS</acronym>&#160;:</para>
      <programlisting>
.flottante {
  background-color: <varname>#00ff00</varname>;
  border: <varname>2px </varname>dotted <varname>#ffff00</varname>;
  margin: <varname>2px</varname>;
  float: left;
  width: <varname>100px</varname>;
  text-align: center;
}
.conteneur {
  width: <varname>100%</varname>;
}
.spacer {
  clear: both;
}
      </programlisting>
      <para>En <acronym>HTML</acronym>&#160;:</para>
      <programlisting>
&lt;div&gt;
  &lt;p class="<varname>flottante</varname>"&gt;<varname>boîte verte 1</varname>&lt;/p&gt;
  &lt;p class="<varname>flottante</varname>"&gt;<varname>boîte verte 2</varname>&lt;/p&gt;
  &lt;p class="<varname>flottante</varname>"&gt;<varname>boîte verte 3</varname>&lt;/p&gt;
  <varname>&#8230;etc&#8230;</varname>
  &lt;div class="<varname>spacer</varname>"&gt;<varname>&amp;nbsp;</varname>&lt;/div&gt;
&lt;/div&gt;
      </programlisting>
      <para>On obtient une série de vignettes pouvant accueillir par exemple des images, les liens d'un menu de navigation, etc. ou encore permettant de réaliser une mise en page en colonnes&#8230; Elle s'adapte automatiquement à la largeur d'affichage disponible&#160;: faute de place à <emphasis>droite</emphasis>, une boîte flottante sera replacée <emphasis>à la ligne</emphasis>.</para>
      <para>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <ulink url="annexes/annexe1.html#ex4">l'exemple 4</ulink></para>
      <mediaobject>
        <imageobject>
          <imagedata fileref="annexes/ex8.gif"/>
        </imageobject>
        <textobject>
          <phrase>6 vignettes alignées de gauche à droite sur deux lignes</phrase>
        </textobject>
      </mediaobject>
    </section>
    <section id="hr">
      <title>Une variante du <emphasis>spacer</emphasis>&#160;: <token>&lt;hr /&gt;</token></title>
      <para>Le défaut du <emphasis>spacer</emphasis> est d'introduire dans le code <acronym>HTML</acronym> un contenu fictif à des fins de présentation&#8230;</para>
      <para>Lorsque la boîte adjacente à la boîte flottante est suivie d'une coupure logique dans votre page (nouvelle section de texte&#8230;), il est préférable d'associer la propriété <token>clear</token> à un contenu réel. La ligne horizontale créée par la balise <token>&lt;hr /&gt;</token> peut jouer avantageusement ce rôle&#160;:</para>
      <para>En <acronym>HTML</acronym>&#160;:</para>
      <programlisting>
&lt;p class="<varname>jaune</varname>"&gt;
  <varname>Une boîte jaune flottant doté d'un contenu plus long&#8230;</varname>
&lt;/p&gt;
&lt;p class="<varname>verte</varname>"&gt;
  <varname>Une boîte verte</varname>
&lt;/p&gt;
&lt;hr /&gt;
      </programlisting>
      <para>En <acronym>CSS</acronym>&#160;:</para>
      <programlisting>
.jaune {
  background-color: <varname>#ffff00</varname>;
  float: right;
  width: <varname>100px</varname>;
  margin: 0;
}
.verte {
  background-color: <varname>#00ff00</varname>;
}
hr {
  clear: both;
}
      </programlisting>
      <para>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <ulink url="annexes/annexe1.html#ex5">l'exemple 5</ulink></para>
      <mediaobject>
        <imageobject>
          <imagedata fileref="annexes/ex9.gif"/>
        </imageobject>
        <textobject>
          <phrase>La ligne horizontale en bas de la boîte verte empêche le débordement de la boîte jaune</phrase>
        </textobject>
      </mediaobject>
      <para>La ligne de séparation s'avère très utile pour les utilisateurs de navigateurs qui ne tiendront pas compte de la feuille de style (navigateurs textes, navigateurs périmés&#8230;) Il est possible de leur en réserver l'affichage, en le supprimant dans les navigateurs qui appliqueront la feuille de style, à l'aide de la propriété <token>visibility: hidden;</token>: celle-ci rend un élément invisible, tout en le laissant agir sur le flux.</para>
      <programlisting>
hr {
  clear: both;
  visibility: hidden;
}
      </programlisting>
      <para>Le résultat (figure ci-dessous et <ulink url="annexes/annexe1.html#ex6">exemple 6</ulink>) est visuellement identique au <emphasis>spacer</emphasis> précédent.</para>
      <mediaobject>
        <imageobject>
          <imagedata fileref="annexes/ex7.gif"/>
        </imageobject>
        <textobject>
          <phrase>La boîte jaune ne déborde plus vers le bas au-delà de la boîte verte</phrase>
        </textobject>
      </mediaobject>
      <para>Et appliqué à la série de vignettes flottantes, le résultat, illustré par la figure ci-dessous, peut être observé également dans <ulink url="annexes/annexe1.html#ex7">l'exemple 7</ulink>&#160;:</para>
      <mediaobject>
        <imageobject>
          <imagedata fileref="annexes/ex8.gif"/>
        </imageobject>
        <textobject>
          <phrase>6 vignettes alignées de gauche à droite sur deux lignes</phrase>
        </textobject>
      </mediaobject>
      <para>Nous aborderons les derniers types de positionnement <acronym>CSS</acronym> dans <ulink url="/articles/initiation_absolue/">initiation au positionnement <acronym>CSS</acronym>&#160;: 3.position absolue et fixe</ulink>.</para>
    </section>
  </section>
</article>
