
В этом уроке я рассмотрю основы макета CSS-сетки с примерами сценариев. CSS Grid теперь поддерживается практически всеми современными браузерами и готов к использованию в производстве. В отличие от других методов компоновки, таких как flexbox, компоновка сетки дает вам две степени свободы, что делает его настолько универсальным, что позиционирование элементов — это просто.
Структура HTML для CSS Grid Layout
Чтобы использовать макет CSS Grid, ваши HTML-элементы должны иметь определенную структуру.
Вам нужно обернуть элементы, которыми вы хотите управлять, в родительский контейнер DIV.
|
1
2
3
4
5
6
|
<div class=»wrapper»>
<div class=»div1″>1</div>
<div class=»div2″>2</div>
<div class=»div3″>3</div>
<div class=»div4″>4</div>
</div>
|
Давайте добавим некоторые стили для наших DIV, чтобы мы могли легко их различать.
Кроме того, установите display: grid в вашей wrapper DIV, чтобы мы могли начать использовать сетку.
|
01
02
03
04
05
06
07
08
09
10
11
12
|
.wrapper > div{
background-color: orange;
border: 1px black solid;
}
.wrapper > div:nth-child(odd){
background-color: indianred;
}
.wrapper{
display: grid
}
|
С этого момента все стили будут идти в wrapper DIV. Если мы когда-нибудь захотим контролировать дочерние DIV в любой точке, то мы добавим правила стилевого оформления для конкретного дочернего DIV.
Правила для родителей DIV
Первыми вещами, которые нам нужно узнать о макете сетки, являются grid-template-columns и grid-template-rows . Эти два правила в основном контролируют форму вашей сетки.
Значением этих правил может быть длина, процент или доля свободного пространства в сетке. Вы также можете установить любое значение на auto , которое заполняет оставшееся пространство.
Давайте посмотрим несколько примеров ниже.
Сетка-шаблон-столбцы и Сетка-шаблон-строки
Сетка-шаблон-столбцы
|
1
2
3
4
|
.wrapper{
display: grid;
grid-template-columns: 100px 100px 100px
}
|
|
1
2
3
4
|
.wrapper{
display: grid;
grid-template-columns: 100px auto 100px
}
|
|
1
2
3
4
|
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
}
|
сетка-шаблон-столбцы и сетка-шаблон-строки
Давайте начнем строить реальную сетку, в которой у нас есть контроль над столбцами и строками.
|
1
2
3
4
5
|
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 50px 50px;
}
|
|
1
2
3
4
5
|
.wrapper {
display: grid;
grid-template-columns: 100px 20px 250px;
grid-template-rows: 150px 40px;
}
|
Здесь я только что добавил еще два дочерних DIV в HTML для того же CSS.
Повторите шаблон сетки шаблон
Если у вас есть повторяющийся шаблон для grid-template , Вы можете просто использовать повторить и сказать, сколько раз повторить один и тот же шаблон.
Например, скажем, у вас есть 12 элементов, и вы хотите расположить их горизонтально с равной шириной. Вы можете повторить 1fr 12 раз внутри grid-template-columns 1fr , что не эффективно. Таким образом, вместо этого вы можете использовать repeat(12, 1fr) .
|
1
2
3
4
|
.wrapper {
display: grid;
grid-template-columns: repeat(12, 1fr)
}
|
Точно так же вы можете повторить шаблон.
|
1
2
3
4
|
.wrapper {
display: grid;
grid-template-columns: repeat(4, 1fr 5fr 10fr);
}
|
Сетка-авто-столбцы и Сетка-авто-строки
Это правило помогает вам установить ширину и высоту ячеек сетки.
Если вы не установите это правило, строки и столбцы сетки будут расширяться вместе с содержимым.
|
1
2
3
4
5
|
.wrapper {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-rows: 100px;
}
|
|
1
2
3
4
5
|
.wrapper {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-rows: 20px 80px;
}
|
Хорошая функция для использования с grid-auto правилом — это функция minmax .
Вы просто устанавливаете минимальный размер в качестве первого параметра и максимальный в качестве второго параметра. Если вы установите auto для второго параметра, вы получите адаптивный размер ячейки.
|
1
2
3
4
5
|
.wrapper {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-rows: minmax(50px, auto)
}
|
Ниже вы видите два разных содержимого DIV с одинаковыми правилами CSS.
Сетка зазора
Как следует из названия, это правило создает разрыв между ячейками сетки.
Если вы используете grid-gap: 5px , вы получите 5px разрыв между каждой ячейкой. В качестве альтернативы вы можете установить только пропуски между строками или столбцами с разрывами grid-row-gap: 5px и grid-row-gap: 5px grid-column-gap: 5px соответственно.
|
1
2
3
4
5
6
|
.wrapper {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-rows: minmax(50px, auto);
grid-gap: 5px;
}
|
Правила для детей DIVs
До сих пор мы фокусировались только на форме сетки и элементах, которые просто перетекли в сетку. Теперь мы научимся управлять каждым элементом индивидуально.
Для позиционирования элементов мы используем линии сетки в качестве ссылки. Ниже вы видите строки и столбцы черного и оранжевого цвета соответственно для сетки 2х4.

