Обзор CSS Grid и Flexbox: когда и как использовать
CSS Grid и Flexbox — это две мощные технологии для создания макетов веб-страниц. Обе они помогают решать проблемы с позиционированием и отображением элементов на странице, но они работают немного по-разному и предназначены для разных задач.
Значение и важность использования CSS Grid и Flexbox в современном веб-дизайне
С развитием современного веб-дизайна возникает потребность в более гибком и мощном способе создания макетов. CSS Grid и Flexbox помогают Front End разработчикам легко и быстро создавать адаптивные и кроссбраузерные макеты. В этой статье мы подробно рассмотрим обе технологии, их основы, сравним их, а также узнаем, когда и как их использовать.
Основы CSS Grid
CSS Grid — это двумерная система макета, которая позволяет контролировать размещение элементов в строках и столбцах. Она обеспечивает гибкость в создании макетов и позволяет разработчикам легко создавать сложные структуры с помощью небольшого количества кода.
Основные термины и концепции
Основные термины и концепции CSS Grid включают: контейнер (grid container), элементы сетки (grid items), линии сетки (grid lines), столбцы (grid columns), строки (grid rows), области (grid areas) и вспомогательные элементы (grid gap). Каждый из этих компонентов помогает разработчикам управлять расположением и отображением элементов на странице.
Простой пример использования CSS Grid
.grid .grid-container < display: grid; grid-template-columns: repeat(3, 1fr); grid-gap: 10px; >.grid-item
В этом примере мы создаем простую сетку из 3 столбцов и 2 строк, используя CSS Grid. Каждый элемент сетки имеет номер и фоновый цвет.
Что такое Flexbox
Flexbox, или гибкий контейнер, — это одномерная система макета, которая помогает управлять расположением элементов в строке или столбце. Он предназначен для выравнивания и выравнивания элементов, а также для автоматического заполнения свободного места в контейнере.
Основные термины и концепции
Основные термины и концепции Flexbox включают: контейнер (flex container), элементы (flex items), свойства контейнера (container properties), свойства элементов (item properties), основную ось (main axis), поперечную ось (cross axis) и отступы (margins). С помощью этих компонентов разработчики могут легко создавать гибкие макеты с различными отображениями элементов.
Пример использования Flexbox
.flex-container < display: flex; justify-content: space-between; align-items: center; background-color: #f2f2f2; >.flex-item
У этом примере мы создаем простой макет из трех элементов, расположенных в ряду с помощью Flexbox. Элементы равномерно расположены в контейнере и выровнены по центру.
Сравнение CSS Grid и Flexbox
CSS Grid и Flexbox имеют много схожих возможностей, таких как выравнивание и размещение элементов, но также есть ряд отличий. CSS Grid — двумерная система макета, которая работает с строками и столбцами, тогда как Flexbox — одномерная система макета, предназначенная для работы с строками или столбцами.
CSS Grid имеет преимущества, такие как возможность создания сложных макетов с большим количеством строк и столбцов и гибкое управление элементами. Однако CSS Grid может быть сложнее для освоения и требует больше кода.
Flexbox предлагает простоту и быстроту создания макетов с выравниванием и отображением элементов. Однако для создания сложных макетов с множеством строк и столбцов, Flexbox может быть недостаточно мощным.
Выбор между CSS Grid и Flexbox зависит от конкретных потребностей вашего проекта. Если вам нужно создать сложный макет с множеством строк и столбцов, CSS Grid будет более подходящим вариантом. Для простых макетов с одной строкой или столбцом, Flexbox будет отличным решением.
Таблица отличий CSS Grid и Flexbox
| Свойство | CSS Grid | Flexbox |
|---|---|---|
| Структура макета | Двумерная (строки и столбцы) | Одномерная (строки или столбцы) |
| Выравнивание элементов | Выравнивание по двум осям (горизонтальной и вертикальной) | Выравнивание только по одной оси (горизонтальной или вертикальной) |
| Расположение элементов | Элементы располагаются в соответствии с сеткой (гибкость с учетом позиционирования) | Элементы располагаются в последовательности (направление можно изменить) |
| Использование в соответствии с сложностью макета | Отвечает потребностям сложных макетов с множеством строк и столбцов | Идеально подходит для простых макетов с одной строкой или столбцом |
| Отношение к контейнерам и элементам | Имеет отдельные свойства для контейнера сетки и дочерних элементов | Свойства применяются к контейнеру и дочерним элементам |
| Поддержка браузерами | Широкая поддержка, но могут быть незначительные отличия в старых версиях браузеров | Широкая поддержка, но могут быть незначительные отличия в старых версиях браузеров |
| Применение | Подходит для создания сложных макетов с кастомным расположением элементов | Подходит для создания адаптивных макетов с линейным расположением элементов |
Эта таблица поможет вам лучше понять разницу между CSS Grid и Flexbox и выбрать подходящий инструмент для ваших потребностей.
Сценарии использования CSS Grid
Создание сложных макетов с множеством строк и столбцов
CSS Grid идеально подходит для создания сложных макетов с множеством строк и столбцов, таких как макеты журналов, галереи и другие большие структуры. С помощью CSS Grid вы можете легко управлять расположением элементов и создавать современные и креативные визуальные эффекты.
Расширенное управление расположением элементов
CSS Grid позволяет разработчикам тонко настраивать расположение элементов на странице, управляя линиями сетки и областями. Это позволяет создавать эффективные макеты с минимальными усилиями и кодом.
Сценарии использования Flexbox
Выравнивание и отображение элементов в строке или столбце
Flexbox идеально подходит для выравнивания и отображения элементов в строке или столбце. Он обеспечивает быстрое и простое решение для разработки гибких макетов с одним рядом или столбцом.
Адаптивные макеты
Благодаря своей гибкости, Flexbox помогает создавать адаптивные макеты, которые легко масштабируются и оптимизируются для разных размеров экранов и устройств. Это делает Flexbox отличным выбором для разработки отзывчивых и мобильно-ориентированных веб-сайтов.
Выводы
CSS Grid и Flexbox — это мощные технологии для создания макетов веб-страниц. Хотя обе системы имеют общие возможности, такие как выравнивание и расположение элементов, они отличаются по назначению и способу работы. Выбор между CSS Grid и Flexbox зависит от потребностей вашего проекта и требований к макету. Чтобы определиться с оптимальным выбором, оцените сложность макета, необходимость двумерного или одномерного подхода и адаптивность дизайна.
CSS Grid лучше подходит для создания сложных двумерных макетов, которые требуют многих строк и столбцов, в то время как Flexbox предлагает более простое решение для одномерных макетов с строками или столбцами. Если вам нужно быстро выбрать, обратите внимание на свои текущие потребности и растущие требования проекта.
Независимо от того, какую технологию вы решите использовать, и CSS Grid, и Flexbox значительно упрощают процесс создания веб-макетов и обеспечивают большие возможности для управления размещением элементов на странице. Овладение обоими технологиями обеспечит вам мощный инструментарий для разработки современных и креативных веб-дизайнов.
Grid или Flexbox?
Мишель Баркер, автор материала, перевод которого мы сегодня публикуем, говорит, что недавнее обсуждение в Twitter, начатое Крисом Койером, заставило её задуматься о том, как веб-разработчики делают выбор между технологиями CSS Grid Layout и CSS Flexbox Layout при разработке макетов.

