HTML Diff
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 &lt;head&gt; &lt;title&gt;CSS Grid Layout&lt;/title&gt; &lt;link rel="stylesheet" href="style.css"&gt; &lt;/head&gt; &lt;body&gt; &lt;!-- Это будет грид-контейнер с пятью элементами внутри --&gt; &lt;div class="container"&gt; &lt;div class="A"&gt;A&lt;/div&gt; &lt;div class="B"&gt;B&lt;/div&gt; &lt;div class="C"&gt;C&lt;/div&gt; &lt;div class="D"&gt;D&lt;/div&gt; &lt;div class="E"&gt;E&lt;/div&gt; &lt;/div&gt; &lt;/body&gt;<p>Здесь мы задали несколько простых объектов - обычные латинские буквы A, B, C, D и E - и расположили их на отдельных строчках.</p>
30 &lt;head&gt; &lt;title&gt;CSS Grid Layout&lt;/title&gt; &lt;link rel="stylesheet" href="style.css"&gt; &lt;/head&gt; &lt;body&gt; &lt;!-- Это будет грид-контейнер с пятью элементами внутри --&gt; &lt;div class="container"&gt; &lt;div class="A"&gt;A&lt;/div&gt; &lt;div class="B"&gt;B&lt;/div&gt; &lt;div class="C"&gt;C&lt;/div&gt; &lt;div class="D"&gt;D&lt;/div&gt; &lt;div class="E"&gt;E&lt;/div&gt; &lt;/div&gt; &lt;/body&gt;<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 &lt;head&gt; &lt;title&gt;CSS Grid Layout&lt;/title&gt; &lt;link rel="stylesheet" href="style.css"&gt; &lt;/head&gt; &lt;body&gt; &lt;div class="container"&gt; &lt;div class="A"&gt;A&lt;/div&gt; &lt;div class="B"&gt;B&lt;/div&gt; &lt;div class="С"&gt;C&lt;/div&gt; &lt;!-- Тут начинается подуровень, содержащий 3 элемента --&gt; &lt;div class="D"&gt; &lt;div class="E"&gt;E&lt;/div&gt; &lt;div class="F"&gt;F&lt;/div&gt; &lt;div class="G"&gt;G&lt;/div&gt; &lt;/div&gt; &lt;div class="H"&gt;H&lt;/div&gt; &lt;div class="J"&gt;J&lt;/div&gt; &lt;/div&gt; &lt;/body&gt;<p>Для основного контейнера в CSS-файле создадим сетку 3 на 3:</p>
124 &lt;head&gt; &lt;title&gt;CSS Grid Layout&lt;/title&gt; &lt;link rel="stylesheet" href="style.css"&gt; &lt;/head&gt; &lt;body&gt; &lt;div class="container"&gt; &lt;div class="A"&gt;A&lt;/div&gt; &lt;div class="B"&gt;B&lt;/div&gt; &lt;div class="С"&gt;C&lt;/div&gt; &lt;!-- Тут начинается подуровень, содержащий 3 элемента --&gt; &lt;div class="D"&gt; &lt;div class="E"&gt;E&lt;/div&gt; &lt;div class="F"&gt;F&lt;/div&gt; &lt;div class="G"&gt;G&lt;/div&gt; &lt;/div&gt; &lt;div class="H"&gt;H&lt;/div&gt; &lt;div class="J"&gt;J&lt;/div&gt; &lt;/div&gt; &lt;/body&gt;<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>