repeat() et minmax() en CSS : des grilles responsives sans media query

repeat() et minmax() évitent de répéter des colonnes à la main et construisent une grille CSS responsive sans media query.
4 min de lecture
Believemy logo

Écrire une grille de douze colonnes égales à la main, colonne par colonne, ou une grille de cartes dont la largeur doit rester entre 200 et 300 pixels quel que soit le nombre de cartes affichées, devient vite pénible sans un moyen de générer ce motif automatiquement. repeat() et minmax() servent exactement à ça : la première évite de répéter une valeur, la seconde donne une fourchette de tailles au lieu d'une valeur fixe.

Combinées ensemble, et souvent avec auto-fit et auto-fill, ces deux fonctions permettent de construire des grilles responsives sans écrire la moindre Media query, ce qui en fait l'un des outils les plus utilisés de Grid au quotidien.


Définition

repeat() répète un motif de colonnes ou de lignes un certain nombre de fois dans grid-template-columns, pour éviter de l'écrire à la main. minmax() fixe une taille minimale et une taille maximale pour une colonne ou une ligne, qui varie librement entre ces deux bornes selon l'espace disponible. Utilisées seules ou ensemble, elles réduisent une déclaration qui pourrait faire une ligne entière de valeurs répétées à une syntaxe courte et lisible.


repeat() seul

CSS
.grille {
  grid-template-columns: repeat(4, 1fr);
}

repeat(4, 1fr) équivaut exactement à écrire 1fr quatre fois de suite. Le premier argument fixe le nombre de répétitions, le second le motif à répéter, qui peut lui-même contenir plusieurs valeurs : repeat(2, 100px 1fr) répète le couple 100px 1fr deux fois, ce qui donne quatre colonnes en tout.


minmax() seul

CSS
.grille {
  grid-template-columns: minmax(200px, 1fr) 1fr 1fr;
}

Ici, la première colonne ne descend jamais sous 200 pixels, même si le conteneur devient très étroit, mais peut grandir comme n'importe quelle colonne en unité fr si l'espace le permet. C'est un moyen simple d'éviter qu'une colonne contenant un logo ou un bouton ne devienne trop étroite pour être lisible.


La combinaison qui construit une grille responsive

CSS
.grille {
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 16px;
}
ÉlémentRôle
auto-fitCalcule automatiquement le nombre de colonnes qui rentrent
minmax(220px, 1fr)Chaque colonne fait au moins 220px, et se partage le reste au-delà
repeat(...)Applique ce motif autant de fois que nécessaire

Cette ligne unique crée une grille de cartes qui ajoute ou retire des colonnes toute seule selon la largeur de l'écran, sans qu'aucune media query ne soit nécessaire pour passer de quatre colonnes sur un grand écran à une seule sur mobile.

Le choix entre auto-fit et auto-fill à l'intérieur de repeat() change ce qui arrive aux colonnes vides une fois le nombre maximal de colonnes atteint, une nuance détaillée dans le terme dédié à ces deux mots-clés. Un piège voisin touche minmax(0, 1fr) : remplacer le minimum par 0 empêche un contenu comme une image de forcer la colonne à s'agrandir au-delà de ce que la grille avait prévu, un réglage utile quand une grille de cartes contient des images qui ne doivent jamais élargir leur colonne au-delà des autres.


Le piège du second argument trop rigide

minmax() ne fonctionne comme prévu dans une grille responsive que si son second argument reste flexible, en fr ou en pourcentage. Un minmax(220px, 300px) fige toujours la colonne entre deux valeurs fixes, ce qui empêche la grille de vraiment s'étirer pour combler l'espace restant.

Bon à savoirSi une grille en auto-fit ne semble pas s'étirer correctement et laisse un vide sur la droite, vérifiez le second argument de minmax(). Un 1fr flexible est presque toujours le bon choix ; une valeur fixe en pixels y bloque l'étirement que la grille est censée offrir.


Questions fréquentes

QuestionPeut-on imbriquer repeat() dans minmax() ?

Non, c'est l'inverse qui fonctionne : minmax() se place comme argument à l'intérieur de repeat(), jamais le contraire. repeat() décrit combien de fois répéter un motif, et minmax() peut faire partie de ce motif, comme dans repeat(3, minmax(100px, 1fr)).

QuestionQue se passe-t-il si les deux valeurs de minmax() sont incohérentes, par exemple un minimum plus grand que le maximum ?

Le navigateur traite le minimum comme prioritaire et ignore le maximum dans ce cas précis, pour éviter qu'une colonne se retrouve avec une taille impossible à respecter. Ce cas reste rare en pratique et signale presque toujours une valeur mal choisie à corriger plutôt qu'un comportement à exploiter.

Questionrepeat() fonctionne-t-il aussi pour grid-template-rows ?

Oui, repeat() et minmax() s'utilisent exactement de la même façon pour les lignes que pour les colonnes. On les retrouve par exemple dans grid-template-rows: repeat(3, minmax(100px, auto)) pour trois lignes qui ne descendent jamais sous 100 pixels tout en pouvant grandir avec leur contenu.

Termes connexes

Découvrez notre glossaire HTML et CSS

Parcourez les termes et définitions les plus couramment utilisés dans le domaine du développement HTML et CSS.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.