Крис Койер в своём твите задал аудитории вопрос о том, как те, кто знает о том, что такое Grid и Flexbox, предпочитают объяснять разницу между этими технологиями.
Среди ответов на этот вопрос, что, по словам Мишель, вполне ожидаемо, можно было отметить ценные идеи Рэйчел Эндрю и Джен Симмонс.
Рэйчел сказала, что технология Flexbox предназначена для разработки одномерных макетов, представляющих собой описание расположения элементов в строке или в столбце. А технология Grid предназначена для разработки двумерных макетов, в которые входят и строки, и столбцы.
Джен говорит, что, технология Grid используется для описания строк и столбцов макетов. При этом содержимое будет располагаться в ячейках макета именно так, как это нужно разработчику. При использовании Flexbox это не так, причём, речь идёт не только о размещении данных во втором измерении (это и так понятно), но и о размещении их в одном измерении. Технология Flexbox не подходит для большинства случаев, в которых её используют.
Мишель отмечает, что одно лишь чтение твитов не раскрывает особенностей использования технологий Grid и Flexbox. В этом материале она хочет рассказать о том, когда и где стоит использовать эти технологии, а также о том, по каким причинам можно предпочесть одну технологию другой.
Читая ответы на вопрос Криса, Мишель была удивлена тем количеством людей, которые говорили о том, что они использовали бы Grid лишь для макетов уровня страницы, и Flexbox — для всего остального. Если вы тоже придерживаетесь подобного правила — это значит, что вы серьёзно ограничиваете себя в том, что касается использования мощных возможностей Grid в различных ситуациях. Главное, что автору материала хотелось бы порекомендовать веб-разработчикам, заключается в том, что каждый макет стоит воспринимать как нечто особенное, анализировать доступные возможности, и не делать предположений о том, какие технологии понадобятся для его создания. Вот некоторые вопросы, которые можно задать себе при выборе технологии, подходящей для разработки макета.
Много ли вычислений приходится выполнять?
Приведу тут мой ответ на вопрос Криса. Я сказала тогда, что если мне кажется, что при формировании макета приходится слишком часто пользоваться CSS-функцией calc() , то это обычно говорит о том, что мне нужна технология Grid, а не Flexbox.
Если вам приходится часто прибегать к функции calc() для точного расчёта размеров строк и столбцов (если нужно, например, принимать во внимание внутренние поля), то это нередко указывает на то, что вам стоит рассмотреть возможность использования технологии Grid, так как применение единицы измерения fr значительно упростит вам жизнь. Хотя, в качестве рекомендации общего характера, этот совет вполне жизнеспособен, он не описывает полной картины происходящего. Иногда Grid может понадобиться и в тех случаях, когда при построении макета функция calc() не используется. Например — в ситуации, когда речь идёт о двумерном макете с фиксированной шириной, элементы которого имеют 200 пикселей в ширину. При разработке такого макета для того чтобы узнать ширину элементов функция calc() не нужна, но при этом могут оказаться чрезвычайно полезными особенности поведения макетов, построенных на основе Grid. Аналогично, возможны и ситуации, в которых лучше всего воспользоваться Flexbox и при этом, неизбежно, применить функцию calc() . В результате то, о чём мы тут говорим, лучше всего воспринимать не как жёсткое правило, вроде такого: «Используете calc() и Flexbox? Значит вам необходимо переходить на Grid», а как информацию к размышлению.
Одно измерение или два?
Серьёзное различие технологий Grid и Flexbox заключается в том, что первая позволяет управлять расположением элементов в двух измерениях (в строках и столбцах), а вторая этого не позволяет. Опять же, это не означает, что никогда не следует использовать Grid для одномерных макетов. Я часто выбираю именно Grid — в тех случаях, когда мне нужна высокая точность в управлении размерами и положением элементов, расположенных в одном измерении. Данный подход продемонстрирован в этом примере на CodePen, и в этой сопутствующей ему статье.

