Что такое гриды?
СкопированоCSS Grid Layout (спецификация) или просто гриды — это удобная технология для раскладки элементов на веб-страницах. В отличие от флексбоксов, одновременно работающих только с одним измерением, гриды дают возможность работать одновременно с двумя: горизонталью и вертикалью.
На заре веба для создания раскладки поинтереснее одноколоночной часто использовались таблицы. Но проблема была в том, что таблицы были сделаны не для этого. Даже если отбросить семантическую нагруженность этого элемента, отдельные свойства для стилизации были крайне неудобными. По сути, это был костыль за неимением более удобных способов. Гриды же изначально были придуманы и реализованы как инструмент для создания раскладки.
Принцип работы гридов чем-то похож на таблицы. Вместо работы только с рядами или только с колонками с помощью гридов можно работать с так называемыми грид-ячейками, позиционируя элементы по вертикали и горизонтали одновременно.
В этом гайде описаны только самые используемые и устоявшиеся свойства, а не все возможные. Так как технология сейчас в стадии активного развития и внедрения, что-то в ней может меняться. Пожалуйста, обращайтесь к спецификации, если не нашли чего-то в этом гайде.
Основные термины
СкопированоГрид-контейнер: родительский элемент, к которому применяется свойство display
.
Грид-элемент: дочерний элемент, прямой потомок грид-контейнера. Подчиняется правилам раскладки гридов.
Грид-линия: разделительная линия, формирующая структуру грида. Может быть как вертикальной (грид-линия колонки), так и горизонтальной (грид-линия ряда). Располагается по обе стороны от колонки или ряда. Используется для привязки грид-элементов.
Грид-ячейка: пространство между соседними грид-линиями. Единица грид-сетки.
Грид-полоса: пространство между двумя соседними грид-линиями. Может быть проще думать о грид-полосе как о ряде или колонке.
Грид-область: область, ограниченная четырьмя грид-линиями. Может состоять из любого количества ячеек как по горизонтали, так и по вертикали.
Свойства грид-контейнера
Скопированоdisplay
Скопировано.container { display: grid;}
.container { display: grid; }
Если элементу задано свойство display
со значением grid
, то такой элемент становится грид-контейнером. Дочерние элементы этого контейнера начинают подчиняться правилам грид-раскладки. Снаружи грид-контейнер ведёт себя как блок.
.container { display: inline-grid;}
.container { display: inline-grid; }
Практически аналогичное предыдущему значению — за тем исключением, что снаружи грид-контейнер, созданный с помощью inline
, будет вести себя как строчный элемент.
grid-template-columns
, grid-template-rows
СкопированоСвойства, задающие размеры и количество колонок или рядов грид-раскладки соответственно.
.container { display: grid; /* Будет создано 3 колонки */ grid-template-columns: 150px auto 40%; /* Будет создано 3 ряда */ grid-template-rows: 250px 10vw 15rem;}
.container { display: grid; /* Будет создано 3 колонки */ grid-template-columns: 150px auto 40%; /* Будет создано 3 ряда */ grid-template-rows: 250px 10vw 15rem; }
Можно явно именовать грид-линии, используя для этого квадратные скобки:
.container { display: grid; grid-template-columns: [start] 250px [line2] 400px [line3] 600px [end]; grid-template-rows: [row1-start] 15rem [row1-end] 30vh [last];}
.container { display: grid; grid-template-columns: [start] 250px [line2] 400px [line3] 600px [end]; grid-template-rows: [row1-start] 15rem [row1-end] 30vh [last]; }
Каждая линия может иметь больше одного имени. Это чем-то похоже на классы в HTML — вы можете задать элементу больше одного класса. Тут аналогичная ситуация. Например, такой код будет совершенно валиден, у второй и третьей грид-линий колонки по два имени:
.container { display: grid; grid-template-columns: [start] 140px [line2 col2-start] 250px [col2-end end]; grid-template-rows: [row1-start] 25rem [row1-end] 10vh [last];}
.container { display: grid; grid-template-columns: [start] 140px [line2 col2-start] 250px [col2-end end]; grid-template-rows: [row1-start] 25rem [row1-end] 10vh [last]; }
Если нужны одинаковые колонки или ряды, то можно воспользоваться функцией repeat
.
Будет создано 3 колонки по 250 пикселей:
.container { display: grid; grid-template-columns: repeat(3, 250px);}
.container { display: grid; grid-template-columns: repeat(3, 250px); }
С появлением гридов у нас появилась и новая единица измерения: fr
🦊
fr
(от fraction — доля, часть) отвечает за свободное пространство внутри грид-контейнера.
Например, этот код создаст три колонки, каждая из которых будет занимать 1/3 ширины родителя:
.container { display: grid; grid-template-columns: repeat(3, 1fr);}
.container { display: grid; grid-template-columns: repeat(3, 1fr); }
Что аналогично записи:
.container { display: grid; grid-template-columns: 1fr 1fr 1fr;}
.container { display: grid; grid-template-columns: 1fr 1fr 1fr; }
Свободное пространство рассчитывается после того, как место отдано всем фиксированным размерам. К примеру, в коде ниже сначала будет создана колонка шириной 200 пикселей, а затем свободное пространство — ширина родителя минус 200 пикселей — будет поделено между остальными колонками. Каждая будет занимать ширину (100% - 200px) / 2:
.container { display: grid; grid-template-columns: 1fr 200px 1fr;}
.container { display: grid; grid-template-columns: 1fr 200px 1fr; }
auto-fill
и auto-fit
СкопированоВ тех случаях, когда количество колонок или строк не известно для свойств grid
и grid
можно установить значения auto
или auto
в формате:
.container { grid-template-columns: repeat(/* auto-fill или auto-fit */, /* размер колонки */);}
.container { grid-template-columns: repeat(/* auto-fill или auto-fit */, /* размер колонки */); }
Оба эти параметра (auto
и auto
) автоматически добавляют в грид-сетку из примера выше колонки. Но эти колонки ведут себя немного по-разному:
auto
стремится заполнить колонками всё доступное пространство, а когда элементы заканчиваются, создаёт пустые колонки, равномерно распределяя доступную область между существующими и «виртуальными» колонками.- fill auto
действует похожим образом, но, схлопывает пустые колонки и отдаёт больше места под заполненные.- fit
Аналогично можно использовать для создания рядов.
grid-auto-columns
, grid-auto-rows
СкопированоЕсли элементов внутри грид-контейнера больше, чем может поместиться в заданные явно ряды и колонки, то для них создаются автоматические, неявные ряды и колонки. При помощи свойств grid
и grid
можно управлять размерами этих автоматических рядов и колонок.
.container { display: grid; grid-template-rows: 50px 140px; grid-auto-rows: 40px; gap: 20px;}
.container { display: grid; grid-template-rows: 50px 140px; grid-auto-rows: 40px; gap: 20px; }
В этом примере создаются два явных ряда размером 50 и 140 пикселей. Элементы, начиная с третьего, в эти два ряда не помещаются, и для них создаются автоматические ряды. При помощи свойства grid
мы указываем, что автоматические ряды должны иметь размер 40 пикселей.
Можно задавать больше одного значения для автоматических колонок или рядов. Тогда паттерн размера будет повторяться до тех пор, пока не кончатся грид-элементы.
.container { display: grid; grid-template-columns: 200px 500px; grid-auto-columns: 75px 100px 50px; grid-auto-flow: column; gap: 20px;}
.container { display: grid; grid-template-columns: 200px 500px; grid-auto-columns: 75px 100px 50px; grid-auto-flow: column; gap: 20px; }
Важно указать при помощи grid
, что элементы должны вставать в колонки, чтобы элементы без контента были видны.
Как видите, автоматически создаются колонки размером 75, 100 и затем 50 пикселей. И так до тех пор, пока элементы не закончатся.
grid-auto-flow
СкопированоЕсли грид-элементов больше, чем явно объявленных колонок или рядов, то они автоматически размещаются внутри родителя. А вот каким образом — в ряд или в колонку — можно указать при помощи свойства grid
. По умолчанию значение у этого свойства row
, лишние элементы будут выстраиваться в ряды в рамках явно заданных колонок.
Возможные значения:
row
(значение по умолчанию) — автоматически размещаемые элементы выстраиваются в ряды.column
— автоматически размещаемые элементы выстраиваются в колонки.dense
— браузер старается заполнить дырки (пустые ячейки) в разметке, если размеры элементов позволяют. Можно сочетать с остальными значениями.
Принципы работы этого свойства удобнее всего изучать на примере, когда есть большой блок, который не помещается в одну грид-ячейку.
.container { display: grid; /* Три колонки */ grid-template-columns: auto auto auto; /* Два ряда */ grid-template-rows: auto auto; /* Автоматическое размещение в ряд */ grid-auto-flow: row; /* Отступы между ячейками */ gap: 20px;}.item3 { /* Занимает один ряд и растягивается на две колонки */ grid-column: span 2;}
.container { display: grid; /* Три колонки */ grid-template-columns: auto auto auto; /* Два ряда */ grid-template-rows: auto auto; /* Автоматическое размещение в ряд */ grid-auto-flow: row; /* Отступы между ячейками */ gap: 20px; } .item3 { /* Занимает один ряд и растягивается на две колонки */ grid-column: span 2; }
Как видите, третий элемент не поместился в последнюю ячейку первого ряда и был перенесён в следующий ряд. Следующий за ним четвёртый элемент встал в ближайшую доступную ячейку во втором ряду.
Добавим к значению свойства grid
слово dense
:
.container { /* Автоматическое размещение в ряд */ grid-auto-flow: row dense;}
.container { /* Автоматическое размещение в ряд */ grid-auto-flow: row dense; }
Теперь четвёртый элемент встал в ряд, но занял при этом пустую ячейку в первом ряду. Браузер старается закрыть все дырки в сетке, переставляя подходящие элементы на свободные места.
Посмотрим пример со значением column
:
.container { grid-template-columns: auto auto; grid-template-rows: auto auto auto; /* Автоматическое размещение в колонку */ grid-auto-flow: column;}.item3 { grid-row: span 2;}
.container { grid-template-columns: auto auto; grid-template-rows: auto auto auto; /* Автоматическое размещение в колонку */ grid-auto-flow: column; } .item3 { grid-row: span 2; }
Видим аналогичную картину: третий элемент не поместился в последнюю ячейку первой колонки и встал во вторую колонку. Следующий за ним четвёртый элемент встал ниже во второй колонке.
Добавим dense
к текущему значению:
.container { /* Автоматическое размещение в ряд */ grid-auto-flow: column dense;}
.container { /* Автоматическое размещение в ряд */ grid-auto-flow: column dense; }
В результате четвёртый элемент занял пустую ячейку в первой колонке.
grid-template-areas
СкопированоПозволяет задать шаблон сетки расположения элементов внутри грид-контейнера. Имена областей задаются при помощи свойства grid
. Текущее свойство grid
просто указывает, где должны располагаться эти грид-области.
Возможные значения:
none
(значение по умолчанию) — области сетки не задано имя..
— означает пустую ячейку.- название — название области, может быть абсолютно любым словом или даже эмодзи! 🤯
Обратите внимание, что нужно называть каждую из ячеек. Например, если шапка или подвал нашего сайта будут занимать все три существующие колонки, то нужно будет трижды написать названия этих областей. Удобнее всего будет подписывать области в виде некой таблицы. Подобный способ записи чем-то похож на таблицы в Markdown:
.container { display: grid; grid-template-columns: repeat(3, 500px); grid-template-rows: repeat(4, 1fr); grid-template-areas: "header header header" "content content 👾" "content content ." "footer footer footer";}.item1 { grid-area: header;}.item2 { grid-area: content;}.item3 { grid-area: 👾;}.item4 { grid-area: footer;}
.container { display: grid; grid-template-columns: repeat(3, 500px); grid-template-rows: repeat(4, 1fr); grid-template-areas: "header header header" "content content 👾" "content content ." "footer footer footer"; } .item1 { grid-area: header; } .item2 { grid-area: content; } .item3 { grid-area: 👾; } .item4 { grid-area: footer; }
Обратите внимание, что между строками не ставятся запятые или какие-то другие символы, имена разделяются пробелами.
Получится такая раскладка:
Имена областей должны разделяться пробелами. Это важно, особенно в том случае, если вы хотите расположить две пустых ячейки рядом. Разделите точки пробелами, иначе браузер подумает, что это одна пустая ячейка.
grid-template
СкопированоСвойство-шорткат для свойств grid
, grid
. Позволяет записать все значения в одну строку. Главное после этого не запутаться при чтении 😅
Можно прописать все колонки и ряды сразу, разделяя их слэшем /
. Сперва идут ряды, а затем колонки, не перепутайте!
.container { display: grid; grid-template: repeat(4, 1fr) / repeat(3, 500px);}
.container { display: grid; grid-template: repeat(4, 1fr) / repeat(3, 500px); }
В этом же свойстве можно задавать значение и для свойства grid
, но тогда код превращается в кашу и становится совершенно нечитабельным. Лучше всё же использовать это свойство отдельно:
Лучше так?
.container { display: grid; grid-template: [row1-start] "header header header" 25px [row1-end] [row2-start] "footer footer footer" 25px [row2-end] / auto 50px auto;}
.container { display: grid; grid-template: [row1-start] "header header header" 25px [row1-end] [row2-start] "footer footer footer" 25px [row2-end] / auto 50px auto; }
Или так?
.container { display: grid; grid-template: [row1-start] 25px [row1-end] [row2-start] 25px [row2-end] / auto 50px auto; grid-template-areas: "header header header" "footer footer footer";}
.container { display: grid; grid-template: [row1-start] 25px [row1-end] [row2-start] 25px [row2-end] / auto 50px auto; grid-template-areas: "header header header" "footer footer footer"; }
Но техническая возможность есть, выбирать вам! 😉
row-gap
, column-gap
СкопированоЗадают отступы между рядами или колонками.
.container { display: grid; grid-template-columns: 1fr 350px 1fr; grid-template-rows: repeat(3, 150px); /* Отступы между рядами */ row-gap: 50px; /* Отступы между колонками */ column-gap: 20px;}
.container { display: grid; grid-template-columns: 1fr 350px 1fr; grid-template-rows: repeat(3, 150px); /* Отступы между рядами */ row-gap: 50px; /* Отступы между колонками */ column-gap: 20px; }
В инспекторе отступы заштриховываются, так их можно отличить от грид-элементов. В этом примере между рядами отступы по 50 пикселей, а между колонками — по 20 пикселей.
gap
СкопированоШорткат для записи значений свойств row
и column
. Значения разделяются пробелом:
.container { display: grid; grid-template-columns: 1fr 350px 1fr; grid-template-rows: repeat(3, 150px); gap: 50px 20px;}
.container { display: grid; grid-template-columns: 1fr 350px 1fr; grid-template-rows: repeat(3, 150px); gap: 50px 20px; }
justify-content
СкопированоСвойство, с помощью которого можно выровнять элементы вдоль оси строки. Данное свойство работает, только если общая ширина столбцов меньше ширины контейнера сетки. Другими словами, вам нужно свободное пространство вдоль оси строки контейнера, чтобы выровнять его столбцы слева или справа.
Возможные значения:
start
— выравнивает сетку по левой стороне грид-контейнера.
.container { display: grid; grid-template-columns: repeat(3, 300px); gap: 20px; justify-content: start;}
.container { display: grid; grid-template-columns: repeat(3, 300px); gap: 20px; justify-content: start; }
end
— выравнивает сетку по правой стороне грид-контейнера.
.container { display: grid; grid-template-columns: repeat(3, 300px); gap: 20px; justify-content: end;}
.container { display: grid; grid-template-columns: repeat(3, 300px); gap: 20px; justify-content: end; }
center
— выравнивает сетку по центру грид-контейнера.
.container { display: grid; grid-template-columns: repeat(3, 300px); gap: 20px; justify-content: center;}
.container { display: grid; grid-template-columns: repeat(3, 300px); gap: 20px; justify-content: center; }
stretch
— масштабирует элементы, чтобы сетка могла заполнить всю ширину грид-контейнера.
.container { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; justify-content: stretch;}
.container { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; justify-content: stretch; }
space
— одинаковое пространство между элементами и полуразмерные отступы по краям.
.container { display: grid; grid-template-columns: repeat(3, 300px); gap: 20px; justify-content: space-around;}
.container { display: grid; grid-template-columns: repeat(3, 300px); gap: 20px; justify-content: space-around; }
space
— одинаковое пространство между элементами и полноразмерные отступы по краям.
.container { display: grid; grid-template-columns: repeat(3, 300px); gap: 20px; justify-content: space-evenly;}
.container { display: grid; grid-template-columns: repeat(3, 300px); gap: 20px; justify-content: space-evenly; }
space
— одинаковое пространство между элементами без отступов по краям.
.container { display: grid; grid-template-columns: repeat(3, 300px); gap: 20px; justify-content: space-between;}
.container { display: grid; grid-template-columns: repeat(3, 300px); gap: 20px; justify-content: space-between; }
justify-items
СкопированоСвойство, с помощью которого задаётся выравнивание грид-элементов по горизонтальной оси. Применяется ко всем элементам внутри грид-родителя.
Возможные значения:
start
— выравнивает элемент по начальной (левой для LTR) линии.
.container { display: grid; grid-template-columns: 1fr 400px 1fr; grid-template-rows: repeat(3, 170px); gap: 20px; justify-items: start;}.item { min-width: 300px;}
.container { display: grid; grid-template-columns: 1fr 400px 1fr; grid-template-rows: repeat(3, 170px); gap: 20px; justify-items: start; } .item { min-width: 300px; }
end
— выравнивает элемент по конечной (правой для LTR) линии.
.container { justify-items: end;}
.container { justify-items: end; }
center
— выравнивает элемент по центру грид-ячейки.
.container { justify-items: center;}
.container { justify-items: center; }
stretch
— растягивает элемент на всю ширину грид-ячейки, при условии, что у него не задана фиксированная ширина.
.container { justify-items: stretch;}
.container { justify-items: stretch; }
Можно управлять выравниванием отдельных грид-элементов при помощи свойства justify
.
align-items
СкопированоСвойство, с помощью которого можно выровнять элементы по вертикальной оси внутри грид-контейнера.
Возможные значения:
start
— выравнивает элемент по начальной (верхней) линии.
.container { display: grid; grid-template-columns: 1fr 400px 1fr; grid-template-rows: repeat(3, 170px); gap: 20px; align-items: start;}.item { min-height: 100px;}
.container { display: grid; grid-template-columns: 1fr 400px 1fr; grid-template-rows: repeat(3, 170px); gap: 20px; align-items: start; } .item { min-height: 100px; }
end
— выравнивает элемент по конечной (нижней) линии.
.container { align-items: end;}
.container { align-items: end; }
center
— выравнивает элемент по центру грид-ячейки.
.container { align-items: center;}
.container { align-items: center; }
stretch
— растягивает элемент на всю высоту грид-ячейки.
.container { align-items: stretch;}
.container { align-items: stretch; }
Можно также управлять выравниванием отдельных грид-элементов при помощи свойства align
.
place-items
СкопированоШорткат для указания значений сразу и для align
и для justify
. Указывать нужно именно в таком порядке.
.container { display: grid; place-items: stretch end;}
.container { display: grid; place-items: stretch end; }
grid
СкопированоМегашорткат, позволяющий задать значения всему и сразу. А конкретно с его помощью можно указать значения для следующих свойств:
grid
;- template - rows grid
;- template - columns grid
;- template - areas grid
;- auto - rows grid
;- auto - columns grid
.- auto - flow
Перед тем как соблазниться возможностью расписать всё в одном свойстве, дважды (а то и трижды) подумайте о читабельности кода. Учтите и то, что гриды относительно новая и не такая уж простая технология. Не каждый коллега сможет прочесть этот шорткат.
Возможные значения:
none
— значение по умолчанию. Это ключевое слово сбрасывает значения для всех свойств, входящих в этот шорткат.
.container { display: grid; grid: none;}
.container { display: grid; grid: none; }
Можно указать допустимые значения для шортката grid
:
.container { display: grid; grid: repeat(4, 150px) / 1fr 200px 1fr;}
.container { display: grid; grid: repeat(4, 150px) / 1fr 200px 1fr; }
В том числе можно указать имена линий:
.container { display: grid; grid: [row1-start] 25px [row1-end row2-start] 25px [row2-end] / auto 50px auto;}
.container { display: grid; grid: [row1-start] 25px [row1-end row2-start] 25px [row2-end] / auto 50px auto; }
Можно задать размеры колонок и рядов. Создадим два ряда и две колонки:
.container { display: grid; grid: 200px 100px / 30% 30%;}
.container { display: grid; grid: 200px 100px / 30% 30%; }
auto
— это ключевое слово даёт браузеру понять, что создавать при необходимости: колонки или ряды.
Если auto
стоит справа от слэша, то будут создаваться автоматические колонки:
.container { display: grid; grid: 200px 100px / auto-flow 30%;}
.container { display: grid; grid: 200px 100px / auto-flow 30%; }
Если auto
стоит слева от слэша, то будут создаваться автоматические ряды:
.container { display: grid; grid: auto-flow 30% / 200px 100px;}
.container { display: grid; grid: auto-flow 30% / 200px 100px; }
dense
— к ключевому слову auto
можно добавить dense
. Это укажет браузеру, что элементы должны стараться заполнить свободные ячейки. Подробнее про работу этого ключевого слова можно почитать в статье про grid
.
Важно ставить это слово сразу после auto
:
.container { display: grid; grid: auto-flow dense 30% / 200px 100px;}
.container { display: grid; grid: auto-flow dense 30% / 200px 100px; }
Ниже будет несколько примеров с блоками кода, которые делают одно и то же, в первом случае через шорткат, во втором — как обычно.
Задаёт размеры и количество колонок и рядов:
.container { grid: 50px 150px / 2fr 1fr;}.container { grid-template-rows: 50px 150px; grid-template-columns: 2fr 1fr;}
.container { grid: 50px 150px / 2fr 1fr; } .container { grid-template-rows: 50px 150px; grid-template-columns: 2fr 1fr; }
Задаёт размеры и количество рядов, а также автоматические колонки:
.container { grid: 200px 1fr / auto-flow 200px;}.container { grid-auto-flow: column; grid-template-rows: 200px 1fr; grid-auto-columns: 200px;}
.container { grid: 200px 1fr / auto-flow 200px; } .container { grid-auto-flow: column; grid-template-rows: 200px 1fr; grid-auto-columns: 200px; }
Задаёт размеры и количество рядов, автоматические колонки и распределение dense
:
.container { grid: auto-flow dense 300px / 2fr 3fr;}.container { grid-auto-flow: row dense; grid-auto-rows: 300px; grid-template-columns: 2fr 3fr;}
.container { grid: auto-flow dense 300px / 2fr 3fr; } .container { grid-auto-flow: row dense; grid-auto-rows: 300px; grid-template-columns: 2fr 3fr; }
Возможны и более сложные комбинации значений этого свойства. Например, можно сразу задать имена областям:
.container { grid: [row1-start] "header header header" 1fr [row1-end] [row2-start] "footer footer footer" 25px [row2-end] / auto 50px auto;}
.container { grid: [row1-start] "header header header" 1fr [row1-end] [row2-start] "footer footer footer" 25px [row2-end] / auto 50px auto; }
Что соответствует такому коду:
.container { grid-template-areas: "header header header" "footer footer footer"; grid-template-rows: [row1-start] 1fr [row1-end row2-start] 25px [row2-end]; grid-template-columns: auto 50px auto;}
.container { grid-template-areas: "header header header" "footer footer footer"; grid-template-rows: [row1-start] 1fr [row1-end row2-start] 25px [row2-end]; grid-template-columns: auto 50px auto; }
Свойства грид-элементов
СкопированоВажное замечание: свойства float
, display
, display
, vertical
и column
не дают никакого эффекта, когда применяются к грид-элементам.
grid-column-start
, grid-column-end
, grid-row-start
, grid-row-end
СкопированоОпределяют положение элемента внутри грид-сетки при помощи указания на конкретные направляющие линии.
Возможные значения:
название или номер линии
— может быть порядковым номером или названием конкретной линии.span число
— элемент растянется на указанное количество ячеек.span имя
— элемент будет растягиваться до следующей указанной линии.auto
— означает автоматическое размещение, автоматический диапазон клеток или дефолтное растягивание элемента, равное одному.
.container { display: grid; grid-template-columns: [one] 1fr [two] 1fr [three] 1fr [four] 1fr [five] 1fr [six]; grid-template-rows: [row1-start] 1fr [row1-end] 1fr 1fr;}.item1 { grid-column-start: 2; grid-column-end: five; grid-row-start: row1-start; grid-row-end: 3;}
.container { display: grid; grid-template-columns: [one] 1fr [two] 1fr [three] 1fr [four] 1fr [five] 1fr [six]; grid-template-rows: [row1-start] 1fr [row1-end] 1fr 1fr; } .item1 { grid-column-start: 2; grid-column-end: five; grid-row-start: row1-start; grid-row-end: 3; }
Элемент разместился по горизонтали от второй грид-линии до линии с названием [five
, а по вертикали — от линии с именем [row1
до линии под номером 3.
.container { display: grid; grid-template-columns: [first] 1fr [line2] 1fr [line3] 1fr [col4-start] 1fr [five] 1fr [end]; grid-template-rows: [row1-start] 1fr [row1-end] 1fr [third-line] 1fr [last-line];}.item1 { grid-column-start: 1; grid-column-end: span col4-start; grid-row-start: 2; grid-row-end: span 2;}
.container { display: grid; grid-template-columns: [first] 1fr [line2] 1fr [line3] 1fr [col4-start] 1fr [five] 1fr [end]; grid-template-rows: [row1-start] 1fr [row1-end] 1fr [third-line] 1fr [last-line]; } .item1 { grid-column-start: 1; grid-column-end: span col4-start; grid-row-start: 2; grid-row-end: span 2; }
Элемент расположился по вертикали от второй грид-линии и растянулся на две ячейки, а по горизонтали — от первой линии и растянулся до линии с названием [col4
.
Если не указать значения для свойств grid
и grid
, то элемент по умолчанию будет размером в одну грид-ячейку.
Элементы могут перекрывать друг друга, накладываться друг на друга. Можно использовать свойство z
для управления контекстом наложения.
grid-column
, grid-row
СкопированоСвойства-шорткаты для grid
, grid
и grid
, grid
соответственно.
Значения для *
и *
разделяются слэшем.
Можно использовать ключевое слово span
, буквально говорящее «растянись на столько-то». А на сколько, указывает стоящая за ним цифра.
.item1 { grid-column: 3 / span 2; grid-row: 3 / 4;}
.item1 { grid-column: 3 / span 2; grid-row: 3 / 4; }
Элемент начинается с третьей линии по горизонтали и растягивается на 2 ячейки. По вертикали элемент начинается от третьей линии и заканчивается у четвёртой линии.
Если опустить слэш и второе значение, то элемент будет размером в одну ячейку.
grid-area
СкопированоДвуличное свойство 🧐, которое может как указывать элементу, какую из именованных областей ему нужно занять, так и служить шорткатом для одновременного указания значений для четырёх свойств: grid
, grid
, grid
и grid
.
Пример с указанием на именованную область:
.item1 { /* Займёт область content внутри грид-сетки */ grid-area: content;}
.item1 { /* Займёт область content внутри грид-сетки */ grid-area: content; }
А теперь пример с указанием всех четырёх значений в строку. При таком указании значений есть скользкое место: значения указываются в таком порядке: row
, то есть сначала указываем оба начала, а потом оба конца.
.item2 { grid-area: 1 / col4-start / last-line / 6;}
.item2 { grid-area: 1 / col4-start / last-line / 6; }
justify-self
СкопированоС помощью этого свойства можно установить горизонтальное выравнивание для отдельного элемента, отличное от выравнивания, заданного грид-родителю.
Возможные значения аналогичны значениям свойства justify
.
.container { justify-items: stretch;}.item1 { justify-self: center;}
.container { justify-items: stretch; } .item1 { justify-self: center; }
align-self
СкопированоА это свойство, как нетрудно догадаться, выравнивает отдельный элемент по вертикальной оси. Возможные значения аналогичны значениям свойства align
.
.container { align-items: stretch;}.item1 { align-self: start;}
.container { align-items: stretch; } .item1 { align-self: start; }
place-self
СкопированоШорткат для одновременного указания значений свойствам justify
и align
.
Возможные значения:
auto
(значение по умолчанию) — стандартное значение, можно использовать для сброса ранее заданных значений.align
— первое значение задаёт значение свойству- self justify - self align
, второе значение устанавливает значение свойства- self justify
. Если указано всего одно значение, то оно устанавливается для обоих свойств. Например,- self place
отцентрирует элемент по горизонтальной и по вертикальной осям одновременно.- self : center
Специальные функции и ключевые слова
СкопированоКогда вы задаёте размеры колонкам и рядам, вам доступны не только давно известные единицы измерения (px
, vw
, rem
, %
и так далее), но и очень крутые ключевые слова min
, max
и auto
. И уже упомянутые единицы измерения fr
.
Гриды подарили нам ещё одну волшебную функцию, позволяющую одновременно задавать минимальный и максимальный размер — minmax
. Например, в случае записи grid
колонка займёт 1 часть свободного пространства грид-контейнера, но не меньше 200 пикселей.
Ещё одна полезная функция, появившаяся в гридах, это repeat
. Сэкономит вам кучу лишних букв и времени.
Анимация свойств
СкопированоДля анимации доступны следующие свойства и их значения:
- Значения свойств
gap
,row
,- gap column
, указанные в единицах измерения, процентах или при помощи- gap calc
.( ) - Значения свойств
grid
,- template - columns grid
, указанные в единицах измерения, процентах или при помощи функции- template - rows calc
при условии, что анимируются аналогичные значения.( )
Ссылки
Скопировано- A Complete Guide to Grid
- Grid Cheatsheet
- Grid Garden
- GRID cheat sheet
- Learning CSS Grid
- Animating CSS Grid Layout properties
На практике
Скопированосоветует Скопировано
Грид выручит, когда нужно сверстать сложную сетку, которая меняется в зависимости от размеров экрана устройства. Возьмём пример с интерфейсом онлайн-магазина:
В мобильной версии нужно сильно поменять порядок отображения, а для SEO нужно сохранить определённый порядок.
В демо ниже используются именованные области для расположения элементов. При переключении на мобильную версию элементы перестраиваются в нужном порядке за счёт изменения расположения именованных областей
.cart-product { display: grid; grid-template-columns: repeat(6, 1fr); grid-template-rows: repeat(5, 1fr); grid-template-areas: "image image image title title title" "image image image price rating rating" "features features features price payment payment" "description description description description reviews reviews " "shipping contact availability availability warranty sizes" "material material related related related related";}@media (max-width: 720px) { .cart-product { grid-template-columns: repeat(4, 1fr); grid-template-areas: "image image price rating" "image image description description" "title title title title" "reviews reviews features features" "availability payment shipping contact" "warranty warranty sizes sizes" "warranty warranty sizes sizes" "material material material related"; }}
.cart-product { display: grid; grid-template-columns: repeat(6, 1fr); grid-template-rows: repeat(5, 1fr); grid-template-areas: "image image image title title title" "image image image price rating rating" "features features features price payment payment" "description description description description reviews reviews " "shipping contact availability availability warranty sizes" "material material related related related related"; } @media (max-width: 720px) { .cart-product { grid-template-columns: repeat(4, 1fr); grid-template-areas: "image image price rating" "image image description description" "title title title title" "reviews reviews features features" "availability payment shipping contact" "warranty warranty sizes sizes" "warranty warranty sizes sizes" "material material material related"; } }
Балдин Кирилл — наставник на курсе «Мидл фронтенд-разработчик» в Яндекс Практикуме.
советует Скопировано
🛠 Самый удобный инструмент для инспектирования вёрстки на гридах на сегодня в браузере Firefox! Даже если в остальное время вы сидите в другом браузере, то на время вёрстки я настоятельно советую вам переключиться. Ничего удобнее человечество ещё не придумало 🤩
На собеседовании
Скопировано отвечает
СкопированоГриды являются лучшим выбором, когда у вас есть сложные проекты, требующие вёрстки с использованием двумерной компоновки. Эта система позволяет создавать вёрстку с сложным дизайном, который легко обслуживается и требует меньше усилий при поддержке и масштабировании. Кроме того, свойство gap
упрощает определение отступов между элементами и использование его для создания перекрывающихся элементов. Если вы работаете над проектом впервые и хотите создавать структуру и дизайн будущей вёрстки с помощью гридов, то эта система будет очень полезной.
Во всех остальных случаях можно смело использовать флексбоксы.