<!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 - Initiation au positionnement CSS : 2.position float</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="initiation_float" />
    <meta name="DC.Creator" content="Laurent Denis" />
    <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="expert, mise_en_page, css" />
  </head>
  <body>
    <h1>Initiation au positionnement CSS : 2.position float</h1>
    <ul>
      <li>
        <strong>Profil :</strong> <a href="/expert/">Expert</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:laurent.denis%40openweb.eu.org">Laurent Denis</a>
      </li>
      <li>
        <strong>Mise à jour :</strong> 21/03/2003</li>
    </ul>
    <h2>En bref</h2>
    <p>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 title="Cascading Style Sheets" lang="en">CSS</acronym> ?</p>
    <hr />
    <p>Cet article fait suite à l'<a href="/articles/initiation_flux/">initiation au positionnement <acronym>CSS</acronym> : 1.Flux et position relative</a>.</p>
    <p>Une boîte flottante est <strong>retirée du flux normal</strong>, et placée le plus à droite (<code>float: right</code>) ou le plus à gauche (<code>float: left</code>) possible dans son conteneur. <strong>Le contenu suivant cette boîte flottante s'écoule le long de celle-ci</strong>, dans l'espace laissé libre.</p>
    <h3>Le fonctionnement des flottants</h3>
    <p>Ajoutons aux styles précédents une règle de positionnement flottant à droite et une mesure de largeur (facultative, mais utile pour certains navigateurs) :</p>
    <p>En <acronym title="HyperText Markup Language" lang="en">HTML</acronym>:</p>
    <pre>
&lt;p class="jaune"&gt;Une boîte jaune flottant&lt;/p&gt;
&lt;p class="verte"&gt;Une boîte verte doté d'un contenu plus long…&lt;/p&gt;
</pre>
    <p>En <acronym>CSS</acronym>:</p>
    <pre>
.jaune {
  background-color: #ffff00;
  float: right;
  width: 100px;
  margin: 0;
}
.verte {
  background-color: #00ff00;
}
    </pre>
    <p>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <a href="annexes/annexe1.html#ex1">l'exemple 1</a>
    </p>
    <div><img src="annexes/ex5.gif" alt="Le texte de la boîte verte passe à la ligne à hauteur de la boîte jaune" /></div>
    <p>Le navigateur <em>place</em> 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 <em>passée</em> la limite inférieure de la boîte flottante jaune.</p>
    <p>Dans les navigateurs n'appliquant pas la feuille de style (navigateurs texte ou non conformes aux standards…), la boîte flottante sera simplement inscrite en flux normal avant la boîte qui la suit.</p>
    <h3>Première utilisation : une mise en page à deux colonnes</h3>
    <p>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) :</p>
    <p>En <acronym>CSS</acronym> :</p>
    <pre>
.content {
  float: left;
  width: 70%;
}
.menu {
  margin-left: 80%;
  border: 1px solid #000000;
  padding: 1em;
}
    </pre>
    <p>Et en <acronym>HTML</acronym> :</p>
    <pre>
…
&lt;body&gt;
  &lt;div class="content"&gt;
    …
  &lt;/div&gt;
  &lt;div class="menu"&gt;
    &lt;ul&gt;
      &lt;li&gt;lien_1&lt;/li&gt;
      &lt;li&gt;lien_2&lt;/li&gt;
      &lt;li&gt;lien_3&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
&lt;/body&gt;
    </pre>
    <p>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <a href="annexes/annexe2.html">la page-exemple 1</a>
    </p>
    <div><img src="annexes/ex15.gif" alt="Un menu dans la colonne droite flanquant le contenu de la page" /></div>
    <h3>Seconde utilisation : une mise en page à trois colonnes et plus</h3>
    <p>Mais on peut tout aussi bien multiplier les flottants pour créer autant de colonnes que voulu :</p>
    <p>En <acronym>CSS</acronym> :</p>
    <pre>
body {
  margin: 0;
  padding: 0;
}
.float {
  float: left;
  width: 25%;
  margin: 1em 0;
}
p,h1,h2 {
  margin: 1em;
}
    </pre>
    <p>Et en <acronym>HTML</acronym> :</p>
    <pre>
…
&lt;body&gt;
  …
  &lt;div class="float"&gt;
    …
  &lt;/div&gt;
  &lt;div class="float"&gt;
    …
  &lt;/div&gt;
  &lt;div class="float"&gt;
    …
  &lt;/div&gt;
  &lt;div class="float"&gt;
    …
  &lt;/div&gt;
&lt;/body&gt;
    </pre>
    <p>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <a href="annexes/annexe3.html">la page-exemple 2</a> :</p>
    <div><img src="annexes/ex17.gif" alt="Sous le titre, 4 colonnes d'égale largeur." /></div>
    <h3>Débordement et <em>spacer</em>
    </h3>
    <h4>Le probleme du débordement</h4>
    <p>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 :</p>
    <p>En <acronym>HTML</acronym> :</p>
    <pre>
&lt;p class="jaune"&gt;
  Une boîte jaune flottant doté d'un contenu plus long…
&lt;/p&gt;
&lt;p class="verte"&gt;
  Une boîte verte