Пример использования Grid
Как должны вести себя элементы?
Технологию Grid часто имеет смысл использовать в тех случаях, когда разработчику нужен контроль над поведением макета в двух измерениях. Однако это не говорит о том, что Grid всегда лучше Flexbox. При использовании Grid в распоряжении разработчика имеются строки и столбцы, ячейки, и так называемые грид-области (grid area), представляющие собой одну ячейку или группу из нескольких ячеек. При использовании Grid элементы должны быть расположены в этих ячейках или областях.
Предположим, у нас имеется макет, основанный на Grid, отличающийся следующими особенностями: есть девять элементов, расположенных слева направо в трёх строках по три элемента, между элементами имеются промежутки (gap) размером в 20 пикселей. Такой макет можно создать как с использованием Grid, так и с использованием Flexbox. Код описания такого макета, основанного на Grid, оказывается гораздо проще и чище:
.grid < display: grid; grid-template-columns: repeat(3, 1fr); grid-auto-rows: 200px; /* Исходим из предположения о том, что нам нужно, чтобы строки обладали бы фиксированной высотой. Тут можно остановиться и на значении по умолчанию, `auto`, если нужно, чтобы высота строк зависела бы от их содержимого. */ gap: 20px; >
Применение подобного макета приводит к тому, что элементы размещаются автоматически, нам при этом ничего больше делать не нужно. Если же мы дадим себе время на размышления, то мы можем использовать функции Grid auto-fit() и minmax() , что позволит нам получить полностью отзывчивый макет без применения медиа-запросов. Откройте этот пример, попробуйте поменять размер окна и посмотрите на то, что получится.

