Des colonnes de même hauteur en css sans utiliser de tableau
- 21-04-2010
- Posté dans css
- Écrire un commentaire
Comment avoir plusieurs balises <div> automatiquement de la même hauteur en fonction du contenu qui prend le plus de hauteur dans l'une des balises <div> ?
Et ceci, sans tableau, et fonctionnant sur tous les navigateurs ?
Les 3 colonnes de départ
Code HTML
<div id="col1" class="sameHeightCol">Colonne 1</div>
<div id="col2" class="sameHeightCol">Colonne 2<br/>contenu supplémentaire</div>
<div id="col3" class="sameHeightCol">Colonne 3</div>
Code CSS
<style type="text/css">
.sameHeightCol {
float: left;
position: relative;
}
#col1 {
width: 45%;
background: green;
}
#col2 {
width: 30%;
background: yellow;
}
#col3 {
width: 25%;
background: red;
}
</style>
Rendu
Les 3 colonnes avec automatiquement la même hauteur que la balise <div> la plus haute
Voici l'astuce utilisée :
Code HTML
<div id="container1" class="sameHeightCol">
<div id="container2" class="sameHeightCol">
<div id="container3" class="sameHeightCol">
<div id="col1" class="sameHeightCol">Colonne 1</div>
<div id="col2" class="sameHeightCol">Colonne 2<br/>contenu supplémentaire</div>
<div id="col3" class="sameHeightCol">Colonne 3</div>
</div>
</div>
</div>
Code CSS
<style type="text/css">
.sameHeightCol {
float:left;
position:relative;
overflow:hidden;
}
#container1 {
width: 100%;
background: green;
}
#container2 {
width: 100%;
right: 25%; /* = la largeur de la colonne verte */
background: yellow;
overflow: visible;
}
#container3 {
width: 100%;
right: 30%; /* = la largeur de la colonne jaune */
background: red;
overflow: visible;
}
#col1, #col2, #col3 {
left: 55%; /* = #container2{right} + #container3{right} */
}
#col1 {
width: 45%; /* = #container1{width} - #col1{left} */
}
#col2 {
width: 30%; /* = #container3{right} */
}
#col3 {
width: 25%; /* = #container2{right} */
}
</style>
Rendu
Rajouter un padding dans les colonnes
Il faut rajouter une balise <div> qui entoure le contenu et lui donner le padding voulu.
Code HTML
<div id="container1" class="sameHeightCol">
<div id="container2" class="sameHeightCol">
<div id="container3" class="sameHeightCol">
<div id="col1" class="sameHeightCol"><div class="myPadding">Colonne 1</div></div>
<div id="col2" class="sameHeightCol"><div class="myPadding">Colonne 2<br/>contenu supplémentaire</div></div>
<div id="col3" class="sameHeightCol"><div class="myPadding">Colonne 3</div></div>
</div>
</div>
</div>
Code CSS à rajouter
.myPadding {
padding: 15px;
}
Rendu
Avoir une colonne centrée de largeur fixe
Code HTML
<div id="container1">
<div id="container2">
<div id="container3">
<div id="colCentered">
Ma colonne centrée avec une largeur fixe
</div>
</div>
</div>
</div>
Code CSS
<style type="text/css">
#container1 {
position: relative;
width: 100%;
background: yellow;
height: 100%;
float: left;
overflow: hidden;
}
#container2 {
position: relative;
background: green;
width: 100%;
right: 50%;
float: left;
}
#container3 {
float:left;
position:relative;
overflow:hidden;
width: 100%;
left: 50%;
}
#colCentered {
margin: 0 auto;
width: 300px;
background: red;
position: relative;
}
</style>
Rendu



Excellent, merci pour l'astuce
Bonjour,
Je me suis retrouvé confronté à ce problème d'avoir une même hauteur de div …
Effectivement cette astuce fonctionne à merveille ! merci 1000 fois.
Aimant bien comprendre et apprendre, je suis têtu, ça doit faire 2 heures que je me creuse la tête pour comprendre comment ça marche, afin d'éventuelle adaptation future … Là j'avoue je capitule dans ma recherche, j'ai fait des croquis, …etc … mais je n'arrive pas à saisir comment ça se passe ???? !!!!!!
Ca me turlupine à chaque fois que je ne saisis pas quelque-chose, pourtant j'y mets du mien ! … mais je vois pas là …
J'aimerais bien qu'une bonne âme charitable m'éclaire un peu dans ma recherche de compréhension, ça me soulagerait d'un poids ! …. m'énerve de pas comprendre ! … pourtant j'ai pas mal de notions en CSS ….
Quelqu'un peut-il ?
Merci d'avance
hgus
Le principe, c’est que tu as #col1, #col2 et #col3 qui sont tous inclus dans #container3. Donc #container3 s’adaptera à la hauteur la plus grande de #col1, #col2 ou #col3.
Du coup, comme #container3 est inclus dans #container2 qui est lui-même inclus dans #container1, #container2 et #container1 s’adapteront à #container3, et feront tous la même hauteur.
Et comme c’est dans #container3, #container2 et #container1 que tu mets la couleur de fond, tes colonnes auront la même hauteur de couleur de fond. Mais en réalité #col1, #col2 et #col3 ont des hauteurs différentes.
J’espère t’avoir éclairé !
Il fallait y penser.
Merci pour l'astuce, ça nous évitera de mettre un background-image
Autre solution : utiliser un script javascript :
http://www.paulbellows.com/getsmart/balance_columns/
Bonjour,
Beau système que celui-ci, merci.
J'ai cependant un petit souci: depuis que je l'ai mis en place, l'ascenseur horizontal des browsers signale une page bien plus large qu'elle ne l'est effectivement. Est-ce normal pour cette manip? Ou ais-je fait une boulette quelque part?
Non, je ne pense pas que ce soit normal. Est-ce que tu peux me faire passer l'URL de ta page ?
Je ne peux pas te passer d'URL car je suis en interne. Mais j'ai résolu mon problème, j'avais effectivement une boulette ailleurs sur la page! Merci tout de même
Là, je viens d'ouvrir mon site avec IE7 sur Crossover (Mac) et je vois un truc spécial: mes 3 colonnes s'affichent pendant une demie seconde et disparaissent! J'ai déjà vu beaucoup de spécialités d'Explorer, mais celle-là jamais! Je vais voir…
Explorer7 est désespérant. J'ai essayé des solutions basées sur les propriétés HasLayout mais sans succès. Je pense que je vais me tourner vers d'autres solutions pour mes 3 colonnes… quitte à remettre en service ces bons vieux tableaux!
Si je comprends bien, la colonne verte fait 100% mais est recouverte par la colonne jaune, qui elle même recouverte par la colonne rouge…
Bien vu, merci pour l'astuce.
Bonjour, j'aimerais savoir si ça marche sur ASP.NET. En fait, je suis débutant et j'utilise l'environnement de développement Microsoft DotNET. Si quelqu'un peut m'aider et me conseiller, je lui en serais très reconnaissant. Merci d'avance.
C'est du CSS, donc peut importe si tu utilises PHP ou ASP pour générer ton HTML.