Billet du blogue

Nombres impairs et pourcentages en CSS

Prenez le code HTML suivant :

<ul id="maliste">
  <li>Élément I</li>
  <li>Élément II</li>
<ul>

Ainsi que le code CSS :

ul#maliste {
  width: 100%;
  overflow: hidden;
}

ul#maliste li {
  width: 50%;
  float: left;
}

Cela fonctionne dans tous les navigateurs. Le résultat est nos deux éléments LI un à côté de l’autre.

Vous remarquerez que la largeur de l’élément UL est égal à 100% ce qui signifie qu’il prend la pleine largeur de son parent. Si son parent a une largeur de 600 pixels, la liste aura une largeur de 600 pixels. Chaque item de la liste aura une largeur de 300 pixels. Ils seront donc côte-à-côte, comme nous le voulons.

Cependant, admettons que la largeur du parent de la liste est un nombre impair de pixels, par exemple, 601 pixels. La liste sera donc large de 601 pixels. Chaque item de la liste sera égal à la moitié de 601 pixels.

Mais comment est calculée cette valeur? Hé bien il semblerait que chaque navigateur a sa propre méthode d’ajuster les largeurs.

Mise à jour : J’ai préparé un petit fichier JPEG qui illustre le comportement des navigateurs :

Captures d'écran des différents navigateurs

  • Firefox semble ajuster la largeur d’un des items pour que tout l’espace soit pris. Cela veut donc dire que les items ne sont plus de la même largeur.
  • Internet Explorer (6 et 7) arrondi les largeurs des items à la hausse. Cela veut donc dire que la somme de la largeur respective des items est supérieure à 100%. Cela veut aussi dire que les items ne sont plus côte-à-côte.
  • Safari (et Opera) arrondissent les largeurs des items à la baisse. Cela empêche le deuxième item de tomber sous le premier, mais cela veut aussi dire que les deux items sont de largeur différentes et qu’ils ne remplissent pas l’espace à 100%.

Je ne sais pas si ce problème avait été exposé auparavant, mais en tout cas, c’est bon à savoir!

Posté le avec les tags: , , , , et .

Commentaires fermés

Les commentaires pour ce billet ont été désactivés un mois après la date de publication de ce-dernier. Vous désirez exprimer votre opinion sur ce billet malgré le fait que les commentaires aient été désactivés ? Utilisez le formulaire de contact.


Fil atom des commentaires de ce billet11 commentaires

  • John Resig en a parlé il y a très peu de temps avec des explications sur les contraintes qui poussent les navigateurs à faire des choix.

    Rik (25 janvier 2008 à 15:27 EST)

  • Comme j’ai rarement codé du liquid ou des pourcentages, je ne m’étais jamais attardé à cette problematique. Excellent résumé! C’est bon à savoir!

    • Mention d’honneur à Firefox 2!

    • Merci à safari et opera d’au moins mettre les éléments côte à côte …

    • Fuck you à IE, comme toujours!

    pm (25 janvier 2008 à 16:37 EST)

  • John Resig en a parlé il y a très peu de temps avec des explications sur les contraintes qui poussent les navigateurs à faire des choix.

    Ah ben maudit… Comment j’ai raté ça? Je suis abonné à son blogue via son fil RSS

    Rémi Prévost (25 janvier 2008 à 17:25 EST)

  • Et ma copine Web designer de me dire :

    C’est pour ça qu’il ne faut jamais designer avec des nombres impairs!

    Rémi Prévost (25 janvier 2008 à 21:12 EST)

  • Même genre de bug (en fait ce n’est pas un bug mais un comportement logique) avec le positionement de background centrés.

    Disons qu’un background a exactement la même largeur que le #wrap d’un site pour simuler height: 100% d’une colonne, le tout bien centré dans le browser. Et bien le site sera décallé d’un pixel dans certaines valeur de largeurs.

    Antoine (26 janvier 2008 à 11:01 EST)

  • Hello,

    C’est effectivement assez troublant. J’avais remarqué ça il y a quelques temps maintenant (en 2005 je crois) : histoires de pourcentages et d’arrondis

    Raphael (28 janvier 2008 à 4:58 EST)

  • A savoir que pour faire des blocs en 50/50, la solution peut être de mettre, dans cet ordre, un bloc floaté en right à 50% et le 2e floaté en left, toujours à 50%.

    Guyllaume Doyer (29 janvier 2008 à 15:40 EST)

  • A savoir que pour faire des blocs en 50/50, la solution peut être de mettre, dans cet ordre, un bloc floaté en right à 50% et le 2e floaté en left, toujours à 50%.

    Malheureusement, cela ne peut pas fonctionner puisqu’Internet Explorer arrondira encore la largeur des deux éléments à la hausse, ce qui provoquera un chevauchement qui fera en sorte que le deuxième élément tombera sous le premier.

    Rémi Prévost (29 janvier 2008 à 16:17 EST)

  • Malheureusement, cela ne peut pas fonctionner puisqu’Internet Explorer arrondira encore la largeur des deux éléments à la hausse, ce qui provoquera un chevauchement qui fera en sorte que le deuxième élément tombera sous le premier.

    Au temps pour moi, j’ai oublié d’indiquer une partie importante de ma solution : pour IE, il suffit de mettre une largeur de blocs de 49.99% et oh magie, ca marche !

    Guyllaume Doyer (30 janvier 2008 à 13:36 EST)

  • Au temps pour moi, j’ai oublié d’indiquer une partie importante de ma solution : pour IE, il suffit de mettre une largeur de blocs de 49.99% et oh magie, ca marche !

    Hmm.. je viens de l’essayer, et ça ne fonctionne pas. Les deux éléments sont côte à côte, mais il y a un espace d’un (1) pixel entre les deux.

    Rémi Prévost (30 janvier 2008 à 15:26 EST)

  • Dans le principe j’aurais plutot tendance à ne fixer la taille que du premier bloc, en float left. Comme ça le deuxieme prends la place qu’il reste (enfin normalement)

    Palleas (7 février 2008 à 7:42 EST)