Пример использования Grid
Подробнее об этой технике, а также о некоторых других полезных вещах, можно узнать, посмотрев это видео.
Если бы мы создавали подобный макет с помощью Flexbox, то, в отличие от только что описанного примера, нам понадобилось бы стилизовать и элементы, и контейнер:
.grid < display: flex; flex-wrap: wrap; margin: -10px; width: calc(100% + 20px); >.item < width: calc((100% / 3) - 20px); flex: 0 0 auto; margin: 0 10px 20px 10px; >
Тут, в контейнере, понадобится указывать отрицательное значение для свойства margin — для того чтобы нейтрализовать тот факт, что общая ширина элементов больше, чем сам контейнер, и таким образом осуществить перенос данных на следующую строку. Кроме того, этот пример не может продемонстрировать то же самое отзывчивое поведение без дополнительных усилий с нашей стороны. Далее, надо отметить, что здесь, вероятно, может потребоваться использование медиа-запросов.
Вот пример на CodePen, который иллюстрирует вышесказанное.

Пример использования Flexbox
Существует несколько способов создать такой же макет с использованием Flexbox, но все они требуют применения неких «хаков», и происходит это по той причине, что такова их природа. Фактически, речь идёт о том, что, мы пытаемся использовать технологию Flexbox для того, для чего она, на самом деле, не предназначена. Но это не значит, что Flexbox — это всегда неудачный выбор основы для макета.
Многие современные CSS-фреймворки используют некие вариации этого метода для представления макетов. И, кстати, если вы хотите пойти именно таким путём, то могу порекомендовать Susy, набор инструментов, который берёт на себя все сложности по созданию подобных макетов.
Итак, что же лучше выбрать в этой ситуации? Grid или Flexbox? Возникает такое ощущение, что у Grid тут имеются некоторые неоспоримые преимущества, но для того чтобы ответить на этот вопрос, нам надо подумать о том, что должно произойти в том случае, если у нас имеется более девяти, но менее 12 элементов (если их будет, например, 12, то это позволит им полностью заполнить новую строку). Нужно ли нам, чтобы новые элементы просто находились бы в начале следующей строки, как было в тех примерах, что мы уже видели? Или нам надо, чтобы они вели бы себя как-нибудь иначе? Возможно, если в очередной строке будет находиться лишь один элемент, то нам нужно, чтобы он занял бы всё пространство этой строки, как в варианте A следующего примера? Или, может быть, если в новой строке будет всего два элемента, нам нужно, чтобы они были бы выровнены по центру, как в примере B?

Разные варианты размещения элементов в последней строке
При использовании макета, основанного на Grid, с применением автоматического размещения элементов, в нашем распоряжении оказывается лишь один вариант — размещение нового элемента в доступной ячейке, расположенной слева. Подобное размещение элементов можно встретить в предыдущих примерах. Тут мы исходим из предположения о том, что свойство direction не установлено в значение rtl (в таком случае элементы располагались бы справа налево, и единственный элемент в последней строке располагался бы в правой ячейке). В результате новые элементы при использовании Grid размещаются в следующих доступных ячейках сетки. Технология Flexbox позволяет гибко управлять расположением элементов. Это означает, что мы можем управлять поведением элементов, используя комбинацию свойств, управляющих размещением элементов и их выравниванием.
Вот пример, в котором продемонстрированы такие макеты, при использовании которых один или два элемента, приходящиеся на строку, рассчитанную на три элемента, занимают всю эту строку.

