Nombre de colonnes variable
Affichage d'un nombre variable de colonnes en fonction de la largeur du viewport à l'aide des media queries.
Le rendu
Redimensionnez la fenêtre du navigateur pour voir le changement de rendu.
- Colonne #1
- Colonne #2
- Colonne #3
- Colonne #4
- Colonne #5
Principe
Pour l'exemple, on utilise comme conteneur un élément <ul>
auquel nous affectons le style minimum suivant :
#liste {
display: inline-flex;
flex-wrap: wrap;
padding: 0;
list-style: none;
}
On crée autant d'éléments « entête de colonne » que l'on souhaite afficher de colonnes sur écran large. Nous avons donc au départ, pour cet exemple, le html suivant :
<ul id="liste">
<li class="entete">Colonne #1</li>
<li class="entete">Colonne #2</li>
<li class="entete">Colonne #3</li>
<li class="entete">Colonne #4</li>
<li class="entete">Colonne #5</li>
</ul>
Tous ces éléments sont masqués, sauf le premier via le CSS :
#liste .entete {
display: none;
font-weight: 700;
background-color: #EFEFEF;
}
#liste li:nth-child(1) {
display: inherit; /* rétabli le display par défaut */
}
Pour tous les éléments de la liste on applique le même CSS initial à savoir :
#liste li {
flex-basis: 100%;
box-sizing: border-box;
}
Par défaut on aura donc un élément par ligne.
Suivant la largeur du viewport, et à l'aide des média queries en testant la propriété min-width
, on va masquer/afficher les « entête de colonne » nécessaires et modifier la propriété flex-basis
des éléments pour ajuster les largeurs au nombre de colonnes à afficher.
Cela va se traduire par :
@media (min-width:576px) {
#liste li:nth-child(2) { /* on affiche l'entête colonne 2 */
display: inherit;
}
#liste li {
flex-basis: 50%; /* réajuste largeur des éléments */
}
}
@media (min-width:768px) {
#liste li:nth-child(3) { /* on affiche l'entête colonne 3 */
display: inherit;
}
#liste li {
flex-basis: 33.3333%; /* réajuste largeur des éléments */
}
}
@media (min-width:992px) {
#liste li:nth-child(4) { /* on affiche l'entête colonne 4 */
display: inherit;
}
#liste li {
flex-basis: 25%; /* réajuste largeur des éléments */
}
}
@media (min-width:1200px) {
#liste li:nth-child(5) { /* on affiche l'entête colonne 5 */
display: inherit;
}
#liste li {
flex-basis: 20%; /* réajuste largeur des éléments */
}
}