&lt;/p&gt;
      </pre>
    <p>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <a href="annexes/annexe1.html#ex2">l'exemple 2</a> :</p>
    <div><img src="annexes/ex6.gif" alt="La boîte jaune déborde vers le bas au-delà de la boîte verte" /></div>
    <p>La boîte flottante, plus longue que la boîte verte, <em>déborde</em> verticalement plus bas que celle-ci.</p>
    <h4>La solution : le <em>spacer</em>
    </h4>
    <p>Pour éviter cet effet parfois disgracieux, la solution la plus répandue est le <em>spacer</em> de <a href="http://www.alistapart.com/stories/practicalcss/">Mark Newhouse</a> : elle consiste à inclure dans la boîte verte un élément bloc au contenu fictif (l'espace insécable <code>&amp;nbsp;</code>), doté de la propriété <code>clear</code> qui lui interdit d'être adjacent à une boîte flottante.</p>
    <p>En <acronym>HTML</acronym> :</p>
    <pre>
&lt;div class="verte5"&gt;
  &lt;p class="jaune5"&gt;
    Une boîte jaune flottant doté d'un contenu plus long…
  &lt;/p&gt;
  &lt;p&gt;
    Une boîte verte
  &lt;/p&gt;
  &lt;div class="spacer"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
      </pre>
    <p>En <acronym>CSS</acronym> :</p>
    <pre>
.jaune {
  background-color: #ffff00;
  float: right;
  width: 100px;
  text-align: center;
  margin: 0;
}
.verte {
  width: 100%;
  background-color: #00ff00;
}
.spacer {
  clear: both;
}
      </pre>
    <p>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <a href="annexes/annexe1.html#ex3">l'exemple 3</a>
    </p>
    <div><img src="annexes/ex7.gif" alt="La boîte jaune ne déborde plus vers le bas au-delà de la boîte verte" /></div>
    <p>Le bloc <em>spacer</em>, ne pouvant se placer <em>à côté</em> du bloc flottant, se trouve décalé <em>plus bas</em> que celui-ci.</p>
    <div>
      <strong>Note : —</strong>
      <p>
        <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é <code>clear: both</code>.</p>
    </div>
    <h4>Les vignettes : une utilisation du <em>spacer</em> et des flottantes</h4>
    <p>
      <a href="http://www.alistapart.com/stories/practicalcss/">Mark Newhouse</a> 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 : elle ne sert qu'à créer une boîte délimitant l'espace visuel où s'affichent les boîtes flottantes.</p>
    <p>En <acronym>CSS</acronym> :</p>
    <pre>
.flottante {
  background-color: #00ff00;
  border: 2px dotted #ffff00;
  margin: 2px;
  float: left;
  width: 100px;
  text-align: center;
}
.conteneur {
  width: 100%;
}
.spacer {
  clear: both;
}
      </pre>
    <p>En <acronym>HTML</acronym> :</p>
    <pre>
&lt;div&gt;
  &lt;p class="flottante"&gt;boîte verte 1&lt;/p&gt;
  &lt;p class="flottante"&gt;boîte verte 2&lt;/p&gt;
  &lt;p class="flottante"&gt;boîte verte 3&lt;/p&gt;
  …etc…
  &lt;div class="spacer"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
      </pre>
    <p>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… Elle s'adapte automatiquement à la largeur d'affichage disponible : faute de place à <em>droite</em>, une boîte flottante sera replacée <em>à la ligne</em>.</p>
    <p>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <a href="annexes/annexe1.html#ex4">l'exemple 4</a>
    </p>
    <div><img src="annexes/ex8.gif" alt="6 vignettes alignées de gauche à droite sur deux lignes" /></div>
    <h4>Une variante du <em>spacer</em> : <code>&lt;hr /&gt;</code>
    </h4>
    <p>Le défaut du <em>spacer</em> est d'introduire dans le code <acronym>HTML</acronym> un contenu fictif à des fins de présentation…</p>
    <p>Lorsque la boîte adjacente à la boîte flottante est suivie d'une coupure logique dans votre page (nouvelle section de texte…), il est préférable d'associer la propriété <code>clear</code> à un contenu réel. La ligne horizontale créée par la balise <code>&lt;hr /&gt;</code> peut jouer avantageusement ce rôle :</p>
    <p>En <acronym>HTML</acronym> :</p>
    <pre>
&lt;p class="jaune"&gt;
  Une boîte jaune flottant doté d'un contenu plus long…
&lt;/p&gt;
&lt;p class="verte"&gt;
  Une boîte verte
&lt;/p&gt;
&lt;hr /&gt;
      </pre>
    <p>En <acronym>CSS</acronym> :</p>
    <pre>
.jaune {
  background-color: #ffff00;
  float: right;
  width: 100px;
  margin: 0;
}
.verte {
  background-color: #00ff00;
}
hr {
  clear: both;
}
      </pre>
    <p>Le résultat, illustré par la figure ci-dessous, peut être observé également dans <a href="annexes/annexe1.html#ex5">l'exemple 5</a>
    </p>
    <div><img src="annexes/ex9.gif" alt="La ligne horizontale en bas de la boîte verte empêche le débordement de la boîte jaune" /></div>
    <p>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…) 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é <code>visibility: hidden;</code>: celle-ci rend un élément invisible, tout en le laissant agir sur le flux.</p>
    <pre>
hr {
  clear: both;
  visibility: hidden;
}
      </pre>
    <p>Le résultat (figure ci-dessous et <a href="annexes/annexe1.html#ex6">exemple 6</a>) est visuellement identique au <em>spacer</em> précédent.</p>
    <div><img src="annexes/ex7.gif" alt="La boîte jaune ne déborde plus vers le bas au-delà de la boîte verte" /></div>
    <p>Et appliqué à la série de vignettes flottantes, le résultat, illustré par la figure ci-dessous, peut être observé également dans <a href="annexes/annexe1.html#ex7">l'exemple 7</a> :</p>
    <div><img src="annexes/ex8.gif" alt="6 vignettes alignées de gauche à droite sur deux lignes" /></div>
    <p>Nous aborderons les derniers types de positionnement <acronym>CSS</acronym> dans <a href="/articles/initiation_absolue/">initiation au positionnement <acronym>CSS</acronym> : 3.position absolue et fixe</a>.</p>
  </body>
</html>