Элемент занимает всё доступное пространство строки
В результате оказывается, что независимо от технологии, используемой для формирования макета, всё сводится к тому, какое именно поведение элементов, расположенных в макете, интересует разработчика. И в разных ситуациях на один и тот же вопрос могут быть даны различные ответы.
Пытаетесь ли вы заменить Flexbox на Grid?
Когда я выступаю на различных мероприятиях, меня нередко спрашивают о том, когда я использовала бы Flexbox вместо Grid, и о том, нужна ли нам вообще такая технология, как Flexbox. Как мы уже видели в предыдущем примере, Grid — это не замена Flexbox. Обе технологии довольно-таки мирно сосуществуют, и знание о том, в каких ситуациях каждая из них лучше всего показывает себя, расширяет возможности по проектированию макетов.

Пример компонента
На этом рисунке показан компонент, в ходе работы с которым нужно управлять размещением текста, изображения и заголовка, и с учётом столбцов, и с учётом строк. Так же тут нужно управлять тем, как они, в определённой степени, друг с другом взаимодействуют. Единственный способ удовлетворительного решения этой задачи заключается в использовании технологии Grid.
Но я без колебания воспользуюсь технологией Flexbox для создания навигационного меню, такого, которое показано в данном примере.

Меню, созданное средствами Flexbox
Здесь нужно управлять расположением элементов в единственном измерении, и надо, чтобы элементы вели бы себя гибко. С этой задачей технология Flexbox справляется на отлично. Благодаря использованию Flexbox можно указать, нужно ли переносить эти элементы на новые строки, или нет, что позволяет аккуратно отображать их в том случае, если имеющееся на странице свободное пространство не позволяет вывести все элементы в одной строке.
Как макет должен выглядеть в браузерах, которые не поддерживают технологию Grid?
Если мы пользуемся технологией Grid, то одной из возможных проблем, которую нам нужно принимать во внимание, является поддержка этой технологии браузерами. Тут же нам нужно продумать и то, что будет происходить в том случае, если наша страница будет выводиться в одном из браузеров, не поддерживающих Grid (например — в IE 11 и ниже). Мой подход к решению этой проблемы заключается в использовании правил @supports и в подготовке кода, предназначенного для разных браузеров. Часто (но не всегда) я, в качестве замены макета, основанного на Grid, использую макет, основанный на Flexbox, предназначенный для достаточно старых браузеров.
.grid < display: flex; flex-wrap: wrap; /* Продолжение кода, предназначенного для старых браузеров */ >@supports (display: grid) < .grid < display: grid; /* Продолжение кода, использующего Grid */ >>
Правда, тут надо отметить, что если вы ловите себя на том, что тратите многие часы на попытку воссоздать, без использования Grid, то, что было сделано с помощью этой технологии, тогда, возможно, у вас с самого начала было не так уж и много причин использовать именно Grid. Ведь эта технология особенно хороша тем, что она способна на то, что средствами исключительно Flexbox сделать нельзя.
Итоги
Мы обсудили несколько очень простых и широко распространённых примеров разработки макетов, рассмотрели особенности использования при их построении технологий Grid и Flexbox. Надеемся, нам удалось дать пищу для размышлений тем, кто занят выбором подходящей технологии для своего очередного макета.
Уважаемые читатели! В каких ситуациях вы пользуетесь технологией Grid, а в каких — Flexbox?
Выбор CSS макета — Grid или Flexbox?

