Загрузка...
Загрузка...
Практическое руководство по созданию адаптивных макетов с CSS Grid: брейкпоинты, auto-fill, auto-fit, медиа-запросы и готовые паттерны.
Подробное руководство по CSS Grid: свойства контейнера и элементов, именованные области, авторазмещение, практические примеры и типичные паттерны.
CSS & ДизайнСравнение Flexbox и CSS Grid: сильные стороны каждой технологии, типичные сценарии использования и рекомендации по выбору для разных задач вёрстки.
CSS & ДизайнПодробное руководство по CSS Flexbox: свойства контейнера и элементов, оси, выравнивание, практические примеры и типичные паттерны вёрстки.
CSS & ДизайнПолное руководство по центрированию элементов с помощью CSS Flexbox: по горизонтали, вертикали, по обеим осям, а также центрирование с учётом отступов.
Поделитесь с коллегами или изучите другие материалы блога
Адаптивные макеты на CSS Grid позволяют создавать гибкие раскладки, которые корректно отображаются на разных размерах экрана. В этой статье рассмотрены практические приёмы: auto-fill, auto-fit, медиа-запросы и типичные паттерны адаптивных сеток.
Ключевые значения для адаптивных сеток без медиа-запросов:
.container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 1rem;
}
/* auto-fill: пустые колонки остаются */
.grid-fill {
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
/* auto-fit: пустые колонки исчезают */
.grid-fit {
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
Для каталогов и галерей обычно выбирают auto-fill — элементы не растягиваются на всю ширину при малом количестве.
Правильный выбор minmax(min, max) влияет на поведение:
| min | max | Поведение |
|---|---|---|
| 200px | 1fr | Минимум 200px, при наличии места — равномерно |
| 150px | 300px | От 150px до 300px |
| 0 | 1fr | Может сжиматься до 0 (осторожно с overflow) |
.cards {
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
}
При ширине контейнера 900px и gap: 1rem помещается 3 колонки (280 * 3 + 2 * 32 = 944, при 900px — 2 колонки).
Для явного контроля на разных экранах:
.grid {
display: grid;
gap: 1rem;
}
@media (min-width: 480px) {
.grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 768px) {
.grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (min-width: 1024px) {
.grid {
grid-template-columns: repeat(4, 1fr);
}
}
.page {
display: grid;
grid-template-areas:
"header"
"main"
"sidebar"
"footer";
grid-template-rows: auto 1fr auto auto;
min-height: 100vh;
}
@media (min-width: 768px) {
.page {
grid-template-areas:
"header header"
"main sidebar"
"footer footer";
grid-template-columns: 1fr 300px;
grid-template-rows: auto 1fr auto;
}
}
@media (min-width: 1024px) {
.page {
grid-template-areas:
"header header header"
"nav main sidebar"
"footer footer footer";
grid-template-columns: 200px 1fr 280px;
}
}
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
grid-auto-rows: 200px;
gap: 1rem;
}
.gallery .featured {
grid-column: span 2;
grid-row: span 2;
}
@media (max-width: 500px) {
.gallery .featured {
grid-column: span 1;
grid-row: span 1;
}
}
Grid автоматически выравнивает высоту элементов в строке:
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
}
.card {
display: flex;
flex-direction: column;
}
.card .content {
flex: 1;
}
.layout {
display: grid;
grid-template-columns: 1fr;
min-height: 100vh;
}
@media (min-width: 768px) {
.layout {
grid-template-columns: 280px 1fr;
}
}
.sidebar {
position: sticky;
top: 0;
height: 100vh;
overflow-y: auto;
}
Для быстрого прототипирования адаптивных сеток используйте CSS Grid Generator на rechecker.ru. Инструмент позволяет задать размеры треков, gap и сразу видеть результат.
С container-type и @container можно менять раскладку в зависимости от размера контейнера, а не viewport:
.card-container {
container-type: inline-size;
container-name: card;
}
@container card (min-width: 400px) {
.card {
display: grid;
grid-template-columns: 1fr 2fr;
}
}
Поддержка в современных браузерах. Для fallback используйте медиа-запросы.
Использование clamp() для плавного изменения gap:
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: clamp(1rem, 2vw, 2rem);
}
Именованные области упрощают переключение макета:
.dashboard {
display: grid;
grid-template-areas:
"a b"
"c d";
grid-template-columns: 1fr 1fr;
gap: 1rem;
}
@media (max-width: 600px) {
.dashboard {
grid-template-areas:
"a"
"b"
"c"
"d";
grid-template-columns: 1fr;
}
}
Подробное руководство по CSS Grid — в CSS Grid: полное руководство по сеткам. Сравнение Grid и Flexbox — в Flexbox vs CSS Grid: когда что использовать.
Когда нужно ровно N колонок независимо от ширины:
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
@media (max-width: 768px) {
.grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 480px) {
.grid {
grid-template-columns: 1fr;
}
}
Для галерей с изображениями используйте aspect-ratio и object-fit:
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 1rem;
}
.gallery img {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: cover;
}
grid-auto-rows: minmax(100px, auto) позволяет строкам подстраиваться под контент. Для masonry-эффекта (без column) рассмотрите grid-template-rows: masonry (экспериментально в Firefox) или специализированные библиотеки.
Grid можно использовать для навигации, которая меняет раскладку на мобильных:
.nav {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 0.5rem;
}
@media (max-width: 640px) {
.nav {
grid-template-columns: 1fr;
}
}
Для форм с полями разной ширины:
.form {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
}
.form .full-width {
grid-column: 1 / -1;
}
@media (max-width: 600px) {
.form {
grid-template-columns: 1fr;
}
}
Для браузеров без поддержки Grid используйте @supports:
@supports (display: grid) {
.grid { display: grid; /* ... */ }
}
@supports not (display: grid) {
.grid { display: flex; flex-wrap: wrap; }
.grid > * { flex: 1 1 300px; }
}