Plan de site Navigation
Blog & Blues Techniques et Standards de la Qualité Web

Accueil > weblog


- Lire le billet précédent - Lire le billet suivant -

Des colonnes de même hauteurs en CSS

Par Laurent Denis, le 24 septembre 2004.

Faute de temps pour détailler, voici brièvement une technique CSS permettant d'obtenir :

  • Deux colonnes (ou plus) de largeur au choix fixe ou variable ;
  • De hauteur apparente identique quelque-soit leur contenu, dans les navigateurs ayant un support CSS suffisant, avec une dégradation correcte de cette présentation dans IE Windows 5+ ;
  • Et un pied de page stable quelque-soit la hauteur des colonnes.

Une solution en float et display:table

Aux vues de ces exigences :

  • La présence du pied de page sur toute la largeur de la page exclut d'emblée le recours au positionnement absolu : la hauteur des colonnes étant imprévisibles, les risques de chevauchement sont évidents.
  • Le passage par display:table-cell est nécessaire pour forcer nos colonnes à avoir une même hauteur. Cette propriété étant supportée dans Opera 5+, Mozilla-FireFox et Safari, les flottants seront notre solution de repli dans Internet Explorer Windows.

Le positionnement des colonnes repose donc sur :

  • Un #conteneur {display: table}, ainsi qu'un display: table-cell et un height: 100% pour chaque colonne, afin de les forcer à occuper tout l'espace vertical du conteneur ;
  • Un simple {float: left} sur la colonne de gauche suffit à IE Windows (Nous l'annulons pour les autres navigateurs avec un html>body#gauche {float:none}). L'utilisation judicieuse des couleurs d'arrière-plan et des bordures permet en outre d'y donner l'illusion de colonnes identiques dans une grande partie des cas ;
  • #pied {clear:both} suffit à veiller à ce que notre pied de page soit toujours bien à sa place en fin de page, sans risquer d'être recouvert par l'une des colonnes.

La feuille de style finale est consultable dans cette série d'exemples.

Notons que cette solution permet de placer le contenu principal en premier dans le document HTML (le menu éventuel ne venant qu'après).

Note d'humeur

Enfin, face à ce que je lis à droite et à gauche dans des blogs et dans des forums, ce billet aurait pu s'intituler IE, cessez de brailler, et utilisez un peu mieux votre énergie pour promouvoir les Standards : devant les lacunes de support CSS d'Internet Explorer Windows, la mode est à un douteux mélange de critiques justifiées, de troll et de FUD sur un thème plutôt stérile : "IE Sapu, je peux pas faire ma CSS".

Or, l'un des enjeux des CSS est justement de permettre une gestion facilitée des différences de capacité des navigateurs, par le biais de cette dégradation correcte. Là où les documents mêlant structure et présentation devraient être déclinés en plusieurs versions, nous n'avons à tenir compte de ces différences que dans la seule feuille de style, ce qui est un progrès considérable. Il serait temps de se mettre à l'expliquer en pratique.

Il serait donc plus utile d'inventorier exactement ces lacunes, de déterminer et de diffuser les solutions de remplacement, et de faire la part des obstacles réels.

Trackbacks

Les trackbacks pour ce billet sont temporairement fermés en raison d'une série d'attaques de spam.

Commentaires

nando, le 24 septembre 2004

> l'un des enjeux des CSS est
> justement de permettre une
> gestion
> facilitée des différences de
> capacité des navigateurs,
> par le biais de cette
> dégradation correcte

La note est juste et corrige moi si je trompe.

On (ou je) a pris l'habitude de prendre IE 5.x et 6.x comme de mauvais éléves (ils l'ont cherché quand même smiley sourire alors qu'on aurait pu les voir à la lumière de la diversité.

Jouer avec toute les diversités est en fait difficile. Les standards palient aussi cette difficulté, mais ils ne mettent pas à l'abri des nouveaux moules de pensée.

Laurent Denis, le 24 septembre 2004

"Diversité" est peut-être un peu fort, IE étant indéniablement un des mauvais élèves CSS actuels. Mais:
- les lecteurs d'écran, par exemple, sont de bien plus mauvais élèves CSS-HTML-WAI, et pourtant, on se préoccupe avant tout de s'en accomoder.
- la question de fond pour IE est AMHA, actuellement : "qu'est-ce qui serait vraiment un obstacle infranchissable à l'utilisation avancée de CSS dans ce qu'il ne sait pas faire ?"

Raphael Goetter, le 24 septembre 2004

Bravo pour ces explications et cette technique que je n'avais encore jamais vue.

Comme je te l'ai écrit sur le Hub, j'avoue que ce principe est très convainquant.

Reste l'éternel problème de la "dégradation correcte" pour les nombreuses personnes qui **veulent** (et je peux les comprendre) que les colonnes s'adaptent aussi sur IE, ce qui n'est malheureusement pas le cas.

Un client professionnel par exemple ne validera pas un site qui ne s'affiche pas **correctement** sur IE.

Sylvain Trovalet, le 24 septembre 2004

Toujours dans la même idée :

perso.wanadoo.fr/sylvain....

J'ai testé sous ie6/winXP et firefox 1.0PR/winXP.
A noter qu'il manque le border du bas du tableau et là j'avoue ne pas avoir d'idée

Sylvain Trovalet, le 24 septembre 2004

désolé c'était stupide cela aboutit au même résultat que Laurent avait obtenuen légèrement moins bien de sûrcroit

Kévin, le 24 septembre 2004

On revient à l'éternel problème, évoqué récemment sur Cybercodeur (offline pour l'instant) , qui est celui des hacks , comme celui utilisé avec le html>body #gauche ...

Est-ce qu'on peut considéré un code "valide" lorsqu'il y'a des redondances comme ca ?

Laurent Denis, le 24 septembre 2004

@Kevin > ne sautons pas à la conclusion au seul mot de "hack", surtout en brandissant un peu vite l'invalidité smiley clin d'oeil

- #gauche {float: left} est un code valide,
- html>body #gauche {float: none} est un code valide,
- les deux réunis restent valides : rien ne dit rien dans aucune spécification CSS sur la redondance du point de vue validité.

Bien-sûr, c'est un hack, même valide et des plus mineurs. Et donc potentiellement problématique. Imaginons un navigateur implémentant display:table à la manière de Mozilla, mais pas le sélecteur d'enfant : le layout se casse immédiatement la figure à cause du float.
On pourrait aussi bien (je n'ai pas testé) utiliser !important, voire le sélecteur universel... Tout hack est un risque potentiel, mais celui-ci a le double avantage de ne détourner aucune syntaxe et d'avoir des solutions de repli en cas de besoin.

Eric Daspet, le 24 septembre 2004

Pour corriger les erreurs et les compenser ... IE7 ne serait-il pas la bonne solution ? plutot que de multiplier les hacks on aurait une couche de compatibilité.

Laurent Denis, le 24 septembre 2004

@Eric > je n'arrive pas à être convaincu par IE7. Cette idée d'un "patch" au choix global ou ciblé est assez séduisante. Mais :
- IE7 suppose javascript... Le hack CSS ne suppose rien.
- C'est une couche supplémentaire à mettre en place, à télécharger et à traiter côté navigateur, là où les hacks CSS "minimalistes" sont beaucoup lus directs et plus simples à mettre en oeuvre. L'investissement me paraît excessif.

Kevin, le 25 septembre 2004

Tout à fait d'accord pour la W3C validité, mais je parlais de la validité que l'on accorde au code. Il est très simple de faire quelque chose de complêtement farfelu, avec des redondances, etc, et qui est validé par le W3C ... Et pourtant, si on regarde le code, on dira que c'est vraiment codé comme un cochon ...


Pour IE7, il y'a plusieurs problèmes, entre autre effectivement le Javascript, qui suppose un navigateur le supportant, mais il y'a aussi le problème de la lenteur pour effectuer les modifications ...

Laurent Denis, le 25 septembre 2004

@Kevin > Distinguons quatre problèmes en matière de CSS :

- la validité formelle, pour laquelle le validateur W3C (par exemple) apporte une réponse immédiate,

- la validité réelle, c'est à dire ce que les limites actuelles du validateur mécanique ne lui permettent pas de vérifier,

- l'abus, c'est à dire "je fais en CSS ce qui devrait être dans le (X)HTML", généralement à coup de contenu généré et de mise en forme du balisage générique (simulation de titre avec des divs...)

- l'élégance, c'est à dire "la page est-elle valide à tous points de vue mais on pourrait franchement faire ça plus proprement".

Sinon, pour javascript, par les temps qui courent, ce ne sont pas seulement les navigateurs sans supports javascript qui sont intéressants, mais plutôt ceux où le support javascript a été désactivé pour raison (rationelle ?) de sécurité.

Gloom, le 27 septembre 2004

IE7, c'est bien un surcouche qui utilise abusivement le nom IE7 ?

Laurent Denis, le 27 septembre 2004

@Gloom > voir dean.edwards.name/IE7/

Mikeul, le 12 octobre 2004

J'ai utilisé cette technique légèrement retouchée avec un autre site sans pb, mais j'ai tenté de l'appliquer à mikeul.grandmanitou.net/d... avec un effet secondaire dont je n'arrive pas à me débarrasser sous Firefox (pas de pb avec IE).

Sur le site, le post le plus récent (en haut donc) ne colle pas au début du div de gauche (#content dans mon cas, l'équivalent de #gauche dans l'exemple).

Impossible de trouver la cause de ce décalage. J'ai modifié les marges, les paddings, j'ai même supprimé les sauts de ligne dans le code source, mais rien à faire.

Si une âme charitable peut m'aider... :o)

Mikeul, le 13 octobre 2004

Il semblerait que j'ai ma réponse. La suppression d'un tableau dans la colonne de droite (le caldendrier de Dotclear) a tout ramené à sa place.

Un tableau dans un div en display:table-cell, c'est un comportement connu ?

Laurent Denis, le 14 octobre 2004

@Mikeul> "Un tableau dans un div en display:table-cell, c'est un comportement connu ?"
Non smiley clin d'oeil Mais je soupçonne simplement un problème de gestion des largeurs (le calendrier DotClear ayant une largeur fixe). Auquel cas le problème serait identique avec une image de taille correspondante... A tester, donc.

deebz, le 03 février 2005

Et avec 3 colones (une autre menu à droite) ?

Car j'ai du mal la..

loloajax, le 15 septembre 2005

Effectivement, pour 3 colonnes (ou plus) ayant chacune une couleur différente, on ne peut peut pas les "faire descendre" jusqu'en bas.
Dans l'exemple ci-dessus, la couleur du bas de la 2eme colonne est la meme que celle du conteneur, forcément ça aide smiley clin d'oeil

Si quelqu'un a la réponse...

Laurent Denis, le 15 septembre 2005

Pour trois colonnes avec cette technique, voir test.blog-and-blues.org/c...

loloajax, le 16 septembre 2005

Toujours le même problème !
Comment faire pour avoir trois colonnes de trois couleurs différentes ?

Si on applique une troisième couleur à la colonne de droite, ça ne descend pas jusqu'en bas...

jimro, le 23 novembre 2005

Peut-être une solution ici :
www.zdnet.fr/builder/web_...
(fonctionne sous IE6 et Firefox 1.0.x)

Les commentaires pour ce billet sont temporairement fermés en raison d'une série d'attaques de spam.