Удачно оформленный макет удерживает пользователей на сайте, так как делает важные элементы доступными и легко находимыми. Слабые же макеты отпугивают посетителей, которые покидают ресурс, так и не найдя того, за чем пришли.
В веб-дизайне макет – это то, как сайт отображается на экране. В HTML 5 есть довольно много элементов, определяющих внешний вид веб-страницы: заголовок, навигационный блок, абзац, сноска, статья и нижний колонтитул, каждый из которых имеет свое особое значение в создании макета. Вместе же они формируют четыре основных раздела страницы – заголовок/баннер, поисковый блок, содержимое и нижний колонтитул.
Языки программирования помогают сделать сайты «живыми», но в основе каждой страницы по-прежнему лежит старый добрый HTML. При рассмотрении макетов необходимо учитывать факторы, определяющие их качество, а именно отзывчивость, порты просмотра, устройства отображения, браузеры и размеры экранов пользователей. Грамотный макет не только здорово смотрится, но также может сохранять задуманную структуру, вписываясь в экраны с любым возможным соотношением сторон. Как раз за эту подстройку и отвечает CSS. В текущей статье мы в общих чертах рассмотрим два его мощнейших инструмента: Flexbox и Grid.
Что такое макет CSS FLEXBOX?
Flexbox – это общепринятое сокращение для Flexible Box Module (модуль гибкого контейнера), который представляет собой одномерную модель макета. Это значит, что одновременно он может работать только со строкой или столбцом, но не с обоими сразу. Flexbox эффективно справляется с выравниванием, распределением и направлением элементов страницы.
Двумя основными понятиями этой модели макета являются главная ось и поперечная ось. Главная ось flex-контейнера – это основное направление, вдоль которого выстраиваются flex-элементы, поперечная же ось ей перпендикулярна.
Для начала давайте обернем HTML-элементы div во flex-wrapper.
Header Nav Content Footer
В CSS родительский контейнер “flex-wrapper” преобразуется во flexbox с помощью простой инструкции.
.flex-wrapper
При добавлении элементов и свойств я буду использовать яркие цвета и отступы, чтобы выделить контейнеры и div-элементы.
.flex-wrapper < display: flex; background-color: beige; >.flex-wrapper > div
Вы можете видеть, как удачно элементы div располагаются по горизонтали, но при этом они занимают не всю область контейнера, и в конце остается пустое пространство. Это можно исправить, добавив flex-grow.
.flex-wrapper > div
Свойство flex-grow отвечает за распределение каждого элемента flex-контейнера. По умолчанию значение этого свойства равно 0, присваивая же разное количество единиц div-элементам, вы увеличиваете их по отношению к остальным. Противоположный эффект дает свойство flex-shrink.
#one < flex-grow: 10; >/* таким образом первый div-элемент станет на 10 единиц больше остальных */
FLEX-DIRECTION
Flex-direction определяет направление размещения элементов контейнера. С его помощью можно заставить их располагаться по направлению вверх, вниз, влево или вправо, а также в обратном порядке. По умолчанию элементы flex-контейнера упорядочены вдоль главной оси слева направо.
.flex-wrapper < display: flex; flex-direction: row; /* направление по умолчанию */ >.flex-wrapper
Здесь элементы также отображаются слева направо, но в обратном порядке. В итоге четвертый div становится первым, а первый, в свою очередь, последним.
.flex-wrapper
Здесь же упорядочивание происходит уже вертикально – сверху вниз.
.flex-wrapper
Теперь элементы также расположены вертикально, но в обратном порядке, т.е. четвертый оказался вверху, а первый внизу.
FLEX BASIS
Flex basis определяет размер элемента внутри контейнера. При этом значение размера может указываться в em, px или процентах. Это свойство отличается от flex-grow тем, что не распределяет пространство между элементами контейнера равномерно.
#three
FLEX
Flex – это сокращенное свойство, объединяющее flex-shrink, flex-grow и flex-basis. Его рекомендуется использовать вместо раздельного написания свойств, указывая в нем их значения в следующем порядке: flex-grow, flex-shrink, flex-basis.
.flex-wrapper
JUSTIFY-CONTENT И ALIGN-SELF
Justify-content и align-self – это идеальное решение для размещения div или контейнера в центре окна браузера.
.flex-wrapper
CSS GRID Layout
CSS grid (сетка) представляет собой мощный двухмерный макет, при использовании которого можно одновременно работать со строками и столбцами. В основе CSS Grid лежит неявное разделение экрана на сетку из 12 частей, в которые в итоге и вписываются элементы.
Преимущество этой технологии перед Flexbox и другими видами макетов в ее возможности работать двухмерно. При этом она также упрощает позиционирование, и элементы контейнера могут размещаться, перекрывая друг на друга.
ОПРЕДЕЛЕНИЕ СЕТКИ В CSS GRID
Преобразование HTML-структуры в СSS сетку выполняется одной простой CSS инструкцией.
.containerHeaderNavContentAsideSectionFooter
GRID TEMPLATE-COLUMNS И GRID-TEMPLATE-ROWS
Свойства grid-template-columns и grid-template-row устанавливают величину столбца или строки, определяя размер div-элементов согласно присвоенным значениям, которые указываются в px, fr, процентах или em.
.container < display: grid; grid-template-columns: 40px 1fr 20%; grid-template-rows: 200px; background-color: beige; >.container > div
grid-template-columns: 40px 1fr 20%; — эта строка дает браузеру команду присвоить первому div ширину 40px, второй же занимает одну долю отведенного места, а третий 20%. Элементы с 4 по 6 автоматически смещаются под первые 3 и принимают те же значения в том же порядке, т.е. div 4 получает размер 40px, div 5 — одну долю, а div 6 – 20%.
Чтобы поместить все шесть div-элементов в одну строку нужно указать в свойстве grid-template-column шесть значений. При этом не обязательно использовать для столбцов разные единицы измерения, можно задать только проценты, fr или px.
grid-template-rows: 200px; — эта строка присваивает всем div-элементам высоту в 200px.
FR
.container
Присвоив 16,7% для 6 точек, я успешно разделил шесть элементов контейнера по шести равным частям экрана. Значение 16,7% я выбрал, потому что при умножении 16,7 на 6 как раз получится 100% ширины экрана.
Использование процентов и пикселей работает идеально, но им недостает гибкости, и они уступают наиболее эффективному компоненту – долям CSS сетки.
Fr – это дробная единица, которая присваивает каждому элементу одну долю доступного пространства, которое можно увеличивать, выделяя под div необходимую ему область.
Теперь наше свойство grid-template-columns стало:
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;
В результате каждый div-элемент был размещен на экране равномерно.
grid-template-columns: 1fr 2fr 1fr 2fr 1fr 1fr;
Изменив второе и четвертое значения, мы сделали соответствующие элементы вдвое больше остальных. Самое же главное, что они по-прежнему распределяются в браузере равномерно и имеют высокую отзывчивость.
ФУНКЦИЯ REPEAT
Вместо того, чтобы повторно переписывать значения, можно задействовать функцию repeat, которая позволит сделать это всего один раз.
.container
Синтаксис этой функции относительно прост. Сначала пишем слово “repeat”, после которого определяем, сколько раз нужно повторить размер, в данном случае 6, а затем указываем величину единицы измерения. Эта функция аналогичным образом работает со свойством template-row и позволяет использовать как fr, em, px, так и проценты.
GAP
Gap – это отступ, представляющий свойство CSS сетки, которое позволяет указывать расстояние между div-элементами контейнера. Работает оно точно также, как свойство margin и измеряется обычно в px.
gap: 10px;
GRID-COLUMN-START/GRID-COLUMN-END И GRID-ROW-START/GRID-ROW-END
Свойства grid-column-start и grid-column-end помещают элемент сетки в конкретное место столбца относительно определенных строк сетки. Свойства же grid-row-start и grid-row-end делают то же самое, но в отношении строки. Присваивая этим свойствам значения, можно удобно управлять начальной и конечной точкой элемента сетки, выделяя ему нужную область.
.container < display: grid; grid-template-columns: repeat (3, 1fr); grid-template-rows: repeat(4, 200px); >#one
Если вы присвоите указанные значения первому div, то заметите, что он смещает второй div на одну единицу и занимает первые две позиции, смещая третий div вниз. В отношении же строк теперь он занимает три позиции и становится выше.
В программировании индексация производится по особому правилу, согласно которому мы обычно начинаем отсчет с 0. В этом случае последнее значение, как правило, упоминается, но не учитывается. Например, значение свойства grid-column-end равно 3, но по факту оканчивается оно на 2-х также, как и grid-row-end оканчивается на 3-х, а не на 4-х.
GRID-COLUMNS И GRID-ROW
Это сокращенный вариант для свойств grid-column-start/grid-column-end и grid-row-start/grid-row-end. В качестве значений в этом случае через слэш указываются начальные и конечные позиции элемента:
СОЗДАНИЕ ГАЛЕРЕЙ
CSS сетка идеально подходит для создания галерей. С помощью небольшого количества кода и манипуляций вы можете создать их прекрасные отзывчивые макеты.
Мозаичный макет галереи
Такой макет создает равные плитки изображений, равномерно распределенные по странице/контейнеру.
.container < display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(3, 200px); background-color: beige; gap: 10px >.container > divImage OneImage TwoImage ThreeImage FourImage FiveImage SixImage SevenImage EightImage Nine
Этот код создаст прекрасный макет плиточной галереи изображений.
Мозаичный макет
Макет Masonry-галереи
Этот макет уже неравномерен, так как не имеет фиксированной высоты строк. Однако при помощи grid-columns и grid-rows мы можем подстраивать изображения, чтобы они вписывались в назначенные дробные единицы и перемещались по ним нужным нам образом.
.container < display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(5, 200px); background-color: beige; gap: 10px; >.container > div < background-color: green; >#one < grid-column: 1/3; grid-row: 1/4; >#two < grid-row: 1/3; >#five < grid-column: 4/2; >#seven < grid-row: 6/1; >

