1 added
1 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>13 мар 2023</li>
2
<ul><li>13 мар 2023</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Знакомимся с самой гибкой и современной разметкой CSS.</p>
4
</ul><p>Знакомимся с самой гибкой и современной разметкой CSS.</p>
5
<p>Иллюстрация: Оля Ежак для Skillbox Media</p>
5
<p>Иллюстрация: Оля Ежак для Skillbox Media</p>
6
<p>Программист, музыкант. Знает Java, C# и Unity3D, но не собирается останавливаться на достигнутом.</p>
6
<p>Программист, музыкант. Знает Java, C# и Unity3D, но не собирается останавливаться на достигнутом.</p>
7
<p>При просмотре разных сайтов в интернете можно заметить, как аккуратно располагаются на них элементы независимо от размера экрана: навигация, кнопки, блоки с текстом и другие вещи. За это отвечает язык разметки CSS (Cascading Style Sheets). Она бывает разных видов, но сегодня поговорим об одном из них, самом адаптивном -<strong>CSS-гридах</strong>.</p>
7
<p>При просмотре разных сайтов в интернете можно заметить, как аккуратно располагаются на них элементы независимо от размера экрана: навигация, кнопки, блоки с текстом и другие вещи. За это отвечает язык разметки CSS (Cascading Style Sheets). Она бывает разных видов, но сегодня поговорим об одном из них, самом адаптивном -<strong>CSS-гридах</strong>.</p>
8
<p>Из этой статьи вы узнаете:</p>
8
<p>Из этой статьи вы узнаете:</p>
9
<ul><li><a>Что такое CSS Grid</a></li>
9
<ul><li><a>Что такое CSS Grid</a></li>
10
<li><a>Как его создать</a></li>
10
<li><a>Как его создать</a></li>
11
<li><a>Какие свойства есть у грид-контейнера</a></li>
11
<li><a>Какие свойства есть у грид-контейнера</a></li>
12
<li><a>А какие - у грид-элементов</a></li>
12
<li><a>А какие - у грид-элементов</a></li>
13
<li><a>Как задать отступы между элементами</a></li>
13
<li><a>Как задать отступы между элементами</a></li>
14
<li><a>Как выровнять сразу все элементы в грид-контейнере</a></li>
14
<li><a>Как выровнять сразу все элементы в грид-контейнере</a></li>
15
<li><a>Как выровнять отдельные элементы</a></li>
15
<li><a>Как выровнять отдельные элементы</a></li>
16
<li><a>Что такое вложенные гриды</a></li>
16
<li><a>Что такое вложенные гриды</a></li>
17
<li><a>Что нужно запомнить</a></li>
17
<li><a>Что нужно запомнить</a></li>
18
</ul><p><strong>Grid (сетка)</strong> - это вид разметки, в котором элементы на сайте расположены в виде таблицы. Главная фишка этой таблицы в гибкости - можно объединять отдельные ячейки, менять размеры строк и столбцов, регулировать отступы между ними. А ещё гриды хорошо приспосабливаются к разным размерам экрана, что делает их адаптивными.</p>
18
</ul><p><strong>Grid (сетка)</strong> - это вид разметки, в котором элементы на сайте расположены в виде таблицы. Главная фишка этой таблицы в гибкости - можно объединять отдельные ячейки, менять размеры строк и столбцов, регулировать отступы между ними. А ещё гриды хорошо приспосабливаются к разным размерам экрана, что делает их адаптивными.</p>
19
<p>Структура грида напоминает обычный Excel-файл: есть горизонтальные и вертикальные линии, которые вместе образуют много разных ячеек. Только, в отличие от файла в Excel, внутри ячеек находятся не выгрузки по зарплате за март, а элементы сайта: текст, картинки, кнопки, блоки HTML-кода и так далее. А формально все эти части грид-разметки называются так:</p>
19
<p>Структура грида напоминает обычный Excel-файл: есть горизонтальные и вертикальные линии, которые вместе образуют много разных ячеек. Только, в отличие от файла в Excel, внутри ячеек находятся не выгрузки по зарплате за март, а элементы сайта: текст, картинки, кнопки, блоки HTML-кода и так далее. А формально все эти части грид-разметки называются так:</p>
20
<ul><li><strong>grid-контейнер</strong> - самый главный элемент во всей разметке, в нём хранится всё содержимое сетки;</li>
20
<ul><li><strong>grid-контейнер</strong> - самый главный элемент во всей разметке, в нём хранится всё содержимое сетки;</li>
21
<li><strong>grid-ячейка</strong> - единица грид-сетки, сюда можно положить один или несколько блоков кода;</li>
21
<li><strong>grid-ячейка</strong> - единица грид-сетки, сюда можно положить один или несколько блоков кода;</li>
22
<li><strong>grid-линия</strong> - горизонтальная или вертикальная линия, разделяющая столбцы и колонки;</li>
22
<li><strong>grid-линия</strong> - горизонтальная или вертикальная линия, разделяющая столбцы и колонки;</li>
23
<li><strong>grid-строка (row)</strong> - ряд ячеек;</li>
23
<li><strong>grid-строка (row)</strong> - ряд ячеек;</li>
24
<li><strong>grid-столбец (column)</strong> - колонка ячеек;</li>
24
<li><strong>grid-столбец (column)</strong> - колонка ячеек;</li>
25
<li><strong>grid-элемент</strong> - какой-либо элемент сайта;</li>
25
<li><strong>grid-элемент</strong> - какой-либо элемент сайта;</li>
26
<li><strong>grid-область (area)</strong> - пространство из ячеек, в CSS можно объединить несколько ячеек в одну и работать с ними как с единым целым.</li>
26
<li><strong>grid-область (area)</strong> - пространство из ячеек, в CSS можно объединить несколько ячеек в одну и работать с ними как с единым целым.</li>
27
</ul><p>А вот как они располагаются на схеме:</p>
27
</ul><p>А вот как они располагаются на схеме:</p>
28
<em>Изображение: Skillbox Media</em><p>В отличие от Flexbox - другого популярного вида CSS-разметки - Grid позволяет создавать двумерные таблицы. Это значит, что в них могут быть одновременно и ряды, и колонки. А во Flexbox всё строго: можно выстроить элементы или в столбик, или в линию - сочетать оба метода нельзя.</p>
28
<em>Изображение: Skillbox Media</em><p>В отличие от Flexbox - другого популярного вида CSS-разметки - Grid позволяет создавать двумерные таблицы. Это значит, что в них могут быть одновременно и ряды, и колонки. А во Flexbox всё строго: можно выстроить элементы или в столбик, или в линию - сочетать оба метода нельзя.</p>
29
<p>Чтобы опробовать Grid в деле, нам понадобится два файла: HTML и CSS. Начнём со "скелета" - создадим HTML-файл вот с таким содержимым (для удобства это можно сделать в <a>онлайн-редакторе</a>):</p>
29
<p>Чтобы опробовать Grid в деле, нам понадобится два файла: HTML и CSS. Начнём со "скелета" - создадим HTML-файл вот с таким содержимым (для удобства это можно сделать в <a>онлайн-редакторе</a>):</p>
30
<head> <title>CSS Grid Layout</title> <link rel="stylesheet" href="style.css"> </head> <body> <!-- Это будет грид-контейнер с пятью элементами внутри --> <div class="container"> <div class="A">A</div> <div class="B">B</div> <div class="C">C</div> <div class="D">D</div> <div class="E">E</div> </div> </body><p>Здесь мы задали несколько простых объектов - обычные латинские буквы A, B, C, D и E - и расположили их на отдельных строчках.</p>
30
<head> <title>CSS Grid Layout</title> <link rel="stylesheet" href="style.css"> </head> <body> <!-- Это будет грид-контейнер с пятью элементами внутри --> <div class="container"> <div class="A">A</div> <div class="B">B</div> <div class="C">C</div> <div class="D">D</div> <div class="E">E</div> </div> </body><p>Здесь мы задали несколько простых объектов - обычные латинские буквы A, B, C, D и E - и расположили их на отдельных строчках.</p>
31
<p>Теперь настало время объявить саму сетку. Для этого в той же папке создадим файл style.css и поместим туда вот такой код:</p>
31
<p>Теперь настало время объявить саму сетку. Для этого в той же папке создадим файл style.css и поместим туда вот такой код:</p>
32
/* Объявляем grid-контейнер */ .container { /* Задаём свойства элементов HTML-класса "контейнер" */ display: grid; /* Режим отображения меняем на "сетку" */ }<p>Пока что ничего не изменилось - чтобы нашу сетку было видно, добавим ей стили: контейнер обведём зелёным цветом, а все элементы внутри него - чёрной штрих-пунктирной линией.</p>
32
/* Объявляем grid-контейнер */ .container { /* Задаём свойства элементов HTML-класса "контейнер" */ display: grid; /* Режим отображения меняем на "сетку" */ }<p>Пока что ничего не изменилось - чтобы нашу сетку было видно, добавим ей стили: контейнер обведём зелёным цветом, а все элементы внутри него - чёрной штрих-пунктирной линией.</p>
33
/* Добавляем оформление grid-контейнеру: */ .container { border: 2px solid rgb(80, 145, 27); /* Обводим зелёной линией */ border-radius: 5px; /* Скругляем углы на 5 пикселей */ } /* Добавляем оформление элементам grid-контейнера: */ .container * { border: 1px dashed; /* Обводим чёрным пунктиром */ border-radius: 10px; /* Скругляем углы на 10 пикселей */ background-color: rgba(82, 29, 179, 0.5); /* Фон красим фиолетовым */ text-align: center; /* Контент размещаем в центре по горизонтали */ } /* Для разделения действий мы несколько раз объявили один и тот же элемент .container. На самом деле все эти блоки - единое целое, и относятся к одному классу - container. */<p>Должно получиться примерно так:</p>
33
/* Добавляем оформление grid-контейнеру: */ .container { border: 2px solid rgb(80, 145, 27); /* Обводим зелёной линией */ border-radius: 5px; /* Скругляем углы на 5 пикселей */ } /* Добавляем оформление элементам grid-контейнера: */ .container * { border: 1px dashed; /* Обводим чёрным пунктиром */ border-radius: 10px; /* Скругляем углы на 10 пикселей */ background-color: rgba(82, 29, 179, 0.5); /* Фон красим фиолетовым */ text-align: center; /* Контент размещаем в центре по горизонтали */ } /* Для разделения действий мы несколько раз объявили один и тот же элемент .container. На самом деле все эти блоки - единое целое, и относятся к одному классу - container. */<p>Должно получиться примерно так:</p>
34
<em>Изображение: Skillbox Media</em><p>Уже лучше! Но пока наши элементы расположены по дефолту и какой-то гибкой вёрсткой тут и не пахнет. Чтобы научиться настраивать сетку под себя, разберёмся со свойствами гридов.</p>
34
<em>Изображение: Skillbox Media</em><p>Уже лучше! Но пока наши элементы расположены по дефолту и какой-то гибкой вёрсткой тут и не пахнет. Чтобы научиться настраивать сетку под себя, разберёмся со свойствами гридов.</p>
35
<p>Свойства грид-контейнера задают параметры таблицы - количество строк и столбцов, их размеры, расположение в сетке и другие.</p>
35
<p>Свойства грид-контейнера задают параметры таблицы - количество строк и столбцов, их размеры, расположение в сетке и другие.</p>
36
<p>Чтобы создать колонки, нужно просто записать их размеры через пробел. Размеры можно указывать в разных единицах измерения: пикселях, процентах, сантиметрах и так далее. Причём можно смешивать несколько единиц в пределах одного свойства.</p>
36
<p>Чтобы создать колонки, нужно просто записать их размеры через пробел. Размеры можно указывать в разных единицах измерения: пикселях, процентах, сантиметрах и так далее. Причём можно смешивать несколько единиц в пределах одного свойства.</p>
37
<p>Допустим, нам нужно создать три колонки: первая занимает одну треть экрана, вторая - ровно 100px, а третья - всё оставшееся место. Самый очевидный вариант - записать через проценты:</p>
37
<p>Допустим, нам нужно создать три колонки: первая занимает одну треть экрана, вторая - ровно 100px, а третья - всё оставшееся место. Самый очевидный вариант - записать через проценты:</p>
38
.container { display: grid; grid-template-columns: 30% 100px 70%; }<p>Но тогда общая ширина всех колонок превысит 100%, и третья колонка уедет за пределы контейнера:</p>
38
.container { display: grid; grid-template-columns: 30% 100px 70%; }<p>Но тогда общая ширина всех колонок превысит 100%, и третья колонка уедет за пределы контейнера:</p>
39
<em>Изображение: Skillbox Media</em><p>Чтобы избегать таких ситуаций, гридам придумали новую единицу измерения - фракцию (fr). Она позволяет разделить свободное пространство экрана на несколько частей и не возиться с ручной подгонкой процентов.</p>
39
<em>Изображение: Skillbox Media</em><p>Чтобы избегать таких ситуаций, гридам придумали новую единицу измерения - фракцию (fr). Она позволяет разделить свободное пространство экрана на несколько частей и не возиться с ручной подгонкой процентов.</p>
40
<p>А нам того и надо - первому столбцу отдаём одну часть свободного пространства (1fr), третьему - две (2fr), а тот, что посередине, пускай забирает свои 100px:</p>
40
<p>А нам того и надо - первому столбцу отдаём одну часть свободного пространства (1fr), третьему - две (2fr), а тот, что посередине, пускай забирает свои 100px:</p>
41
.container { display: grid; grid-template-columns: 1fr 100px 2fr; }<p>И вот какая получается красота - всё аккуратно и в рамочке:</p>
41
.container { display: grid; grid-template-columns: 1fr 100px 2fr; }<p>И вот какая получается красота - всё аккуратно и в рамочке:</p>
42
<em>Изображение: Skillbox Media</em><p>Едем дальше. Захотели мы, допустим, задать нашей табличке размеры строк:</p>
42
<em>Изображение: Skillbox Media</em><p>Едем дальше. Захотели мы, допустим, задать нашей табличке размеры строк:</p>
43
.container { display: grid; grid-template-rows: 3fr 2fr 2fr 1fr; }<p>Но вдруг видим, что размеры двух строчек повторяются - они занимают ровно 2fr. Чтобы не писать дважды одно и то же, поместим их в функцию repeat. Она принимает на вход два параметра - размер строки во фракциях и количество его повторений:</p>
43
.container { display: grid; grid-template-rows: 3fr 2fr 2fr 1fr; }<p>Но вдруг видим, что размеры двух строчек повторяются - они занимают ровно 2fr. Чтобы не писать дважды одно и то же, поместим их в функцию repeat. Она принимает на вход два параметра - размер строки во фракциях и количество его повторений:</p>
44
grid-template-rows: 3fr repeat(2, 2fr) 1fr;<p>И полная, и краткая запись уместны - их можно чередовать в зависимости от контекста. Например, в нашем случае без функции можно было бы обойтись - но если надо создать, допустим, 10 колонок, она помогла бы сделать код более лаконичным и читаемым.</p>
44
grid-template-rows: 3fr repeat(2, 2fr) 1fr;<p>И полная, и краткая запись уместны - их можно чередовать в зависимости от контекста. Например, в нашем случае без функции можно было бы обойтись - но если надо создать, допустим, 10 колонок, она помогла бы сделать код более лаконичным и читаемым.</p>
45
<p>Вот как работает функция repeat наглядно:</p>
45
<p>Вот как работает функция repeat наглядно:</p>
46
<em>Изображение: Skillbox Media</em><p><strong>Обратите внимание:</strong>высоту последней строчки E мы нигде не указывали, поэтому она остаётся дефолтной.</p>
46
<em>Изображение: Skillbox Media</em><p><strong>Обратите внимание:</strong>высоту последней строчки E мы нигде не указывали, поэтому она остаётся дефолтной.</p>
47
<p>Одна из особенностей грид-разметки - возможность создавать области и гибко регулировать их размеры.</p>
47
<p>Одна из особенностей грид-разметки - возможность создавать области и гибко регулировать их размеры.</p>
48
<p>Чтобы создать область, объявим для каждого элемента в CSS-файле свойство grid-area - его параметром будет любое имя, какое захотите. Можно просто добавить в любое место CSS-файла этот код:</p>
48
<p>Чтобы создать область, объявим для каждого элемента в CSS-файле свойство grid-area - его параметром будет любое имя, какое захотите. Можно просто добавить в любое место CSS-файла этот код:</p>
49
.A { grid-area: f; } .B { grid-area: i; } .C { grid-area: b; } .D { grid-area: o; } .E { grid-area: n; }<p>Затем в грид-контейнере создаём "матрицу" из этих имён:</p>
49
.A { grid-area: f; } .B { grid-area: i; } .C { grid-area: b; } .D { grid-area: o; } .E { grid-area: n; }<p>Затем в грид-контейнере создаём "матрицу" из этих имён:</p>
50
.container { display: grid; grid-template-areas: "f f f f f i i i" "f f f f f i i i" "f f f f f i i i" "f f f f f o b b" "f f f f f n b b"; }<p>Вуаля! Наши элементы выстроились по шаблону:</p>
50
.container { display: grid; grid-template-areas: "f f f f f i i i" "f f f f f i i i" "f f f f f i i i" "f f f f f o b b" "f f f f f n b b"; }<p>Вуаля! Наши элементы выстроились по шаблону:</p>
51
<em>Изображение: Skillbox Media</em><p><strong>Как это работает.</strong>Каждое имя в grid-template-areas соответствует определённому объекту. Одинаковые имена, стоящие рядом, собирают несколько ячеек в единое целое - то есть в грид-область:</p>
51
<em>Изображение: Skillbox Media</em><p><strong>Как это работает.</strong>Каждое имя в grid-template-areas соответствует определённому объекту. Одинаковые имена, стоящие рядом, собирают несколько ячеек в единое целое - то есть в грид-область:</p>
52
<ul><li>Элемент<strong>A</strong>с "псевдонимом"<strong>f</strong>занимает область в 25 ячеек.</li>
52
<ul><li>Элемент<strong>A</strong>с "псевдонимом"<strong>f</strong>занимает область в 25 ячеек.</li>
53
<li>Элемент<strong>B </strong>(<strong>i</strong>) - в 9 ячеек.</li>
53
<li>Элемент<strong>B </strong>(<strong>i</strong>) - в 9 ячеек.</li>
54
<li>Элемент<strong>C </strong>(<strong>b</strong>) - в 4 ячейки.</li>
54
<li>Элемент<strong>C </strong>(<strong>b</strong>) - в 4 ячейки.</li>
55
<li>Элемент<strong>D </strong>(<strong>o</strong>) - в 1 ячейку.</li>
55
<li>Элемент<strong>D </strong>(<strong>o</strong>) - в 1 ячейку.</li>
56
<li>Элемент<strong>E (n)</strong> - тоже в 1 ячейку.</li>
56
<li>Элемент<strong>E (n)</strong> - тоже в 1 ячейку.</li>
57
</ul><p>Свойство grid-template позволяет в краткой форме определить или столбцы со строками, или целые области.</p>
57
</ul><p>Свойство grid-template позволяет в краткой форме определить или столбцы со строками, или целые области.</p>
58
<p><strong>1.</strong>Короткая форма для грид-строк и грид-колонок:</p>
58
<p><strong>1.</strong>Короткая форма для грид-строк и грид-колонок:</p>
59
/* Сетка из строк и столбцов */ grid-template: grid-template-rows / grid-template-columns;<p>Фишка в том, что мы всего одной строчкой создаём целую таблицу - просто записываем через слеш количество рядов и столбцов. Для примера создадим сетку из трёх строк по 1fr и двух столбцов по 2fr.</p>
59
/* Сетка из строк и столбцов */ grid-template: grid-template-rows / grid-template-columns;<p>Фишка в том, что мы всего одной строчкой создаём целую таблицу - просто записываем через слеш количество рядов и столбцов. Для примера создадим сетку из трёх строк по 1fr и двух столбцов по 2fr.</p>
60
.container{ display: grid; grid-template: 1fr 1fr 1fr / 2fr 2fr; }<em>Изображение: Skillbox Media</em><p>Кстати, свойство grid-template тоже принимает функцию repeat.</p>
60
.container{ display: grid; grid-template: 1fr 1fr 1fr / 2fr 2fr; }<em>Изображение: Skillbox Media</em><p>Кстати, свойство grid-template тоже принимает функцию repeat.</p>
61
.container{ display: grid; grid-template: repeat(3, 1fr) / repeat(2, 2fr); }<p>И, как видите, результат остаётся неизменным:</p>
61
.container{ display: grid; grid-template: repeat(3, 1fr) / repeat(2, 2fr); }<p>И, как видите, результат остаётся неизменным:</p>
62
<em>Изображение: Skillbox Media</em><p><strong>2.</strong>Короткая форма для грид-областей.</p>
62
<em>Изображение: Skillbox Media</em><p><strong>2.</strong>Короткая форма для грид-областей.</p>
63
<p>Также сокращённая запись поддерживает объявление грид-областей, нужно только объявить свойство grid-area для каждого объекта:</p>
63
<p>Также сокращённая запись поддерживает объявление грид-областей, нужно только объявить свойство grid-area для каждого объекта:</p>
64
.container { display: grid; grid-template: "f f f i i" "f f f i i" "f f f b o" ". . n n n"; } .A { grid-area: f; } .B { grid-area: i; } .C { grid-area: b; } .D { grid-area: o; } .E { grid-area: n; }<p>Профит:</p>
64
.container { display: grid; grid-template: "f f f i i" "f f f i i" "f f f b o" ". . n n n"; } .A { grid-area: f; } .B { grid-area: i; } .C { grid-area: b; } .D { grid-area: o; } .E { grid-area: n; }<p>Профит:</p>
65
<em>Изображение: Skillbox Media</em><p>С помощью этих свойств можно прямо указать браузеру, где должны находиться элементы. Для этого нужно указать две точки: с какой линии элемент начинается и какой заканчивается - это работает как по горизонтали, так и по вертикали.</p>
65
<em>Изображение: Skillbox Media</em><p>С помощью этих свойств можно прямо указать браузеру, где должны находиться элементы. Для этого нужно указать две точки: с какой линии элемент начинается и какой заканчивается - это работает как по горизонтали, так и по вертикали.</p>
66
<em>Изображение: Skillbox Media</em><p>Вот так можно двигать элемент по горизонтали:</p>
66
<em>Изображение: Skillbox Media</em><p>Вот так можно двигать элемент по горизонтали:</p>
67
<p>Задаёт начальную позицию (линию) столбцов</p>
67
<p>Задаёт начальную позицию (линию) столбцов</p>
68
<p>Задаёт конечную позицию (линию) столбцов</p>
68
<p>Задаёт конечную позицию (линию) столбцов</p>
69
grid-column: grid-column-start / grid-column-end;<p>Объединённое свойство грид-линий столбцов: начало и конец</p>
69
grid-column: grid-column-start / grid-column-end;<p>Объединённое свойство грид-линий столбцов: начало и конец</p>
70
<p>А вот так - по вертикали:</p>
70
<p>А вот так - по вертикали:</p>
71
<p>Задаёт начальную позицию (линию) строк</p>
71
<p>Задаёт начальную позицию (линию) строк</p>
72
-
<p>Задаёт конечную позицию (л��нию) строк</p>
72
+
<p>Задаёт конечную позицию (линию) строк</p>
73
grid-row: grid-row-start / grid-row-end;<p>Объединённое свойство грид-линий строк: начало и конец</p>
73
grid-row: grid-row-start / grid-row-end;<p>Объединённое свойство грид-линий строк: начало и конец</p>
74
<p>Но есть и одно общее свойство, объединяющее все четыре основных:</p>
74
<p>Но есть и одно общее свойство, объединяющее все четыре основных:</p>
75
grid-area: grid-row-start / grid-column-start / grid-row-end / grid-column-end;<p>Теперь давайте попробуем задать эти свойства первым трём элементам из нашей конструкции с буквами:</p>
75
grid-area: grid-row-start / grid-column-start / grid-row-end / grid-column-end;<p>Теперь давайте попробуем задать эти свойства первым трём элементам из нашей конструкции с буквами:</p>
76
/* Объявляем грид 5 × 3 */ .container { display: grid; grid-template: repeat(3, 1fr) / repeat(5, 1fr) ; } /* Расставляем первые три элемента: A, B и C */ .A { grid-area: 1 / 1 / 4 / 4; } .B { grid-column-start: 4; grid-column-end: 6; grid-row-start: 1; grid-row-end: 3; } .C { grid-column: 4 / 5; grid-row: 3 / 4; }<p>Этот код указывает нашим буквам, какие позиции занять в сетке:</p>
76
/* Объявляем грид 5 × 3 */ .container { display: grid; grid-template: repeat(3, 1fr) / repeat(5, 1fr) ; } /* Расставляем первые три элемента: A, B и C */ .A { grid-area: 1 / 1 / 4 / 4; } .B { grid-column-start: 4; grid-column-end: 6; grid-row-start: 1; grid-row-end: 3; } .C { grid-column: 4 / 5; grid-row: 3 / 4; }<p>Этот код указывает нашим буквам, какие позиции занять в сетке:</p>
77
<ul><li>Элемент А занял область от первой до четвёртой линии - и по горизонтали, и по вертикали.</li>
77
<ul><li>Элемент А занял область от первой до четвёртой линии - и по горизонтали, и по вертикали.</li>
78
<li>Элемент B занял область от четвёртой до шестой линии по горизонтали и от первой до третьей по вертикали.</li>
78
<li>Элемент B занял область от четвёртой до шестой линии по горизонтали и от первой до третьей по вертикали.</li>
79
<li>Элемент С занял область от четвёртой до пятой линии по горизонтали и от третьей до четвёртой линии по вертикали.</li>
79
<li>Элемент С занял область от четвёртой до пятой линии по горизонтали и от третьей до четвёртой линии по вертикали.</li>
80
<li>Ну а остальные расположились по дефолту :)</li>
80
<li>Ну а остальные расположились по дефолту :)</li>
81
</ul><p>Выглядит так:</p>
81
</ul><p>Выглядит так:</p>
82
<em>Изображение: Skillbox Media</em><p>Используя grid-gap, можно регулировать интервалы между элементами в контейнере. Делается это с помощью двух параметров:</p>
82
<em>Изображение: Skillbox Media</em><p>Используя grid-gap, можно регулировать интервалы между элементами в контейнере. Делается это с помощью двух параметров:</p>
83
<ul><li><strong>column-gap</strong> - расстояние между колонками;</li>
83
<ul><li><strong>column-gap</strong> - расстояние между колонками;</li>
84
<li><strong>row-gap</strong>- расстояние между строками.</li>
84
<li><strong>row-gap</strong>- расстояние между строками.</li>
85
</ul><p>Вот как это выглядит в коде:</p>
85
</ul><p>Вот как это выглядит в коде:</p>
86
.container { column-gap: 1%; row-gap: 1%; }<p>Как и у grid-template, у gap есть сокращённая запись, где параметры column-gap и row-gap можно записать через пробел:</p>
86
.container { column-gap: 1%; row-gap: 1%; }<p>Как и у grid-template, у gap есть сокращённая запись, где параметры column-gap и row-gap можно записать через пробел:</p>
87
gap: 1% 1%;<em>Изображение: Skillbox Media</em><p>Со свойствами элементов разобрались, теперь поговорим о том, как их выровнять в рамках контейнера или области.</p>
87
gap: 1% 1%;<em>Изображение: Skillbox Media</em><p>Со свойствами элементов разобрались, теперь поговорим о том, как их выровнять в рамках контейнера или области.</p>
88
<p><strong>Что делает:</strong>выравнивает элементы в пределах области по горизонтали.</p>
88
<p><strong>Что делает:</strong>выравнивает элементы в пределах области по горизонтали.</p>
89
<p>Растягивает элементы на всю ширину грид-ячейки</p>
89
<p>Растягивает элементы на всю ширину грид-ячейки</p>
90
<p>Располагает элементы в левой части грид-ячейки или области</p>
90
<p>Располагает элементы в левой части грид-ячейки или области</p>
91
<p>Располагает элементы в центре грид-ячейки или области</p>
91
<p>Располагает элементы в центре грид-ячейки или области</p>
92
<p>Располагает элементы в правой части грид-ячейки или области</p>
92
<p>Располагает элементы в правой части грид-ячейки или области</p>
93
<p><strong>Что делает:</strong>выравнивает элементы в пределах области по вертикали.</p>
93
<p><strong>Что делает:</strong>выравнивает элементы в пределах области по вертикали.</p>
94
<p>Растягивает элементы на всю длину грид-ячейки</p>
94
<p>Растягивает элементы на всю длину грид-ячейки</p>
95
<p>Располагает элементы в верхней части грид-ячейки</p>
95
<p>Располагает элементы в верхней части грид-ячейки</p>
96
<p>Располагает элементы в центре грид-ячейки</p>
96
<p>Располагает элементы в центре грид-ячейки</p>
97
<p>Располагает элементы в нижней части грид-ячейки</p>
97
<p>Располагает элементы в нижней части грид-ячейки</p>
98
<p><strong>Что делает:</strong>выравнивает элементы в пределах всего контейнера по горизонтали.</p>
98
<p><strong>Что делает:</strong>выравнивает элементы в пределах всего контейнера по горизонтали.</p>
99
<p>Располагает элементы в левой части грид-контейнера</p>
99
<p>Располагает элементы в левой части грид-контейнера</p>
100
<p>Располагает элементы по центру грид-контейнера</p>
100
<p>Располагает элементы по центру грид-контейнера</p>
101
<p>Располагает все элементы в правой части грид-контейнера</p>
101
<p>Располагает все элементы в правой части грид-контейнера</p>
102
justify-content: space-between;<p>Распределяет элементы по левому и правому краю. Первый элемент располагается ближе к началу, а последний - ближе к концу</p>
102
justify-content: space-between;<p>Распределяет элементы по левому и правому краю. Первый элемент располагается ближе к началу, а последний - ближе к концу</p>
103
justify-content: space-around;<p>Распределение с равным пространством между элементами и половиной этого пространства от краёв</p>
103
justify-content: space-around;<p>Распределение с равным пространством между элементами и половиной этого пространства от краёв</p>
104
justify-content: space-evenly;<p>Распределение с равным пространством и между элементами, и от краёв</p>
104
justify-content: space-evenly;<p>Распределение с равным пространством и между элементами, и от краёв</p>
105
<p><strong>Что делает:</strong>выравнивает элементы в пределах всего контейнера по вертикали<em>.</em></p>
105
<p><strong>Что делает:</strong>выравнивает элементы в пределах всего контейнера по вертикали<em>.</em></p>
106
<p>Для начала увеличим высоту контейнера с помощью параметра height:</p>
106
<p>Для начала увеличим высоту контейнера с помощью параметра height:</p>
107
.container { display: grid; /* code... */ height: 200px; }<em>Изображение: Skillbox Media</em><p>Пока элементы просто растянулись по длине контейнера, а теперь попробуем применить к нему следующие свойства:</p>
107
.container { display: grid; /* code... */ height: 200px; }<em>Изображение: Skillbox Media</em><p>Пока элементы просто растянулись по длине контейнера, а теперь попробуем применить к нему следующие свойства:</p>
108
<p>Все элементы расположились в верхней части контейнера</p>
108
<p>Все элементы расположились в верхней части контейнера</p>
109
<p>Все элементы расположились в середине грид-контейнера</p>
109
<p>Все элементы расположились в середине грид-контейнера</p>
110
align-content: space-between;<p>Элементы расположились по верхнему и нижнему краю. Первый элемент ближе к началу, последний - ближе к концу</p>
110
align-content: space-between;<p>Элементы расположились по верхнему и нижнему краю. Первый элемент ближе к началу, последний - ближе к концу</p>
111
align-content: space-around;<p>Распределение с равным пространством между элементами и половиной этого пространства от краёв</p>
111
align-content: space-around;<p>Распределение с равным пространством между элементами и половиной этого пространства от краёв</p>
112
<p>Следующие свойства работают с отдельными грид-элементами, поэтому параметры мы будем прописывать не всему контейнеру, а элементу - скажем, с буквой A.</p>
112
<p>Следующие свойства работают с отдельными грид-элементами, поэтому параметры мы будем прописывать не всему контейнеру, а элементу - скажем, с буквой A.</p>
113
<p><strong>Что делает:</strong>выравнивает грид-элементы по горизонтали.</p>
113
<p><strong>Что делает:</strong>выравнивает грид-элементы по горизонтали.</p>
114
<p>Элемент A растянулся по всей длине грид-области</p>
114
<p>Элемент A растянулся по всей длине грид-области</p>
115
<p>Элемент A расположился в центре грид-области</p>
115
<p>Элемент A расположился в центре грид-области</p>
116
<p>Элемент A расположился в начале грид-области</p>
116
<p>Элемент A расположился в начале грид-области</p>
117
<p>Элемент A расположился в конце грид-области</p>
117
<p>Элемент A расположился в конце грид-области</p>
118
<p><strong>Что делает:</strong>выравнивает грид-элементы по вертикали.</p>
118
<p><strong>Что делает:</strong>выравнивает грид-элементы по вертикали.</p>
119
<p>Элемент A растянулся по всей ширине грид-области</p>
119
<p>Элемент A растянулся по всей ширине грид-области</p>
120
<p>Элемент A расположился в середине грид-области</p>
120
<p>Элемент A расположился в середине грид-области</p>
121
<p>Элемент A расположился в начале грид-области</p>
121
<p>Элемент A расположился в начале грид-области</p>
122
<p>Элемент A расположился в конце грид-области</p>
122
<p>Элемент A расположился в конце грид-области</p>
123
<p>В CSS грид бывает<strong>вложенным</strong> - это значит, что он содержит в себе другой грид-контейнер. Чтобы понять, как это работает, давайте немного пересоберём наш HTML-каркас, добавив в него ещё один подуровень элементов:</p>
123
<p>В CSS грид бывает<strong>вложенным</strong> - это значит, что он содержит в себе другой грид-контейнер. Чтобы понять, как это работает, давайте немного пересоберём наш HTML-каркас, добавив в него ещё один подуровень элементов:</p>
124
<head> <title>CSS Grid Layout</title> <link rel="stylesheet" href="style.css"> </head> <body> <div class="container"> <div class="A">A</div> <div class="B">B</div> <div class="С">C</div> <!-- Тут начинается подуровень, содержащий 3 элемента --> <div class="D"> <div class="E">E</div> <div class="F">F</div> <div class="G">G</div> </div> <div class="H">H</div> <div class="J">J</div> </div> </body><p>Для основного контейнера в CSS-файле создадим сетку 3 на 3:</p>
124
<head> <title>CSS Grid Layout</title> <link rel="stylesheet" href="style.css"> </head> <body> <div class="container"> <div class="A">A</div> <div class="B">B</div> <div class="С">C</div> <!-- Тут начинается подуровень, содержащий 3 элемента --> <div class="D"> <div class="E">E</div> <div class="F">F</div> <div class="G">G</div> </div> <div class="H">H</div> <div class="J">J</div> </div> </body><p>Для основного контейнера в CSS-файле создадим сетку 3 на 3:</p>
125
/* Объявляем грид 3 × 3 */ .container { display: grid; grid-template-columns: repeat(3, 3fr); grid-template-rows: repeat(3, 3fr); }<p>И вот какая матрёшка у нас получилась:</p>
125
/* Объявляем грид 3 × 3 */ .container { display: grid; grid-template-columns: repeat(3, 3fr); grid-template-rows: repeat(3, 3fr); }<p>И вот какая матрёшка у нас получилась:</p>
126
<em>Изображение: Skillbox Media</em><p>А теперь для элемента D определим display: grid - то есть объявим внутри него ещё одну сетку. Для свойств строк и столбцов напишем параметр subgrid, который заимствует параметры родительского грида:</p>
126
<em>Изображение: Skillbox Media</em><p>А теперь для элемента D определим display: grid - то есть объявим внутри него ещё одну сетку. Для свойств строк и столбцов напишем параметр subgrid, который заимствует параметры родительского грида:</p>
127
.D { display: grid; grid-template-columns: subgrid; grid-template-rows: subgrid; }<em>Изображение: Skillbox Media</em><p>Готово! Теперь можно мастерски жонглировать элементами E, F, G, задавая им разное расположение в пределах элемента D (который тоже стал сеткой). Например, сделаем так, чтобы E начинался от второй вертикальной линии грида до третьей:</p>
127
.D { display: grid; grid-template-columns: subgrid; grid-template-rows: subgrid; }<em>Изображение: Skillbox Media</em><p>Готово! Теперь можно мастерски жонглировать элементами E, F, G, задавая им разное расположение в пределах элемента D (который тоже стал сеткой). Например, сделаем так, чтобы E начинался от второй вертикальной линии грида до третьей:</p>
128
.E { grid-column: 2 / 3; }<p>Внутренние элементы, в свою очередь, расположились уже во вложенном гриде:</p>
128
.E { grid-column: 2 / 3; }<p>Внутренние элементы, в свою очередь, расположились уже во вложенном гриде:</p>
129
<em>Изображение: Skillbox Media</em><p>Сегодня мы узнали, что такое<em></em>грид в CSS: как он работает, из чего состоит и как настраивается. Повторим ключевые моменты:</p>
129
<em>Изображение: Skillbox Media</em><p>Сегодня мы узнали, что такое<em></em>грид в CSS: как он работает, из чего состоит и как настраивается. Повторим ключевые моменты:</p>
130
<ul><li><strong>Grid Layout в CSS</strong> - это гибкая разметка, при которой элементы располагаются в виде таблицы. Таблица состоит из ячеек, которые можно собирать в целые области.</li>
130
<ul><li><strong>Grid Layout в CSS</strong> - это гибкая разметка, при которой элементы располагаются в виде таблицы. Таблица состоит из ячеек, которые можно собирать в целые области.</li>
131
<li>Чтобы создать грид, нужно в файле с CSS-разметкой добавить строчку display: grid.</li>
131
<li>Чтобы создать грид, нужно в файле с CSS-разметкой добавить строчку display: grid.</li>
132
<li>Грид состоит из родительского контейнера и вложенных в него элементов. Элементы могут занимать несколько ячеек, которые складываются в столбцы, колонки или области.</li>
132
<li>Грид состоит из родительского контейнера и вложенных в него элементов. Элементы могут занимать несколько ячеек, которые складываются в столбцы, колонки или области.</li>
133
<li>Фракция - единица измерения в CSS, созданная для удобства - чтобы можно было задавать соотношения между элементами и не подгонять вручную проценты.</li>
133
<li>Фракция - единица измерения в CSS, созданная для удобства - чтобы можно было задавать соотношения между элементами и не подгонять вручную проценты.</li>
134
<li>Грид может содержать в себе другой грид - такая конструкция называется<strong>вложенным subgrid</strong>.</li>
134
<li>Грид может содержать в себе другой грид - такая конструкция называется<strong>вложенным subgrid</strong>.</li>
135
<li>Основными свойствами грид-контейнера являются:<em>grid-template</em>,<em>grid-template-columns</em>,<em>grid-template-rows</em>,<em>grid-template-areas.</em>Они позволяют задавать размеры колонок, строк или целых областей.</li>
135
<li>Основными свойствами грид-контейнера являются:<em>grid-template</em>,<em>grid-template-columns</em>,<em>grid-template-rows</em>,<em>grid-template-areas.</em>Они позволяют задавать размеры колонок, строк или целых областей.</li>
136
<li>За отступы между колонками грида отвечает свойство<em>column-gap,</em>а между рядами -<em>row-gap</em>.</li>
136
<li>За отступы между колонками грида отвечает свойство<em>column-gap,</em>а между рядами -<em>row-gap</em>.</li>
137
<li>Горизонтально выровнять элементы контейнера можно с помощью<em>justify-items</em>и <em>justify-content</em>, а вертикально - с <em>align-items</em>и <em>align-content.</em></li>
137
<li>Горизонтально выровнять элементы контейнера можно с помощью<em>justify-items</em>и <em>justify-content</em>, а вертикально - с <em>align-items</em>и <em>align-content.</em></li>
138
<li>Настроить расположение элементов от определённой линии грид-сетки можно с помощью свойств:</li>
138
<li>Настроить расположение элементов от определённой линии грид-сетки можно с помощью свойств:</li>
139
</ul><ul><li>по горизонтальной оси<em>:</em><em>grid-column-start</em>,<em>grid-column-end</em>,<em>grid-column</em>;</li>
139
</ul><ul><li>по горизонтальной оси<em>:</em><em>grid-column-start</em>,<em>grid-column-end</em>,<em>grid-column</em>;</li>
140
<li>по вертикальной оси:<em>grid-row-start</em>,<em>grid-row-end</em>,<em>grid-row</em>;</li>
140
<li>по вертикальной оси:<em>grid-row-start</em>,<em>grid-row-end</em>,<em>grid-row</em>;</li>
141
<li>или общим свойством<em>grid-area.</em></li>
141
<li>или общим свойством<em>grid-area.</em></li>
142
</ul><ul><li>Выровнять конкретный элемент грида можно с помощью<em>justify-self</em>(по горизонтали) и <em>align-self</em>(по вертикали).</li>
142
</ul><ul><li>Выровнять конкретный элемент грида можно с помощью<em>justify-self</em>(по горизонтали) и <em>align-self</em>(по вертикали).</li>
143
</ul><a>Курс с трудоустройством: "Профессия Фронтенд-разработчик + ИИ" Узнать о курсе</a>
143
</ul><a>Курс с трудоустройством: "Профессия Фронтенд-разработчик + ИИ" Узнать о курсе</a>