0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Разобравшись с основной терминологией, пришло время создать свою первую сетку. В этом уроке мы создадим простую сетку, которая будет состоять из 12 колонок и 12 строк.</p>
1
<p>Разобравшись с основной терминологией, пришло время создать свою первую сетку. В этом уроке мы создадим простую сетку, которая будет состоять из 12 колонок и 12 строк.</p>
2
<p>Как и в случае с модулем<em>Flex</em>, для создания сетки нам необходимо иметь некий контейнер. Создадим такой контейнер с классом<em>grid-12</em>.</p>
2
<p>Как и в случае с модулем<em>Flex</em>, для создания сетки нам необходимо иметь некий контейнер. Создадим такой контейнер с классом<em>grid-12</em>.</p>
3
<p>Для того, чтобы превратить секцию в<em>grid-контейнер</em>, необходимо воспользоваться свойством display со значением grid. Это не даст немедленных видимых результатов. Поэтому добавим внутрь нашего контейнера 3 дочерних элемента. Зададим им различное оформление и на примере этих блоков узнаем, как создать простую сетку.</p>
3
<p>Для того, чтобы превратить секцию в<em>grid-контейнер</em>, необходимо воспользоваться свойством display со значением grid. Это не даст немедленных видимых результатов. Поэтому добавим внутрь нашего контейнера 3 дочерних элемента. Зададим им различное оформление и на примере этих блоков узнаем, как создать простую сетку.</p>
4
<p><a>https://codepen.io/hexlet/pen/xxZqBVr</a></p>
4
<p><a>https://codepen.io/hexlet/pen/xxZqBVr</a></p>
5
<p>Не указав количество колонок и строк, мы получили сетку с тремя строками и одной колонкой. Обычно это не тот результат, который мы ждём от сеток. Если вам нужна именно такая структура, то, возможно, сетки вам не нужны и проще не давать браузеру обрабатывать то, что он мог и не обрабатывать.</p>
5
<p>Не указав количество колонок и строк, мы получили сетку с тремя строками и одной колонкой. Обычно это не тот результат, который мы ждём от сеток. Если вам нужна именно такая структура, то, возможно, сетки вам не нужны и проще не давать браузеру обрабатывать то, что он мог и не обрабатывать.</p>
6
<p>Другим возможным значением свойства display является inline-grid. Внутри такого контейнера всё будет происходить точно так же, как и при значении grid, но сам контейнер по поведению будет напоминать строчный элемент - он займёт ровно столько пространства, сколько необходимо. Другие элементы в потоке смогут обтекать его при необходимости и наличии свободного пространства.</p>
6
<p>Другим возможным значением свойства display является inline-grid. Внутри такого контейнера всё будет происходить точно так же, как и при значении grid, но сам контейнер по поведению будет напоминать строчный элемент - он займёт ровно столько пространства, сколько необходимо. Другие элементы в потоке смогут обтекать его при необходимости и наличии свободного пространства.</p>
7
<p><a>https://codepen.io/hexlet/pen/wvMdJJG</a></p>
7
<p><a>https://codepen.io/hexlet/pen/wvMdJJG</a></p>
8
<h2>Создание сетки</h2>
8
<h2>Создание сетки</h2>
9
<p>Самое время создать нашу первую сетку. В начале урока было указано, что создадим сетку из 12 колонок и 12 строк. Для этого используются свойства grid-template-columns и grid-template-rows. Первое свойство отвечает за размер колонок, а второе - за размер строк. Внутри себя они могут принимать множество различных значений. Вот лишь некоторые из них:</p>
9
<p>Самое время создать нашу первую сетку. В начале урока было указано, что создадим сетку из 12 колонок и 12 строк. Для этого используются свойства grid-template-columns и grid-template-rows. Первое свойство отвечает за размер колонок, а второе - за размер строк. Внутри себя они могут принимать множество различных значений. Вот лишь некоторые из них:</p>
10
<ul><li>Любые известные вам<em>CSS-единицы</em>. Это могут быть:<em>px</em>,<em>em</em>,<em>rem</em>и так далее.</li>
10
<ul><li>Любые известные вам<em>CSS-единицы</em>. Это могут быть:<em>px</em>,<em>em</em>,<em>rem</em>и так далее.</li>
11
<li>min-content. При этом значении ширина колонки будет равняться минимально возможной. Это зависит от контента внутри колонок.</li>
11
<li>min-content. При этом значении ширина колонки будет равняться минимально возможной. Это зависит от контента внутри колонок.</li>
12
<li>max-content. Противоположность предыдущему значению. Ширина колонки будет равняться максимально возможной, с учётом того, какой контент находится в колонках.</li>
12
<li>max-content. Противоположность предыдущему значению. Ширина колонки будет равняться максимально возможной, с учётом того, какой контент находится в колонках.</li>
13
<li>minmax(min, max). Здесь в качестве значения используется целая функция. Она принимает два значения: минимальный и максимальный размер. То есть мы устанавливаем границы, в пределах которых браузер сам выбирает ширину.</li>
13
<li>minmax(min, max). Здесь в качестве значения используется целая функция. Она принимает два значения: минимальный и максимальный размер. То есть мы устанавливаем границы, в пределах которых браузер сам выбирает ширину.</li>
14
<li>auto. Браузер автоматически подстраивает все колонки так, чтобы самый большой элемент в нашей сетке поместился впритык.</li>
14
<li>auto. Браузер автоматически подстраивает все колонки так, чтобы самый большой элемент в нашей сетке поместился впритык.</li>
15
</ul><p>Существует ещё несколько важных значений, которые мы разберём чуть ниже.</p>
15
</ul><p>Существует ещё несколько важных значений, которые мы разберём чуть ниже.</p>
16
<p>Узнав возможные значения для полосы, возникает вопрос: "А где же указывается конкретное число колонок или строк в сетке?". Дело в том, что оба свойства grid-template-columns и grid-template-rows могут принимать несколько значений, которые разделены пробелом. Каждое такое значение - это размер одной полосы. То есть, для создания сетки с 12 колонками и 12 рядами мы можем по 12 раз указать значения в каждом из свойств.</p>
16
<p>Узнав возможные значения для полосы, возникает вопрос: "А где же указывается конкретное число колонок или строк в сетке?". Дело в том, что оба свойства grid-template-columns и grid-template-rows могут принимать несколько значений, которые разделены пробелом. Каждое такое значение - это размер одной полосы. То есть, для создания сетки с 12 колонками и 12 рядами мы можем по 12 раз указать значения в каждом из свойств.</p>
17
<p>Создадим ровную сетку с квадратными ячейками. Сделаем их по 20 пикселей. Возьмём прошлый пример и добавим новые свойства</p>
17
<p>Создадим ровную сетку с квадратными ячейками. Сделаем их по 20 пикселей. Возьмём прошлый пример и добавим новые свойства</p>
18
<p>Теперь мы убрали значения высоты для контейнера. Это связано с тем, что значения ширины и высоты высчитываются от размера полос. Нет необходимости дополнительно выставлять эти значения, если вам не нужен особый размер контейнера.</p>
18
<p>Теперь мы убрали значения высоты для контейнера. Это связано с тем, что значения ширины и высоты высчитываются от размера полос. Нет необходимости дополнительно выставлять эти значения, если вам не нужен особый размер контейнера.</p>
19
<p><a>https://codepen.io/hexlet/pen/WNrjpqX</a></p>
19
<p><a>https://codepen.io/hexlet/pen/WNrjpqX</a></p>
20
<p>Обратите внимание на то, что случилось с элементами внутри сетки. До выставления свойств grid-template-columns и grid-template-rows они занимали всю доступную ширину экрана. Теперь каждый из них занимает ровно одну ячейку. То есть имеет размер 20 пикселей на 20 пикселей. Это очень легко проверить в<em>веб-инспекторе</em>, например в<em>Chrome DevTools</em>. Откройте его и наведите указатель мыши на любой из этих элементов. Вы увидите всю сетку и то, какое место в ней занимает каждый из элементов.</p>
20
<p>Обратите внимание на то, что случилось с элементами внутри сетки. До выставления свойств grid-template-columns и grid-template-rows они занимали всю доступную ширину экрана. Теперь каждый из них занимает ровно одну ячейку. То есть имеет размер 20 пикселей на 20 пикселей. Это очень легко проверить в<em>веб-инспекторе</em>, например в<em>Chrome DevTools</em>. Откройте его и наведите указатель мыши на любой из этих элементов. Вы увидите всю сетку и то, какое место в ней занимает каждый из элементов.</p>
21
<p>Необязательно использовать только одни варианты значений внутри свойств grid-template-columns и grid-template-rows. Для каждой полосы вы можете выставить своё уникальное значение. Например такое:</p>
21
<p>Необязательно использовать только одни варианты значений внутри свойств grid-template-columns и grid-template-rows. Для каждой полосы вы можете выставить своё уникальное значение. Например такое:</p>
22
<p><a>https://codepen.io/hexlet/pen/eYJWWJx</a></p>
22
<p><a>https://codepen.io/hexlet/pen/eYJWWJx</a></p>
23
<p>Обратите внимание на то, какого размера получились полосы в данном варианте.</p>
23
<p>Обратите внимание на то, какого размера получились полосы в данном варианте.</p>
24
<h3>Repeat</h3>
24
<h3>Repeat</h3>
25
<p>Указывать каждую колонку отдельно, особенно если они одинаковые - это достаточно скучное дело. Очень легко допустить ошибку и получить не ту сетку, которую ожидали. Чтобы избежать повторения одних и тех же значений, у свойств grid-template-columns и grid-template-rows есть специальное значение repeat. Точнее это функция, которая принимает 2 значения:</p>
25
<p>Указывать каждую колонку отдельно, особенно если они одинаковые - это достаточно скучное дело. Очень легко допустить ошибку и получить не ту сетку, которую ожидали. Чтобы избежать повторения одних и тех же значений, у свойств grid-template-columns и grid-template-rows есть специальное значение repeat. Точнее это функция, которая принимает 2 значения:</p>
26
<ol><li>Сколько раз повторить значение.</li>
26
<ol><li>Сколько раз повторить значение.</li>
27
<li>Какое значение необходимо повторить.</li>
27
<li>Какое значение необходимо повторить.</li>
28
</ol><p>Перепишем нашу 12-колоночную сетку с использованием функции repeat.</p>
28
</ol><p>Перепишем нашу 12-колоночную сетку с использованием функции repeat.</p>
29
<p><a>https://codepen.io/hexlet/pen/BajRRWm</a></p>
29
<p><a>https://codepen.io/hexlet/pen/BajRRWm</a></p>
30
<p>Результат не изменился, а кода стало намного меньше и его легче прочитать. Это прекрасно :)</p>
30
<p>Результат не изменился, а кода стало намного меньше и его легче прочитать. Это прекрасно :)</p>
31
<p>Функция repeat является одним из возможных значений свойств grid-template-columns и grid-template-rows. Поэтому её возможно использовать несколько раз, или комбинировать с другими значениями. Предположим, что первые 6 ячеек по вертикали и горизонтали нужны по 20 пикселей, а остальные по 30. Тогда<em>CSS</em>может принять следующий вид:</p>
31
<p>Функция repeat является одним из возможных значений свойств grid-template-columns и grid-template-rows. Поэтому её возможно использовать несколько раз, или комбинировать с другими значениями. Предположим, что первые 6 ячеек по вертикали и горизонтали нужны по 20 пикселей, а остальные по 30. Тогда<em>CSS</em>может принять следующий вид:</p>
32
<p>Теперь сетка в<em>веб-инспекторе</em>будет выглядеть следующим образом:</p>
32
<p>Теперь сетка в<em>веб-инспекторе</em>будет выглядеть следующим образом:</p>
33
<p>Помимо грубого указания количества колонок, которые мы хотим повторить, может использоваться ещё несколько значений:</p>
33
<p>Помимо грубого указания количества колонок, которые мы хотим повторить, может использоваться ещё несколько значений:</p>
34
<ul><li>auto-fill. Браузер повторит колонки столько раз, сколько может поместиться. Если контейнер ограничен по ширине, то браузер разместит столько колонок, сколько это возможно без выхода за рамки размера контейнера.</li>
34
<ul><li>auto-fill. Браузер повторит колонки столько раз, сколько может поместиться. Если контейнер ограничен по ширине, то браузер разместит столько колонок, сколько это возможно без выхода за рамки размера контейнера.</li>
35
<li>auto-fit. Значение<em>auto-fit</em>почти полностью повторяет работу значения<em>auto-fill</em>за одним исключением: если в контейнере осталось свободное пространство после размещения всех колонок и элементов, то браузер автоматически сожмёт все пустые колонки до нуля. По сути, он их выкинет. Освободившееся место займут заполненные колонки.</li>
35
<li>auto-fit. Значение<em>auto-fit</em>почти полностью повторяет работу значения<em>auto-fill</em>за одним исключением: если в контейнере осталось свободное пространство после размещения всех колонок и элементов, то браузер автоматически сожмёт все пустые колонки до нуля. По сути, он их выкинет. Освободившееся место займут заполненные колонки.</li>
36
</ul><p><a>https://codepen.io/hexlet/pen/QWyvvxJ'</a></p>
36
</ul><p><a>https://codepen.io/hexlet/pen/QWyvvxJ'</a></p>
37
<p>Обязательно посмотрите на то, как выглядит сетка в<em>веб-инспекторе</em>. Вы увидите, что при использовании auto-fill получилась сетка размером<em>16x5</em>, тогда как со значением auto-fit сетка<em>3x1</em>. Браузер просто выкинул ненужные колонки, в которых нет никаких элементов.</p>
37
<p>Обязательно посмотрите на то, как выглядит сетка в<em>веб-инспекторе</em>. Вы увидите, что при использовании auto-fill получилась сетка размером<em>16x5</em>, тогда как со значением auto-fit сетка<em>3x1</em>. Браузер просто выкинул ненужные колонки, в которых нет никаких элементов.</p>
38
<h3>Фракция</h3>
38
<h3>Фракция</h3>
39
<p>Нет, речь здесь пойдёт не о политике. При создании<em>CSS Grid Layout</em>разработчики пытались решить проблему адаптивности. Сейчас адаптировать необходимо любую веб-страницу, если вы заботитесь о пользователях. Как же адаптировать сетку? Можно обойтись относительными единицами измерения, но зачастую этот путь приводит только к большим проблемам. Особенно, если количество полос в сетке меняется. Вслед за изменением количества полос необходимо и менять все значения размеров колонок и рядов. Не самый удобный путь.</p>
39
<p>Нет, речь здесь пойдёт не о политике. При создании<em>CSS Grid Layout</em>разработчики пытались решить проблему адаптивности. Сейчас адаптировать необходимо любую веб-страницу, если вы заботитесь о пользователях. Как же адаптировать сетку? Можно обойтись относительными единицами измерения, но зачастую этот путь приводит только к большим проблемам. Особенно, если количество полос в сетке меняется. Вслед за изменением количества полос необходимо и менять все значения размеров колонок и рядов. Не самый удобный путь.</p>
40
<p>Для решения этой проблемы в стандарте<em>CSS Grid Layout</em>появилась новая единица измерения - фракция (fraction unit). Она позволяет указать, какую часть свободного пространства должна занять полоса сетки.</p>
40
<p>Для решения этой проблемы в стандарте<em>CSS Grid Layout</em>появилась новая единица измерения - фракция (fraction unit). Она позволяет указать, какую часть свободного пространства должна занять полоса сетки.</p>
41
<p>Эта единица работает по такому же принципу, что и<em>flex-grow</em>, который мы изучали в курсе<a>CSS: Flex</a>. Суть в том, что мы указываем конкретно, сколько частей должна занять ячейка относительно других частей.</p>
41
<p>Эта единица работает по такому же принципу, что и<em>flex-grow</em>, который мы изучали в курсе<a>CSS: Flex</a>. Суть в том, что мы указываем конкретно, сколько частей должна занять ячейка относительно других частей.</p>
42
<p>Сделаем сетку во всю ширину экрана, в которой будет 12 колонок и 12 рядов. При этом размер этих полос должен определяться автоматически, в зависимости от текущего разрешения<em>viewport</em>. Имея в наличии единицы измерения<em>fr</em>, эта задача становится максимально простой:</p>
42
<p>Сделаем сетку во всю ширину экрана, в которой будет 12 колонок и 12 рядов. При этом размер этих полос должен определяться автоматически, в зависимости от текущего разрешения<em>viewport</em>. Имея в наличии единицы измерения<em>fr</em>, эта задача становится максимально простой:</p>
43
<p><a>https://codepen.io/hexlet/pen/dyGWRoV</a></p>
43
<p><a>https://codepen.io/hexlet/pen/dyGWRoV</a></p>
44
<h2>Самостоятельное задание</h2>
44
<h2>Самостоятельное задание</h2>
45
<p>Используя материалы урока, создайте 24 колоночную сетку. Попробуйте различные значения свойств grid-template-columns и grid-template-rows</p>
45
<p>Используя материалы урока, создайте 24 колоночную сетку. Попробуйте различные значения свойств grid-template-columns и grid-template-rows</p>