CSS-свойства для grid-контейнера
В этом уроке мы изучим CSS-свойства, которые применяются к grid-контейнеру. Но перед этим давайте освежим в памяти, как вообще создается grid-контейнер и какие бывают его вариации.
Итак, для инициализации grid-контейнера необходимо применить к необходимому HTML-элементу свойство display
, указав одно из трех следующих значений:
grid
(создает блочный grid-контейнер);inline-grid
(создает строчный grid-контейнер);subgrid
(если ваш grid-контейнер сам по себе является grid-элементом, вы можете использовать это свойство, чтобы размеры его строк/столбцов были взяты из его родительского элемента).
.grid-container { display: grid; }
Обратите внимание: на grid-контейнер не оказывают влияния такие свойства, как float
, clear
, vertical-align
и column
.
Теперь рассмотрим специальные свойства для grid-контейнера:
- grid-template-rows, grid-template-columns
- grid-template-areas
- grid-template
- grid-row-gap, grid-column-gap
- grid-gap
- justify-items
- align-items
- justify-content
- align-content
- grid-auto-rows, grid-auto-columns
- grid-auto-flow
- grid
Свойства grid-template-rows и grid-template-columns
Данные свойства определяют размеры строк и столбцов сетки. В значениях указываются необходимые параметры через пробел, которые означают размеры каждого grid-пути, а между ними можно указывать названия grid-линий.
Значения:
- <длина-пути> — может быть указана в единицах измерения длины CSS, в процентах или же в виде доли свободного места в сетке (с использованием единицы
fr
(англ. fraction)); - <имя-линии> — произвольное имя на ваше усмотрение, заключенное в квадратные скобки.
Схема:
.grid-container { grid-template-rows: <длина-пути> ... или <имя-линии> <длина-пути> ...; grid-template-columns: <длина-пути> ... или <имя-линии> <длина-пути> ...; }
Пример 1
Если вы не указываете имена grid-линий между значениями grid-путей, то grid-линиям автоматически присваиваются числовые имена (1, 2, 3 и т. д.):
.grid-container { grid-template-rows: 50px auto 150px; grid-template-columns: 50px 100px auto 100px 50px; }
Пример 2
Вы можете явно указать имена grid-линий:
.grid-container { grid-template-rows: [row-line1] 50px [row-line2] auto [row-line3] 150px [row-last-line]; grid-template-columns: [col-line1] 50px [col-line2] 100px [col-line3] auto [col-line4] 100px [col-line5] 50px [col-last-line]; }
Пример 3
Grid-линия может иметь несколько имен одновременно! В примере ниже третьей grid-линии будет присвоено два имени — col-three
и the-end
:
.grid-container { grid-template-columns: [col-one] 50% [col-two] 50% [col-three the-end]; }
Пример 4
Если некоторые условия построения сетки повторяются, можно использовать функцию repeat()
для компактности и удобства. Например:
.grid-container { grid-template-columns: 40px [col-40] 40px [col-40] 40px [col-40] 10%; } /* код выше эквивалентен коду ниже */ .grid-container { grid-template-columns: repeat(3, 40px [col-40]) 10%; }
Пример 5
Единица fr
позволяет задать размер grid-пути в виде доли свободного пространства в grid-контейнере. Например, следующий код приведет к тому, что каждая колонка будет занимать ⅓ ширины grid-контейнера:
.grid-container { grid-template-columns: 1fr 1fr 1fr; }
Пример 6
Вычисление свободного пространства происходит только после применения фиксированных значений. В примере ниже общий объем свободного пространства, доступного для значений fr
, не включает в себя 70 пикселей:
.grid-container { grid-template-columns: 1fr 70px 1fr 1fr; }
Свойство grid-template-areas
Свойство grid-template-areas
определяет шаблон сетки, используя имена grid-областей, которые заданы с помощью свойства grid-area (данное свойство применяется к grid-элементам и рассматривается в следующем уроке). Количество повторов имени grid-области определяет, сколько grid-ячеек образует эта область. Точка обозначает пустую grid-ячейку. Сам синтаксис являет собой визуализацию структуры сетки.
Значения:
- <имя-области> — имя grid-области, заданное свойством
grid-area
; .
— точка, которая обозначает пустую grid-ячейку;none
— grid-области не определены.
Схема:
.grid-container { grid-template-areas: "<имя-области> или . или none или ..." "..."; }
Пример использования:
.grid-item-header { grid-area: header; } .grid-item-main { grid-area: main; } .grid-item-sidebar { grid-area: sidebar; } .grid-item-footer { grid-area: footer; } .grid-container { display: grid; grid-template-columns: repeat(5, 1fr); grid-template-rows: auto; grid-template-areas: "header header header header header" "main main main . sidebar" "footer footer footer footer footer"; }
Этот код определяет сетку с пятью столбцами и тремя строками. Ширина столбцов одинаковая — каждый занимает одну долю (1fr
) свободного пространства grid-контейнера. Вся верхняя строка является grid-областью с названием header
и содержит пять ячеек. Средняя строка включает в себя трехъячеечную grid-область main
, одну пустую ячейку и одноячеечную grid-область sidebar
. Последнюю строку полностью занимает grid-область footer
из пяти ячеек. Итоговая схема данной сетки выглядит так:
Важно: каждая строка в объявлении должна иметь одинаковое количество ячеек.
Для создания одной пустой grid-ячейки можно использовать любое количество точек, стоящих рядом. Иными словами, до тех пор, пока между этими точками нет пробелов, они будут представлять собой одну grid-ячейку.
Обратите внимание, что здесь вы не даете имена grid-линиям, а именуете только grid-области. При этом grid-линии на обоих концах grid-областей будут получать имена автоматически. К примеру, если grid-область называется header
, то начальная горизонтальная grid-линия и начальная вертикальная grid-линия получат имя header-start
, а конечная горизонтальная grid-линия и конечная вертикальная grid-линия получат имя header-end
. Таким образом некоторые grid-линии могут иметь несколько имен. В нашем примере выше крайняя левая grid-линия имеет три имени: header-start
, main-start
и footer-start
.
Свойство grid-template
Свойство grid-template
— это сокращенная запись, которая позволяет одновременно задать значения для свойств grid-template-rows
, grid-template-columns
и grid-template-areas
.
Значения:
none
— устанавливает исходные значения для всех трех свойств;- <grid-template-rows> / <grid-template-columns> — задает свойствам
grid-template-columns
иgrid-template-rows
соответствующие указанные значения, а свойствуgrid-template-areas
присваивает значениеnone
.
Схема:
.grid-container { grid-template: none или <grid-template-rows> / <grid-template-columns>; }
Также существует более сложный, но весьма удобный синтаксис для указания значений всех трех свойств. Примеры полной и сокращенной записи:
.grid-container { grid-template-rows: [row1-start] 100px [row1-end row2-start] 100px [row2-end]; grid-template-columns: auto 50px auto; grid-template-areas: "header header header" "footer footer footer"; } /* код выше эквивалентен коду ниже */ .grid-container { grid-template: [row1-start] "header header header" 100px [row1-end] [row2-start] "footer footer footer" 100px [row2-end] / auto 50px auto; }
Поскольку свойство grid-template
не сбрасывает неявные свойства сетки (grid-auto-columns
, grid-auto-rows
и grid-auto-flow
), при том, что в большинстве случаев вы захотите это сделать, рекомендуем использовать свойство grid
вместо grid-template
.
Свойства grid-row-gap и grid-column-gap
Данные свойства определяют размеры grid-линий. Вы можете думать об этом как об установке промежутков между строками и столбцами. Значение задается в любых доступных единицах измерения CSS:
.grid-container { grid-column-gap: 15px; grid-row-gap: 30px; }
Такие промежутки создаются только между строками/колонками, но не с внешних краев.
Свойство grid-gap
Как вы догадались, свойство grid-gap
представляет собой сокращенную запись свойств grid-row-gap
и grid-column-gap
. В значении указываются два параметра через пробел — сначала для промежутков между строками, затем для промежутков между столбцами:
.grid-container { grid-gap: 30px 15px; }
Если между строками и колонками планируются одинаковые промежутки, в значении свойства grid-gap
можно указать один параметр.
Свойство justify-items
Свойство justify-items
выравнивает содержимое внутри grid-элемента вдоль оси строки. Значение влияет на все grid-элементы контейнера.
Доступные значения:
stretch
(значение по умолчанию) — содержимое заполняет всю ширину grid-области;start
— содержимое прижимается к левому краю grid-области;end
— содержимое прижимается к правому краю grid-области;center
— содержимое выравнивается по центру grid-области.
Ниже — серия примеров с использованием разных значений свойства justify-items
:
.grid-container { justify-items: stretch; }
.grid-container { justify-items: start; }
.grid-container { justify-items: end; }
.grid-container { justify-items: center; }
Также можно задать выравнивание по оси строки для отдельных элементов сетки, используя свойство justify-self (мы рассмотрим его в следующем уроке).
Свойство align-items
Свойство align-items
выравнивает содержимое внутри grid-элемента вдоль оси столбца. Применяется ко всем grid-элементам контейнера.
Доступные значения:
stretch
(значение по умолчанию) — содержимое заполняет всю высоту grid-области;start
— содержимое прижимается к верхнему краю grid-области;end
— содержимое прижимается к нижнему краю grid-области;center
— содержимое выравнивается по центру grid-области.
.grid-container { align-items: stretch; }
.grid-container { align-items: start; }
.grid-container { align-items: end; }
.grid-container { align-items: center; }
Также можно задать выравнивание по оси столбца для отдельных элементов сетки, используя свойство align-self (будет рассмотрено в следующем уроке).
Свойство justify-content
Может случиться так, что общий размер сетки будет больше, чем размер grid-контейнера. Например, такое может произойти, если ширина всех grid-элементов является фиксированной (т. е. задана в таких единицах как px
). В этом случае вы можете установить выравнивание сетки в grid-контейнере с помощью свойства justify-content
. Это свойство выравнивает сетку вдоль оси строки.
Доступные значения:
stretch
— изменяет размеры grid-элементов так, чтобы сетка могла заполнить всю ширину grid-контейнера;start
— выравнивает сетку по левому краю grid-контейнера;end
— выравнивает сетку по правому краю grid-контейнера;center
— выравнивает сетку по центру grid-контейнера;space-around
— добавляет равное количество пространства между каждым grid-элементом, а по краям сетки оставляет половину этого пространства;space-between
— добавляет равное количество пространства между каждым grid-элементом, но по краям сетки не создает пространства;space-evenly
— добавляет равное количество пространства между каждым grid-элементом, включая края сетки.
.grid-container { justify-content: stretch; }
.grid-container { justify-content: start; }
.grid-container { justify-content: end; }
.grid-container { justify-content: center; }
.grid-container { justify-content: space-around; }
.grid-container { justify-content: space-between; }
.grid-container { justify-content: space-evenly; }
Свойство align-content
Данное свойство похоже на предыдущее, с той лишь разницей, что теперь выравнивание сетки происходит по оси столбца. Свойство align-content
принимает те же значения, что и justify-content
(вы можете посмотреть их выше). Мы не будем их дублировать, но упомянем об отличии значений start
и end
: если в случае со свойством justify-content
сетка выравнивается по левому (start) или правому (end) краю, то при использовании данных значений со свойством align-content
сетка будет выравниваться либо по верхнему краю grid-контейнера (start), либо по нижнему (end).
Свойства grid-auto-rows и grid-auto-columns
Данные свойства определяют размеры любых grid-путей, сгенерированных автоматически (неявных grid-путей). Неявные grid-пути создаются, когда вы явно задаете позицию строк и столбцов (через свойства grid-template-rows
и grid-template-columns
), которые находятся за пределами заданной сетки.
В качестве значения устанавливается размер пути в любых единицах измерения длины CSS, а также в процентах или долях свободного пространства fr
.
Чтобы понять, как создаются неявные grid-пути, взгляните на демонстрацию ниже:
.grid-container { grid-template-rows: 150px 150px; grid-template-columns: 250px 250px; }
Этот код создаст сетку 2×2. Но теперь представьте, что вы используете свойства grid-row и grid-column для размещения ваших grid-элементов следующим образом:
.item-a { grid-row: 2 / 3; grid-column: 1 / 2; } .item-b { grid-row: 2 / 3; grid-column: 5 / 6; }
Мы сказали элементу .item-b
начинаться в столбце 5 и заканчиваться в столбце 6, но мы никогда не создавали столбцы 5 и 6. Именно потому, что мы ссылаемся на несуществующие столбцы, появятся неявные grid-пути с шириной 0. И мы можем использовать свойства grid-auto-rows
и grid-auto-columns
для определения размеров этих неявных grid-путей:
.grid-container { grid-auto-columns: 250px; }
Свойство grid-auto-flow
Если у вас есть grid-элементы, которые вы не создавали явно, то сработает алгоритм автоматического размещения этих элементов. Свойство grid-auto-flow
позволяет управлять тем, как работает алгоритм авторазмещения.
Допустимые значения:
row
(значение по умолчанию) — говорит алгоритму авторазмещения заполнять каждую строку сетки поочередно, добавляя новые строки по мере необходимости;column
— говорит алгоритму авторазмещения заполнять каждый столбец сетки поочередно, добавляя новые столбцы по мере необходимости;dense
— говорит алгоритму авторазмещения попытаться заполнить ранее образовавшиеся промежутки в сетке, если появятся подходящие по размеру grid-элементы. Важно: это может привести к изменению порядка вывода элементов.
Например, взгляните на этот HTML-код:
<div class="grid-container"> <div class="item-a">item-a</div> <div class="item-b">item-b</div> <div class="item-c">item-c</div> <div class="item-d">item-d</div> <div class="item-e">item-e</div> </div>
Мы определяем сетку с двумя строками и пятью столбцами и задаем свойство grid-auto-flow
со значением row
:
.grid-container { display: grid; grid-template-rows: 150px 150px; grid-template-columns: 250px 250px 250px 250px 250px; grid-auto-flow: row; }
При размещении элементов в сетке укажем позиции только для двух из них:
.item-a { grid-column: 1; grid-row: 1 / 3; } .item-e { grid-column: 5; grid-row: 1 / 3; }
Поскольку мы установили значение row
для свойства grid-auto-flow
, наша сетка будет выглядеть так. Обратите внимание, как три элемента, которые мы не размещали (.item-b
, .item-c
и .item-d
), размещаются в строках самостоятельно:
И, соответственно, если мы зададим для свойства grid-auto-flow
значение column
, то элементы .item-b
, .item-c
и .item-d
разместятся в столбцах:
.grid-container { display: grid; grid-template-rows: 150px 150px; grid-template-columns: 250px 250px 250px 250px 250px; grid-auto-flow: column; }
Свойство grid
Наконец, мы дошли до последнего свойства в списке. Итак, свойство grid
— это краткая запись, позволяющая в одной строке определить следующие свойства:
grid-template-rows
grid-template-columns
grid-template-areas
grid-auto-rows
grid-auto-columns
grid-auto-flow
Также свойство grid
устанавливает исходные значения для свойств grid-column-gap
и grid-row-gap
, даже если они не заданы явно в данном свойстве.
Значения:
none
— устанавливает значения по умолчанию для всех свойств;- <grid-template-rows> / <grid-template-columns> — устанавливает указанные значения для свойств
grid-template-rows
иgrid-template-columns
соответственно, а также задает значения по умолчанию для других свойств; - <grid-auto-flow> [<grid-auto-rows> [ / <grid-auto-columns>] ] — устанавливает указанные значения для свойств
grid-auto-flow
,grid-auto-rows
иgrid-auto-columns
соответственно. Если значение для свойстваgrid-auto-columns
не задано, то ему задается значение, установленное дляgrid-auto-rows
. Если значения не заданы для обоих свойств, устанавливаются значения по умолчанию.
Схема:
.grid-container { grid: none или <grid-template-rows> / <grid-template-columns> или <grid-auto-flow> [<grid-auto-rows> [/ <grid-auto-columns>]]; }
Пример
Следующие блоки CSS-кода идентичны по своему действию:
.grid-container { grid-template-rows: 150px auto; grid-template-columns: 1fr auto 1fr; grid-template-areas: none; } /* код выше эквивалентен коду ниже */ .grid-container { grid: 150px auto / 1fr auto 1fr; }
Следующая пара также эквивалентна:
.grid-container { grid-auto-flow: column; grid-auto-rows: 1fr; grid-auto-columns: auto; } /* код выше эквивалентен коду ниже */ .grid-container { grid: column 1fr / auto; }
Свойство grid
также понимает более сложный, но удобный синтаксис для установки всех параметров сразу. Вы определяете свойства grid-template-areas
, grid-template-rows
и grid-template-columns
, а для всех остальных свойств устанавливаются их значения по умолчанию. Иными словами, вы определяете имена grid-линий, размеры grid-путей и шаблон сетки. Это проще описать на примере:
.grid-container { grid-template-areas: "header header header" "footer footer footer"; grid-template-rows: [row1-start] 1fr [row1-end row2-start] 30px [row2-end]; grid-template-columns: auto 65px auto; } /* код выше эквивалентен коду ниже */ .grid-container { grid: [row1-start] "header header header" 1fr [row1-end] [row2-start] "footer footer footer" 30px [row2-end] / auto 65px auto; }
Далее в учебнике: свойства для grid-элементов.