Статьи

Введение в CSS Grid Layout с примерами

Конечный продукт
Что вы будете создавать

В этом уроке я рассмотрю основы макета CSS-сетки с примерами сценариев. CSS Grid теперь поддерживается практически всеми современными браузерами и готов к использованию в производстве. В отличие от других методов компоновки, таких как flexbox, компоновка сетки дает вам две степени свободы, что делает его настолько универсальным, что позиционирование элементов — это просто.

Чтобы использовать макет 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.

Первыми вещами, которые нам нужно узнать о макете сетки, являются 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;
}

До сих пор мы фокусировались только на форме сетки и элементах, которые просто перетекли в сетку. Теперь мы научимся управлять каждым элементом индивидуально.

Для позиционирования элементов мы используем линии сетки в качестве ссылки. Ниже вы видите строки и столбцы черного и оранжевого цвета соответственно для сетки 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 .

Вы можете назвать каждый дочерний элемент и использовать эти имена для создания вашей сетки. Это действительно мощный инструмент, который делает макет более интуитивным.

Таким образом, мы определяем 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 или любые другие источники для получения полного списка свойств и функций сетки.