Макет Masonry
GRID TEMPLATE AREAS
Свойство Grid-template-areas присваивает элементам имена, чтобы свойство grid-area могло на них ссылаться. Работает оно аналогично grid-column и grid-row, позволяя легко отображать и размещать конкретные области в структуре сетки.
.container < display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(2,100px); background-color: beige; gap: 10px; grid-template-areas: 'header header header' 'nav nav nav' 'aside content content' 'aside section section' 'footer footer footer'; >.container > div < background-color: green; font-size: 40px; >#one < grid-area: header; >#two < grid-area: nav; >#three < grid-area: aside; >#four < grid-area: content; >#five < grid-area: section; >#sixHeaderNavAsideContentSectionFooter

GRID AREAS
Ссылаться на именованные области необходимо в порядке их вызова. Например, область сетки для #one не может быть нижним колонтитулом, поскольку эта область сетки именуется последней. Нарушение же правильного порядка приведет к ошибке в дизайне.
Что же лучше — Flexbox или Grid?
В своей сути Grid является макетом на основе контейнеров, а Flexbox на основе содержимого. И тот, и другой по-своему эффективен, хотя CSS Grid включает больше возможностей и позволяет легче манипулировать строками и столбцами сетки. Прежде чем решать, какой использовать, следует проанализировать сложность, структуру и содержимое создаваемого вами сайта. Приведу еще одно несколько углубленное сравнение: в макете flexbox размер ячейки (flex-элемента) определяется в самом flex-элементе, а в макете Grid размер элемента определяется уже в его контейнере.
Лично я могу посоветовать использовать CSS Grid для общего макета сайта, а затем уже Flexbox для элементов контейнера. Однако CSS Grid также отлично работает с отдельными элементами и учитывает нюансы реальной структуры сетки лучше, чем Flexbox. Например, инструкция grid-template-areas отобразит структуру сайта буквально за несколько секунд, после чего вы сможете сосредоточится на выравнивании контента по своему усмотрению.


