Quand ça flotte, IE voit double

IE Doubled Float-Margin Bug

4 décembre 2006,
par Romy Têtue

Mots-clefs associés à cet article :

Pour positionner un élément en CSS, on utilise très facilement float [1] agrémenté d’un margin pour le tenir à distance respectable. Par exemple :

<div style="float: right; margin-right: 23px;">
        Bloc flottant à droite,
        avec une marge droite de 23 pixels.
</div>

Ce qui produira l’affichage suivant (à quelques couleurs prés) :

Mais tout se gâte avec Internet Explorer, le navigateur de Microsoft, où le même code produit un affichage différent :

Au lieu de positionner correctement le bloc à 23 pixels du bord, IE le décale excessivement et, dans certains cas l’envoie même se balader en dessous de tout. Pourquoi ? IE double mystérieusement la valeur de la marge.

Notons que ce bug ne se produit que sous IE pour Windows, avec un float et un margin de mêmes directions (ici right). Ouf, c’est déjà ça de gagné !

Comment remédier à ce bug IE ?

- Première solution : recoder à part pour IE/Win, en divisant la marge par deux. C’est ce que j’ai d’abord fait dans un premier temps, surchargeant ma feuille de style externe de hacks spéciaux pour IE/Win, de ce genre :

div { float: right; margin-right: 11px; }
*> div { margin-right: 23px; }

On déclare les propriétés nécessaires, mais avec la marge divisée par deux, sachant qu’IE/Win va la doubler. Puis on indique la valeur correcte, après le sélecteur > non reconnu par IE/Win. Avons-le, c’est très laid. De plus, dans mon exemple, 23 n’étant pas divisible par deux, le positionnement devient aproximatif sous IE/Win (à un pixel près, certes, mais ce n’est tout de même pas très sérieux).

- Seconde solution : placer le float et le margin sur des éléments différents. Dans l’ensemble d’une mise en page, on peut parfois s’arranger avec les autres éléments pour répartir les float et leurs espacements sur des blocs différents. Sinon, vous en êtes réduite à surcharger votre code en rajoutant une div englobante, de cette façon :

<div style="float: right;">
        <div style="margin-right: 23px;">
                Bloc flottant à droite,
                avec une marge droite de 23 pixels.
        </div>
</div>

- Troisième solution : ajouter display: inline; à l’élément flottant :

<div style="float: right; margin-right: 23px; display: inline;">
        Bloc flottant à droite,
        avec une marge droite de 23 pixels.
</div>

Normalement, la propriété display est ignorée (sauf si sa valeur est none) sur les éléments flottants, qui sont nécessairement de type block [2]. Cela a cependant un effet sous IE, qui cesse mystérieusement de doubler la marge.

Cette dernière solution, pour si efficace qu’elle soit, n’en reste pas moins imparfaite. Elle peut poser problème dans certains cas, par exemple pour construire une liste horizontale.

{#TITRE,#URL_ARTICLE,#INTRODUCTION}

Vos commentaires

  • Le 5 décembre 2006 à 15:04, par Igor En réponse à : Quand ça flotte, IE voit double

    Bonjour Romy,

    Plutôt que faire ce vilain hack ;-), il faut mieux utiliser les commentaires conditionnels pour tous ces problèmes avec IE.

  • Le 20 décembre 2006 à 12:28, par Romy Têtue En réponse à : Quand ça flotte, IE voit double

    Oui, aussi. Mais attention, ces commentaires conditionnels se placent, non pas dans la feuille de style CSS, mais dans la page HTML. Par exemple :

    <!--[if IE]>
       ..ici, code HTML réservé à IE...
    <![endif]-->


    Ça sous-entend donc soit de faire des feuilles de styles externes différentes, soit de coder le CSS dans la page HTML, ce qui n’a pas ma faveur.

    Pour filtrer le navigateur directement dans la feuille de style, voici quelques hacks CSS (par ultra-fluide).

  • Le 21 décembre 2006 à 15:19, par Igor En réponse à : Quand ça flotte, IE voit double

    Lorsque je les utilise j’appelle une feuille externe par les commentaires conditionnels avec les correctifs pour la ou les versions d’IE posant problème :

    <link rel="stylesheet" type="text/css" href="toutlemonde.css" />
    <!--[if IE]>
    <link rel="stylesheet" type="text/css" href="ie.css" />
    <![endif]-->
  • Le 15 décembre 2007 à 19:41, par Marco En réponse à : Quand ça flotte, IE voit double

    Franchement bien sympa l’histoire du display ça m’a sauvé la mise je te remercie ;D

  • Le 30 mai 2008 à 12:23, par Ariakan En réponse à : Quand ça flotte, IE voit double

    Juste un petit message pour dire merci !
    Je vérifiais mon design sous Firefox, IE7, Safari 3, Opéra 9 et....IE6 qui buggait.
    Maintenant je connais le pourquoi du comment !

  • Le 13 juin 2008 à 11:40, par Manar En réponse à : Quand ça flotte, IE voit double

    j’aime bien ce truc de condition IE, on peut faire dns le même css deux classes par exemple(float et float_ie) et faire appel à l’une ou l’autre :

    <div class="float
    <!--[if IE]>
    _ie
    <![endif]-->
    "
     >
    je ne sais pas si c'est propre ou pas??!!
    </div>
  • Le 15 décembre 2008 à 11:46, par BobDole En réponse à : Quand ça flotte, IE voit double

    non c’est meme tres vilain

    vilain vilain !

Répondre à cet article

forum message

Raccourcis : {{gras}} {italique} -liste [bla->url] <q> <quote> <code>.

Qui êtes-vous ? (optionnel)

Suivre les commentaires : RSS 2.0 | Atom