148 lines
9.0 KiB
Markdown
148 lines
9.0 KiB
Markdown
|
---
|
|||
|
title: Grid Layout
|
|||
|
localeTitle: Макет сетки
|
|||
|
---
|
|||
|
## Макет сетки
|
|||
|
|
|||
|
CSS Grid Layout, просто называемый Grid, представляет собой схему компоновки, которая является самой новой и самой мощной в CSS. Он [поддерживается всеми основными браузерами](https://caniuse.com/#feat=css-grid) и позволяет размещать элементы на странице и перемещать их.
|
|||
|
|
|||
|
Он может автоматически назначать элементы для _областей_ , их размер и изменять их размер, заботиться о создании столбцов и строк на основе шаблона, который вы определяете, и выполнять все вычисления с использованием вновь введенной единицы `fr` .
|
|||
|
|
|||
|
### Почему сетка?
|
|||
|
|
|||
|
* Вы можете легко иметь 12-колонную сетку с одной строкой CSS. `grid-template-columns: repeat(12, 1fr)`
|
|||
|
* Сетка позволяет перемещать вещи в любом направлении. В отличие от Flex, где вы можете перемещать объекты горизонтально ( `flex-direction: row` ) или вертикально ( `flex-direction: column` ) - не одновременно одновременно, сетка позволяет перемещать любой _элемент сетки_ в любую предопределенную _область сетки_ на странице. Перемещаемые предметы не должны быть смежными.
|
|||
|
* С помощью CSS Grid вы можете **изменить порядок элементов HTML, используя только CSS** . Переместите что-то сверху вниз, переместите элементы, которые были в нижнем колонтитуле, на боковую панель и т. Д. Вместо того, чтобы перемещать `<div>` с `<footer>` на `<aside>` в HTML, вы можете просто изменить его размещение с `grid-area` в области CSS stylesheet.
|
|||
|
|
|||
|
### Сетка против Flex
|
|||
|
|
|||
|
* Flex является одномерным - горизонтальным или вертикальным, а сетка двумерная, то есть вы можете перемещать элементы как в горизонтальной, так и в вертикальной плоскостях
|
|||
|
* В Grid мы применяем стили макета к родительскому контейнеру, а не к элементам. Flex, с другой стороны, нацеливается на элемент flex для установки таких свойств, как `flex-basis` , `flex-grow` и `flex-shrink`
|
|||
|
* Grid и Flex не являются взаимоисключающими. Вы можете использовать оба проекта в одном проекте.
|
|||
|
|
|||
|
### Проверка совместимости браузера с `@supports`
|
|||
|
|
|||
|
В идеале, когда вы строите сайт, вы создаете его с помощью Grid и используете Flex как резерв. Вы можете узнать, поддерживает ли ваш браузер сетку с `@support` CSS `@support` (например, запрос функции). Вот пример:
|
|||
|
|
|||
|
```css
|
|||
|
.container {
|
|||
|
display: grid; /* display grid by default */
|
|||
|
}
|
|||
|
|
|||
|
@supports not (display: grid) { /* if grid is not supported by the browser */
|
|||
|
.container {
|
|||
|
display: flex; /* display flex instead of grid */
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### Начиная
|
|||
|
|
|||
|
Чтобы сделать любой элемент сеткой, вам нужно назначить его свойство `display` `grid` , например:
|
|||
|
|
|||
|
```css
|
|||
|
.conatiner {
|
|||
|
display: grid;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Вот и все. Вы просто сделали ваш `.container` сеткой. Каждый элемент внутри `.container` автоматически становится элементом сетки.
|
|||
|
|
|||
|
### Определение шаблонов
|
|||
|
|
|||
|
Строки и столбцы
|
|||
|
|
|||
|
```css
|
|||
|
grid-template-columns: 1fr 1fr 1fr 1fr;
|
|||
|
grid-template-rows: auto 300px;
|
|||
|
```
|
|||
|
|
|||
|
районы
|
|||
|
|
|||
|
```css
|
|||
|
grid-template-areas:
|
|||
|
"aaaa"
|
|||
|
"bcde"
|
|||
|
"bcde"
|
|||
|
"ffff";
|
|||
|
```
|
|||
|
|
|||
|
или
|
|||
|
|
|||
|
```css
|
|||
|
grid-template-areas:
|
|||
|
"header header header header"
|
|||
|
"nav main main sidebar";
|
|||
|
```
|
|||
|
|
|||
|
### Сетки
|
|||
|
|
|||
|
Вот пример кода для определения и назначения областей сетки
|
|||
|
|
|||
|
```css
|
|||
|
.site {
|
|||
|
display: grid;
|
|||
|
grid-template-areas: /* applied to grid container */
|
|||
|
"head head" /* you're assigning cells to areas by giving the cells an area name */
|
|||
|
"nav main" /* how many values kind of depends on how many cells you have in the grid */
|
|||
|
"nav foot";
|
|||
|
}
|
|||
|
|
|||
|
.site > header {
|
|||
|
grid-area: head;
|
|||
|
}
|
|||
|
|
|||
|
.site > nav {
|
|||
|
grid-area: nav;
|
|||
|
}
|
|||
|
|
|||
|
.site > main {
|
|||
|
grid-area: main;
|
|||
|
}
|
|||
|
|
|||
|
.site > footer {
|
|||
|
grid-area: foot;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### Блок `fr`
|
|||
|
|
|||
|
Grid представляет новый блок `fr` , который обозначает _фракцию_ . Хорошая вещь об использовании блока `fr` заключается в том, что он заботится о вычислениях для вас. Использование `fr` позволяет избежать проблем с запасом и заполнением. С `%` и `em` и т. Д. Он становится математическим уравнением при расчете `grid-gap` . Если вы используете блок `fr` , он автоматически рассчитает размеры столбцов и желобов и соответствующим образом изменит размер столбцов, а также не будет недостатков кровотечения в конце.
|
|||
|
|
|||
|
### Примеры
|
|||
|
|
|||
|
#### Изменение порядка элементов на основе размера экрана
|
|||
|
|
|||
|
Предположим, вы хотите переместить нижний колонтитул снизу на маленькие экраны и вправо на больших экранах, и между ними есть куча других элементов HTML.
|
|||
|
|
|||
|
Простым решением является изменение `grid-template-areas` на основе размера экрана. Вы также можете **изменить количество столбцов и строк на основе размера экрана** . Это намного более простая и простая альтернатива сетке Bootstrap ( `col-xs-8 col-sm-6 col-md-4 col-lg-3` ).
|
|||
|
|
|||
|
```css
|
|||
|
.site {
|
|||
|
display: grid;
|
|||
|
grid-template-columns: 1fr 1fr;
|
|||
|
grid-template-areas:
|
|||
|
"title title"
|
|||
|
"main header"
|
|||
|
"main sidebar"
|
|||
|
}
|
|||
|
|
|||
|
@media screen and (min-width: 34em) { /* If the screen is big enough, use a different template for grid areas */
|
|||
|
.site {
|
|||
|
grid-template-columns: 2fr 1fr 1fr;
|
|||
|
grid-template-areas:
|
|||
|
"title title title"
|
|||
|
"main header header"
|
|||
|
"main sidebar footer"
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
См. Таблицу [CSS](https://codepen.io/aamnah/pen/RLVVoE/) Pen [Grid на примере - 2 (области сетки + сетчатый пробел)](https://codepen.io/aamnah/pen/RLVVoE/) Aamnah Akram ( [@aamnah](https://codepen.io/aamnah) ) на [CodePen](https://codepen.io) .
|
|||
|
|
|||
|
#### Дополнительная информация:
|
|||
|
|
|||
|
* [CSS Grid Palyground от Mozilla](https://mozilladevelopers.github.io/playground/) Отличная отправная точка, если вы новичок в CSS-сетках. Он имеет визуальные эффекты, которые помогут вам легко понять терминологию
|
|||
|
* [YouTube: Мортен Рэнд-Хендриксен: CSS-сетка меняет все (о](https://www.youtube.com/watch?v=txZq7Laz7_4) макетах в [Интернете).](https://www.youtube.com/watch?v=txZq7Laz7_4) Эта презентация проведет вас менее чем за час, почему CSS-сетки классные и почему / как вы должны их использовать
|
|||
|
* [Видео: Изучите серию видеорекламы сетки Рэйчел Эндрю](https://gridbyexample.com/video/) Рэйчел Эндрю считается экспертом по этому вопросу. Названия видео могут выглядеть чужими и подавляющими, но содержание короткое и точное
|
|||
|
* [Книга: готовьтесь к компоновке сетки CSS от Rachel Andrew](https://abookapart.com/products/get-ready-for-css-grid-layout)
|