- css
- версткаб web-программирование
Отличия между Flexbox и CSS Grid для верстальщика

Flexbox и CSS Grid не являются взаимозаменяемыми инструментами, а наоборот — используются как взаимодополняемые технологии, тесно сотрудничающие друг с другом. И если с помощью CSS Grid можно обозначить макет и создать его основу, то Flexbox позволит расставить и выровнять элементы внутри этого макета.
Flexible box (flexbox) — это гибкий модуль раскладки и выравнивания элементов, появившийся в CSS 3. Flexbox позиционируется как одномерная система распределения элементов, когда они могут располагаться только по одному направлению: либо строка, либо столбец.
CSS Grid — это тоже модуль CSS 3, но уже разработанный как двумерная система, с помощью которой можно манипулировать как строками, так и колонками.
Flexbox и CSS Grid не являются взаимозаменяемыми инструментами, а наоборот, используются как взаимодополняемые технологии, тесно сотрудничающие друг с другом. И если с помощью CSS Grid можно обозначить макет и создать его основу, то Flexbox позволит расставить и выровнять элементы внутри этого макета.
С появлением данных модулей у верстальщиков появилось неограниченное поле возможностей для реализации задумок дизайнеров и тех кто проектирует шаблоны для сайтов.
С помощью Flexbox можно строить небольшие макеты. CSS Grid позволяет компенсировать ограничение возможностей Flexbox и строить сложные сетки. Совместное же использование этих спецификаций позволяет создавать по истине гибкие и невероятно практичные макеты с точки зрения своего функционала.