В прошлом уроке мы задавали столбцы вручную: 1fr 1fr 1fr. Но если столбцов десять, писать десять одинаковых значений утомительно и легко ошибиться. А ещё бывает, что столбец должен подстраиваться: не уже определённого предела, но и не шире разумного максимума. Обычный 1fr так не умеет. Для этих задач в Grid есть функция repeat(), которая повторяет описание столбцов, и minmax(), которая задаёт размер в диапазоне «от и до».
После этого урока вы сможете описывать сетки короче и делать столбцы по-настоящему гибкими — такими, что они сами держат разумную ширину при любом размере экрана.
Что уже умеем / что добавим
Вы умеете включать сетку и задавать столбцы через grid-template-columns с единицей fr. Теперь научимся записывать это компактнее и гибче. В сквозном проекте мы перепишем сетку карточек услуг так, чтобы она сама адаптировала ширину столбцов без лишнего кода.
Что вы узнаете в рамках статьи
- Как повторять столбцы функцией
repeat(). - Как задавать размер в диапазоне через
minmax(). - Как сочетать
repeat()иminmax()в одном описании. - Чем
frотличается от фиксированных единиц в гибкой сетке.
Ключевые термины
repeat(n, размер)— функция, повторяющая описание столбца или строкиnраз.minmax(min, max)— размер в диапазоне: не меньшеminи не большеmax.min-content— минимальный размер по содержимому.max-content— размер по содержимому без переносов.
Повторяем столбцы: repeat()
Когда столбцы одинаковы, их описание можно не дублировать, а свернуть в функцию repeat(). Первый аргумент — сколько раз повторить, второй — что именно:
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
Запись repeat(3, 1fr) полностью равна 1fr 1fr 1fr, но короче и понятнее: «три столбца по одной доле». Для десяти столбцов достаточно repeat(10, 1fr) вместо длинной строки значений. Аргументом может быть и более сложный шаблон — например, repeat(2, 100px 1fr) создаст чередование: 100px, 1fr, 100px, 1fr — четыре столбца. Так repeat() экономит код и уменьшает риск опечатки.
Диапазон размера: minmax()
Иногда столбцу нужен не фиксированный размер, а диапазон. Функция minmax(min, max) задаёт именно это: браузер не сделает столбец уже min и не шире max.
.grid {
display: grid;
grid-template-columns: repeat(3, minmax(150px, 1fr));
}
Здесь каждый из трёх столбцов не будет уже 150 пикселей, но при наличии места растянется, деля пространство по 1fr. На широком экране столбцы разъедутся поровну, а на узком не сожмутся меньше 150 пикселей — контент останется читаемым. Это очень частый приём: minmax(минимум, 1fr) даёт столбец, который «дышит» в разумных пределах.
В minmax() можно использовать и специальные значения. Например, minmax(min-content, 1fr) не даст столбцу стать уже его содержимого. Но на практике чаще всего минимум задают в пикселях или rem — это предсказуемо и просто.
Сочетаем repeat() и minmax()
Настоящая сила проявляется, когда repeat() и minmax() работают вместе. Это стандартный способ описать сетку из нескольких гибких столбцов одной строкой:
.grid {
display: grid;
grid-template-columns: repeat(4, minmax(120px, 1fr));
gap: 16px;
}
Читается это так: «четыре столбца, каждый шириной от 120 пикселей до одной доли свободного места». Все столбцы равны между собой, растягиваются вместе с контейнером, но никогда не станут уже 120 пикселей. Одна строка кода описывает аккуратную и устойчивую сетку. В следующих уроках мы увидим, как та же идея с auto-fit позволит сетке самой менять число столбцов — но сначала важно уверенно владеть repeat() и minmax().
Применяем в проекте
Перепишем сетку карточек услуг так, чтобы столбцы были гибкими. Заменим 1fr 1fr 1fr на repeat() с minmax() — код станет короче, а карточки не будут сжиматься слишком сильно.
.services {
display: grid;
grid-template-columns: repeat(3, minmax(200px, 1fr));
gap: 24px;
}
Обновите страницу: внешне сетка осталась прежней — три равных столбца с промежутками. Но теперь описание короче и надёжнее: каждый столбец не сожмётся уже 200 пикселей, а на широком экране карточки поделят место поровну. Мы заложили основу для будущей адаптивности, не усложнив код.
Частые ошибки
- Перепутан порядок в
minmax().
Первым идёт минимум, вторым максимум:minmax(150px, 1fr), а не наоборот. repeat()с несовместимым содержимым.
Первый аргумент — число повторов;repeat(1fr, 3)— ошибка.- Максимум в пикселях там, где нужна гибкость.
minmax(150px, 300px)перестанет тянуться после 300px; для растягивания в максимуме ставьте1fr. - Ожидание переноса столбцов.
repeat(3, ...)всегда даёт ровно три столбца; автоматическое изменение их числа — тема урока проauto-fit.
Итоги
Отличная работа — ваши сетки стали гибкими и лаконичными! Вы научились повторять столбцы функцией repeat(), задавать размеры в диапазоне через minmax() и сочетать их, описывая устойчивую сетку одной строкой. Теперь столбцы вашего проекта держат разумную ширину и не ломаются на разных экранах — это большой шаг к адаптивной вёрстке.
Так держать! В следующем уроке мы научимся размещать элементы по конкретным линиям сетки с помощью grid-column, grid-row и grid-area — и сможем растягивать ячейки на несколько столбцов и строк.