Simuler min-height sur Internet Explorer 6

Ceci est le premier article d’une longue série. Au fil de mes expériences dans le Web, j’essaierai de vous faire connaître les problèmes que je rencontre au quotidien et les solutions que je trouve pour les régler.

Dans cet article, je vais vous montrer comment simuler le comportement de min-height, une propriété CSS très utile mais très peu jamais utilisée car non comprise par Internet Explorer 6 et inférieurs (au même titre que max-height, max-width et min-width).

Il existe plusieurs solutions pour arriver à nos fins. La première consiste à exploiter la mauvaise interprétation par IE6 des propriétés height et width. En effet, sur IE6, si le contenu d’un bloc dépasse la largeur ou la hauteur définie, le bloc va s’agrandir, ce qui n’est pas le comportement normal (dicté par le W3C). On utilise aussi la non compréhension par IE6 de l’argument CSS !important. Ce dernier permet à l’attribut auquel il est ajouté de prendre le pas sur tous les mêmes autres attributs qui pourraient se trouver à l’intérieur de la même class ou du même id :

selector {
  min-height:500px;
  height:auto !important;
  height:500px;
}

Comment IE6 va l’interpréter ?

Il ne va pas comprendre min-height ni !important (qu’il est bête) mais uniquement height. Comme height se comporte comme min-height devrait se comporter (s’il était compris), on a bien une taille minimum de 500 pixels.

Comment les navigateurs modernes (IE7, Firefox, Opera, etc.) vont l’interpréter ?

Ils vont lire le min-height et les deux height mais prendre en priorité height:auto. Comme auto est la valeur par défaut de height, c’est comme si la propriété n’existait pas. On a bien une taille minimum de 500 pixels.

La deuxième solution consiste à faire appel à un fichier JavaScript qui va tout faire tout seul. Il suffit de l’inclure uniquement dans le cas où le navigateur est IE6 ou inférieur, via un commentaire conditionnel. Cette solution est la moins élégante (quid des gens qui désactivent JavaScript) mais de loin la plus facile à intégrer.

Ajouter ces quelques lignes dans le head de votre fichier (X)HTML :

<!--[if lte IE 6]>
   http://minmax.js
<![endif]-->

Le fichier minmax.js est téléchargeable sur cette page. Tous les min-height, max-height, min-width et max-width seront interprétés sur IE6 via ce fichier JavaScript (avec un petit temps de latence).

Les commentaires conditionnels sont des commentaires uniquement interprétés par Internet Explorer. Vous en trouverez une excellente explication chez Laurent Denis. Dans le cas qui nous occupe, le fichier JavaScript ne sera appelé que si le navigateur est inférieur ou égal à IE6.

Si vous avez des problèmes de compatibilité avec vos XHTML et CSS, n’hésitez pas à m’expliquer le problème dans les commentaires. Si je l’ai déjà expérimenté, j’essaierai de vous apporter la (ou les) solutions pour les résoudre.

Sources :

* Le Hack CSS !important
* Min-Height Fast Hack
* Les syntaxes de commentaires conditionnels pour IE Windows
* minmax.js

20 Comments

  1. Je découvre ton blog également suite à ton commentaire chez moi, très sympa, je repasserai régulièrement … allez hop, dans le blogroll ! 🙂

    Like

  2. Simay's avatar Simay says:

    bien vu, personnellement, je n’utilisais que le hack en js…

    Et hop blogmarké!

    Like

  3. Pingback: Infobulles.ch
  4. Mich's avatar Mich says:

    J’ai ça moi:

        .infobubble {
            /*width:215px;*/
            max-width:300px;
            max-height:220px;
            height: expression(this.scrollHeight > 220? 220 : true);
            width: expression(this.scrollWidth > 300? 300 : true);
            overflow:auto;
        }
    

    Like

  5. Unknown's avatar Tigibus says:

    Bien vu et sympa de prendre le temps de donner tout ces petits conseils aux autres qui sont en gélère !

    Like

  6. devboy's avatar devboy says:

    étrangement je n’arrive pas a mes fins

    j’ai placé le if dans le javascript
    j’ai j’ai placé minmax.js au niveau de mon fichier php qui se trouve lui-même au niveau de mon fichier css

    et je n’arrive toujours pas à utiliser min-width sous ie6

    Like

  7. devboy's avatar devboy says:

    oups un ptit correctif par rapport au post précédent

    j’ai placé mon if dans le head de mon fichier php

    Like

  8. Unknown's avatar cosby says:

    super astuce merci!!

    j’avais presque trouvé tout seul mais il me manquait la mention !important placée au bon endroit.

    Like

  9. Nicolas G's avatar Nicolas G says:

    Merci pour le tuyaux,

    Like

  10. Merci beaucoup. Très utile.

    Like

  11. wassio's avatar wassio says:

    merci pour cette explication c’est très interrissant

    Like

  12. Odinsey's avatar Odinsey says:

    Le problème est que minmax.js est incompatible avec le menu déroulant superfish. à moins que tu ai une solution 😉

    Like

  13. Alexis's avatar Alexis says:

    Exactement ce que je cherchais et ça marche nickel !

    Merci

    Like

  14. Hayes's avatar Hayes says:

    Absolument génial : simple et efficace !

    Merci

    Like

  15. Adrien's avatar Adrien says:

    Personnellement j’ai testé et je ne vois pas comment sa peut fonctionner.

    Car supposons qu’on a une div qui grandisse en fonction du contenu :

    #popup_content{

    min-height:199px;
    height: auto !important;
    height: 199px;
    }

    je ne vois pas comment le auto sera pris en compte si le contenu de la div depasse les 199px.

    Like

  16. vinch's avatar Vinch says:

    height:auto va être pris en compte en priorité via la mention !important http://webdesign.about.com/od/css/f/blcssfaqimportn.htm

    Like

  17. Adrien's avatar Adrien says:

    Oui mais ie6 ne comprend pas le !important si je ne me trompe. Donc dans le cas ie6
    min-height: il connait pas donc passe à
    height: auto !important : il ne connait pas,
    donc a chaque fois il utilisera le height 199px !

    Like

  18. vinch's avatar Vinch says:

    Oui on joue sur le fait que IE6 ne connait pas !important et que le height dans IE6 se comporte comme min-height. Relis bien l’article (plusieurs fois) et teste pour t’apercevoir que ça fonctionne 😉

    Like

  19. Adrien's avatar Adrien says:

    En faite sa marche dans un exemple tout seul, mais pas dans mon projet 😉

    Like

Leave a reply to Simay Cancel reply