Мы будем использовать правила grid-column и grid-row с номерами строк для позиционирования элементов.
Например, если мы установим grid-column: 1/3 для первого дочернего элемента div, он будет использовать первые две ячейки в сетке.
Рассмотрим HTML и CSS ниже:
|
01
02
03
04
05
06
07
08
09
10
|
<div class=»wrapper»>
<div class=»div1″>1</div>
<div class=»div2″>2</div>
<div class=»div3″>3</div>
<div class=»div4″>4</div>
<div class=»div5″>5</div>
<div class=»div6″>6</div>
<div class=»div7″>7</div>
<div class=»div8″>8</div>
</div>
|
|
1
2
3
4
5
6
|
.wrapper {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-rows: 100px;
grid-gap: 5px;
}
|
У нас есть четыре столбца одинакового размера и восемь элементов в wrapper DIV.
|
1
2
3
|
.div1{
grid-column: 1/3;
}
|
|
1
2
3
4
|
.div1{
grid-column: 1/3;
grid-row: 1/3;
}
|
Вы также можете объединить эти два правила в одно правило grid-area: rowStart/columnStart/rowEnd/columnEnd .
|
1
2
3
|
.div1{
grid-area: 2/2/3/4;
}
|
Как показано в приведенном выше примере, элементы не связаны со структурой HTML. Обратите внимание, как первый элемент перемещается с помощью правила grid-area .
Grid-area & grid-template-area
Вы можете назвать каждый дочерний элемент и использовать эти имена для создания вашей сетки. Это действительно мощный инструмент, который делает макет более интуитивным.
Таким образом, мы определяем DIV для каждого элемента, который мы планируем разместить в нашей сетке.
Я планирую иметь заголовок, leftColumn, rightColumn, middleTop, middleBottom и нижний колонтитул.
Так что в моем HTML мне нужно много дочерних DIV. Имена классов могут быть любыми.
|
1
2
3
4
5
6
7
8
|
<div class=»wrapper»>
<div class=»header»>Header</div>
<div class=»leftCol»>LeftCol</div>
<div class=»rightCol»>RightCol</div>
<div class=»midTop»>midTop</div>
<div class=»midBottom»>midBottom</div>
<div class=»footer»>Footer</div>
</div>
|
Затем внутри моего CSS я устанавливаю имена grid-area . Эти имена могут быть чем угодно; они не должны совпадать с именами классов.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
.header{
grid-area: header;
background-color: LightSeaGreen ;
}
.leftCol{
grid-area: leftCol;
background-color: orange;
}
.rightCol{
grid-area: rightCol;
background-color: lightblue;
}
.midTop{
grid-area: midTop;
background-color: lightgrey;
}
.midBottom{
grid-area: midBottom;
background-color: pink;
}
.footer{
grid-area: footer;
background-color: lightgreen;
}
|
Затем внутри своей wrapper DIV я использую правило grid-template-areas чтобы расположить эти элементы, ссылаясь на их определенные имена.
Обратите внимание, что у меня есть сетка 4х4.
|
01
02
03
04
05
06
07
08
09
10
11
|
.wrapper {
display: grid;
grid-template-columns: 1fr 4fr 4fr 1fr;
grid-template-rows: 50px 100px 100px 30px;
grid-template-areas:
«header header header header»
«leftCol midTop midTop rightCol»
«leftCol midBottom midBottom rightCol»
«footer footer footer footer»;
grid-gap: 5px;
}
|
Если, например, я хочу, чтобы нижний колонтитул занимал только два столбца и центрировался, тогда я просто заменяю первый и последний вид нижнего колонтитула точкой ( . ) В grid-template-areas .
|
01
02
03
04
05
06
07
08
09
10
11
|
.wrapper {
display: grid;
grid-template-columns: 1fr 4fr 4fr 1fr;
grid-template-rows: 50px 100px 100px 30px;
grid-template-areas:
«header header header header»
«leftCol midTop midTop rightCol»
«leftCol midBottom midBottom rightCol»
«. footer footer .»;
grid-gap: 5px;
}
|
Вывод
CSS Grid имеет множество правил, и я рассмотрел только самые полезные в этом уроке. Вы по-прежнему можете просматривать MDN Web Docs или любые другие источники для получения полного списка свойств и функций сетки.