Cela peut sembler évident à faire dans la théorie, mais en pratique créer des colonnes de même hauteur quel que soit le contenu de chacune d’elle demande de s’accorder un peu de temps de recherche, notamment si l’on souhaite la solution flexible et dépourvue de « hack » en JS. J’ai quelque chose pour vous !
Mettons-nous à table
L’une de ces solutions requiert l’utilisation des tableaux CSS (display: table-*;
) mais apporte sont lots de spécificités, avec en vrac :
- vous devrez connaître le nombre d’éléments par ligne et ne pas en changer
- cette solution fonctionne dès IE8
- des positionnements avancés (
absolute
notamment) risquent de vous poser problème - certains styles sur les colonnes seront difficiles à mettre en place
Outre ces quelques particularités, cette solution répond néanmoins à notre besoin qui est de créer des colonnes de même hauteur.
Voyons un exemple de code, avec un bout de HTML :
<div class="column-layout">
<div>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Velit quia, quam delectus sequi odio fugit pariatur architecto, deleniti exercitationem quae adipisci ipsum ullam officia ea!</div>
<div>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consectetur adipisci, quod voluptates, vel nostrum ea distinctio, a tempore voluptas reiciendis doloremque veniam, accusantium. Veritatis ipsum modi doloribus enim sint magnam, delectus dolorum, aperiam! Eaque dolor, veniam eum sunt dolorem nostrum. Dolores, corporis! Magnam, amet quas? Voluptates eaque quaerat quia inventore, earum eveniet hic alias rem atque neque ab, reprehenderit dolore culpa, blanditiis! Maiores enim rerum architecto voluptatibus cumque. Debitis accusamus ea aut incidunt voluptatibus quibusdam rem sint laboriosam qui sit odio expedita illum iste consectetur fugit eaque commodi pariatur, porro ex delectus officia ratione necessitatibus totam. Necessitatibus est autem et.</div>
<div>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque velit dolores ipsa maiores molestias minus iusto nulla consequatur saepe. Aspernatur nulla optio laborum ducimus dignissimos nisi itaque aliquam doloremque, iure qui. Corporis quas atque minus, eveniet delectus officiis dolor, neque, animi, deleniti adipisci esse! Ullam nesciunt, nemo fugit totam itaque.</div>
</div>
Prenez volontairement des contenus variés, vous pouvez tester avec des images insérées dans l’une des divisions par exemple.
Le code CSS va être relativement court, il consiste simplement à créer les différentes cellules.
.column-layout {
display: table;
width: 100%;
border-collapse: separate;
}
.column-layout > div {
display: table-cell;
width: 33.3333%; /* 100%/3 = 3 colonnes */
padding: 20px;
border: 5px #F2F2F2 solid;
background: #FFF;
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset;
}
Le conteneur des 3 cellules prend le comportement d’un tableau (l.2) d’une largeur de 100% (l.3).
Chacune des divisions enfant devient une cellule (l.7) et occupe 1 tiers de la largeur disponible (l.8).
Pour le reste c’est de la décoration.
Démonstration Fork on CodePen.io
Introduisons un peu de flex
ibilité
Une autre solution consiste en l’utilisation de Flexible box Layout Module, ce fameux module réécrit bon nombre de fois depuis 2009.
Cette solution est beaucoup plus flexible, comme son nom l’indique 🙂
Elle apporte également sont lot de spécificités :
- un minimum de connaissances sur ce nouveau module CSS
- une compatibilité à partir de IE10 (le fallback naturel reste convenable)
- une syntaxe un peu redondante pour un support optimal
Reprenez le même code HTML, mais appliquez ces styles à la place des précédents.
.column-layout {
display: flex;
flex-wrap: wrap;
}
.column-layout > div {
display: flex;
width: 47%;
padding: 20px;
margin: 10px 1.5%;
background: #FFF;
box-shadow: 0 0 3px rgba(0,0,0,0.05)
}
Ici je propose un système de deux colonnes.
Bien entendu, si vous avez besoin de 3 colonnes, renseignez la CSS comme suit :
.column-layout > div {
width: 32%;
margin: 10px 0.666%;
}
/* pour display */
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
/* pour flex-wrap */
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
Les autres syntaxes (il en existe d’autres) représentent un nombre d’utilisateurs trop peu important pour être utiles ici.
Comme vous le constaterez à l’usage, cette solution est complète et permet toutes les extravagances possibles en terme de design et mise en page en colonnes.
Concernant la problématique du support en dessous de IE10, sachez que le fallback naturel fait simplement passer chaque colonne en ligne de contenu, ce qui n’est pas nécessairement problématique.
Démonstration Fork on CodePen.io
N’oubliez pas d’utiliser le modèle de boîte border-box
pour reproduire ces démonstrations.
A noter, il y a aussi le CSS Multi-column qui peut permettre de « mettre en colonnes » certains contenus. Cela peut aussi être pratique.
Yep, c’est ce que je proposais en démo ici : http://codepen.io/CreativeJuiz/pen/tkdCr , mais ça implique bien trop de contraintes et/ou approximation je trouve. (mais peut-être que je m’y suis mal pris sur mes différents tests)
Merci pour ton retour 🙂
Merci pour ce tutoriel.
Toutefois, je ne comprends pas très bien l’intérêt de la 2ème partie, basée sur le « flex ».
Avec « table », j’ai bien mes 3 colonnes parallèles, à la verticale.
En adaptant le code CSS pour « flex », j’obtiens un alignement… horizontal ; est-ce le but visé ?
De plus, pourquoi la valeur de « box-shadow » change-t-elle légèrement ? Elle me paraît indépendante du système de mise en colonne…
Bonjour,
Je ne sais pas en quoi consiste votre adaptation, donc peut-être que l’alignement horizontal est le but visé.
La valeur box-shadow n’est, dans mon exemple, qu’une illustration d’un style possible, j’aurais tout aussi bien pu placer des fonds rouges, mais je trouve cela moins sexy. Cependant, essayez les ombres données sur l’exemple « flex » appliquées à l’exemple « table », vous verrez que le résultat n’est pas du tout le même.
L’avantage de flex est quand même son aspect hyper-flexible permettant par la suite de réordonner les blocs (réellement, en plaçant le premier en dernier, etc.) sans changer le code HTML, et de n’avoir que très peu de valeur à changer pour bouleverser orientation et grille suivant les terminaux de consultation (grâce à des media-queries par exemple).
Bon courage 🙂
Merci pour votre réponse.
« Je ne sais pas en quoi consiste votre adaptation, donc peut-être que l’alignement horizontal est le but visé. »
=> Lorsque je copie-colle votre code concernant l’approche « table » (« Mettons-nous à table », 1ère partie de l’article), le rendu visuel dispose 3 colonnes à la verticale -c’en est même un pléonasme 😉
Puis, lorsque je modifie le CSS, comme indiqué dans la 2ème partie « Introduisons un peu de flexibilité », j’obtiens deux (ou trois, en ajustant comme vous le proposez les propriétés width et margin) « bandeaux » alignés horizontalement. Alors que je m’attendais à retrouver mes « colonnes à la verticale » 🙂
Le code de la deuxième section est bien censé créer deux ou trois colonnes, si vous avez bien pris en compte les problèmes de compatibilité et de syntaxe mentionnés en fin d’article.
Dans le doute vous pouvez utiliser des solutions comme autoprefixer (https://github.com/postcss/autoprefixer)
Bonne journée 🙂
Merci pour ce beau tutoriel
Par contre est-il possible d’ajouter, des titres et des paragraphes car je remarque que tu n’en a pas mis.
et merci pour les beaux tutoriels.
Bonjour,
Je pense que tu peux vite trouver la réponse par toi-même. Il suffit de tester.
Non ?
😉