Одним из свойств CSS Grid Layout является назначение grid-областей в виде использования свойства grid-template-areas
для контейнера и grid-area
для вложенных в него элементов сетки. Как и с большинством других свойств CSS Grid, здесь мы сталкиваемся с большим разнообразием вариантов назначения этого свойства.
Варианты значений свойства grid-template-areas
Для grid-контейнера можно задать шаблон для областей в виде имен в кавычках. Для этого используется специальное свойство grid-template-areas
. Вы можете использовать такие варианты значений:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* Значение по умолчанию */ grid-template-areas: none; /* именованные области */ grid-template-areas: 'a b'; grid-template-areas: 'a b b' 'a c d'; /* пустая область - .*/ grid-template-areas: 'a b b' 'a . .'; /* Глобальные значения */ grid-template-areas: inherit; grid-template-areas: initial; grid-template-areas: unset; |
Использование именованных grid-областей
Именованные grid-области, пожалуй, один из самых простых и самых наглядных вариантов назначения свойств grid-template-areas
и grid-area
. Для контейнера мы указываем свойства , определяющие, как будут проходить линии сетки и ее столбцы, задавая свойства grid-template-columns
и grid-template-rows
, а затем указываем свойство grid-template-areas
, в котором в кавычках построчно перечисляем, где будут находиться какие из именованных областей. Имя вы можете задать какое-угодно, но это должна быть строка, причем желательно, чтобы ее наименование хоть как-то соответствовало тому блоку, который в ней будет находиться.
1 2 3 4 5 6 7 8 9 10 | .grid-container { display: grid; grid-template-rows: 1fr 3fr 1fr; grid-template-columns: repeat(3, 1fr ); grid-template-areas: "header header header" "main main aside" "footer footer footer"; min-height: 100vh; } |
Этот код говорит о том, что внутри grid-контейнера будет 3 строки, делящие его пространство в соотношении 1:3:1 по вертикали, а по горизонтали линии столбцов будут иметь одинаковую ширину в соотношении 1:1:1, т.к. в свойстве grid-template-columns
указано повторение 3 раза столбца в 1fr
.
Для вложенных элементов header
, main
, aside
и footer
назначены такие свойства:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | header { background-color: #f90; grid-area: header; } main { background-color: #ff0; grid-area: main; } aside { background-color: #0f6; grid-area: aside; } footer { background-color: #333; color: #fff; grid-area: footer; } |
На скриншоте ниже, сделанном в Инспекторе свойств браузера Mozilla Firefox, видно, как расположились все области:
При уменьшении размера экрана такое соотношение, конечно же, нас не устроит. Поэтому в медиа-запросе мы будем перестраивать макет в том, что касается свойств grid-контейнера.
1 2 3 4 5 6 7 8 9 10 | @media (max-width: 600px){ .grid-container { grid-template-columns: 1fr; grid-template-rows: repeat(4, 1fr); grid-template-areas: "header" "main" "aside" "footer"; } } |
В результате получим изменение внешнего вида макета и в браузере:
Вы можете посмотреть приведенный пример кода ниже. Нажмите на вкладку CSS, чтобы посмотреть, как изменится расположение grid-областей в макете.
See the Pen Grid area by Elen (@ambassador) on CodePen.
Пустые области сетки
В том случае, когда вам нужно, чтобы сетка имела пустые промежутки, просто поставьте точку вместо какого-либо имени области:
1 2 3 4 5 6 7 8 9 | .grid { grid-template-areas: "head head head head" "aside main main main" "aside main main main" ". main main main" ". main main main" "foot foot foot foot"; } |
Попробуйте сами, используя CSS Grid Generator от Anthony Dugois, в котором можно перетягивать области сетки, получая таким образом макет для дальнейшего использования.
See the Pen CSS Grid Template Builder by Anthony Dugois (@anthonydugois) on CodePen.
Варианты значений свойства grid-area
По умолчанию значение grid-area
имеет значение auto
, что значит , что размер элемента соответствует одной ячейке грид-сетки. Вы также можете назначить именованную грид-область или задать ее между определенными номерами линий сетки. Интересно, что в том случае, если вы назначите имена для линий сетки, используя -start
и -end
в конце, то название области вы сформируете автоматически.
Возможные варианты значений свойства grid-area
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /* Ключевые слова в качестве значений */ grid-area: auto; grid-area: auto / auto; grid-area: auto / auto / auto; grid-area: auto / auto / auto / auto; /* имена областей */ grid-area: some-grid-area; grid-area: some-grid-area / another-grid-area; /* цифра и название (имя) */ grid-area: some-grid-area 4; grid-area: some-grid-area 4 / 2 another-grid-area; /* span && [ <цифра> || <имя> ] значения */ grid-area: span 3; grid-area: span 3 / span some-grid-area; grid-area: 2 span / another-grid-area span; /* Глобальные значения */ grid-area: inherit; grid-area: initial; grid-area: unset; |
При использовании номеров сетки вы можете задать четыре значения grid-line
. Первое из них определяет grid-row-start
, второе значение - grid-column-start
, третье значение - grid-row-end
и четвёртое значение - grid-column-end
.
Для того чтобы не запутаться в числах, их можно описать в виде последовательности правил:
1 | grid-area: grid-row-start / grid-column-start / grid-row-end / grid-column-end |
Можно сказать, что первые 2 значения определяют верхний левый угол grid-элемента, а 2 других - его нижний правый угол. То есть это краевые точки, которые определяют размеры прямоугольной области grid-элемента.
В примере ниже мы используем это свойство для назначения grid-area
из индексов grid-линий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | .grid-container { max-width: 1200px; margin: 50px auto; display: grid; gap: 20px; grid-template-rows: repeat(2, 212px); grid-template-columns: repeat(6, minmax(auto, 285px) ); } .item { background: linear-gradient(180deg, rgba(0, 224, 255, 0.11) 0%, rgba(0, 224, 255, 0.0539) 100%); border-radius: 20px; border: 2px solid rgba(0, 224, 255, .6); padding: 30px; color: #fff; } .item:first-child { grid-area: 1 / 1/ 2 / 2; } .item:nth-child(2){ grid-area: 1 / 2 / 2 / 4 ; } .item:nth-child(3){ grid-area: 1 / 4 / 2 / 6; } .item:nth-child(4){ grid-area: 1 / 6 / 2 / 7; } .item:nth-child(5){ grid-area: 2 / 1 / 3 / 3; } .item:nth-child(6){ grid-area: 2 / 3 / 3 / 5; } .item:nth-child(7){ grid-area: 2 / 5 / 3 / 7; } |
Сетка для мониторов будет выглядеть так:
Внимательно посмотрите на индексы (номера) линий, и тогда станет понятно распределение столбцов и строк в ней для свойств grid-area
каждого grid-элемента с классом .item
.
Вот, что у нас получилось в результате:
See the Pen Grid areas by Elen (@ambassador) on CodePen.
Медиа-запросы для сетки
На данный момент важно, как мы можем перестроить столбцы и строки сетки для экранов планшетов и телефонов.
Поскольку в нашем примере максимальная ширина сетки составляет 1200px, то для экранов, которые меньше этого значения, нам придется перестроить сетку в 3 столбца. А количество строк мы можем сформировать с помощью значения minmax(225px, auto)
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @media (max-width: 1199.98px){ .grid-container { padding-left: 15px; padding-right: 15px; grid-template-columns: repeat(3, 1fr); grid-template-rows: minmax(225px, auto); } .grid-container > .item { grid-area: auto; } .item:nth-child(7){ grid-column-start: 2; grid-column-end: 3; } } |
Внешний вид сетки представлен на скриншоте ниже.
Для экранов планшетов мы уменьшим количество столбцов до 2-х:
1 2 3 4 5 6 7 8 9 | @media (max-width: 950px){ .grid-container { grid-template-columns: repeat(2, 1fr); } .item:nth-child(7){ grid-column-start: 1; grid-column-end: 3; } } |
Внешний вид сетки для планшетов теперь такой:
Для смартфонов уже привычной стала сетка из одной колонки, поэтому css-правила для экранов, меньших 525px, таковы:
1 2 3 4 5 6 7 8 9 | @media (max-width: 525px){ .grid-container { grid-template-rows: minmax(225px, auto); grid-template-columns: auto; } .item:nth-child(7){ grid-area: auto; } } |
Внешний вид нашего примера опять поменялся:
Пример grid-area с множеством столбцов и строк
Более сложный пример предполагает сетку из множества столбцов, которые распределяются по линиям сетки с помощью не только индексов, но и ключевого слова span и цифры, показывающих, сколько столбцов или строк объединяются в одну область.
See the Pen Grid Area with Span by Elen (@ambassador) on CodePen.
Пример использования grid-area с анимированными блоками
Автор Lisi
See the Pen Hover Card Interaction by Lisi (@lisilinhart) on CodePen.
Спасибо за статью. Нашел в ней ответі на некоторіе свои вопросі.
А можете написать статью про auto-flow и другие такие свойства? Не очень с ними понятно все.