Темная тема
Grid Layout
Что такое Grid Layout?
Grid Layout - это способ создания двухмерных макетов на веб-страницах (в виде сетки).
В отличие от Flexbox, который лучше подходит для одномерных (в строку или в столбец) размещений, Grid позволяет размечать строки и столбцы одновременно.
Создание grid-контейнера
display: grid
- grid-контейнер;
Например:
html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
css
body {
padding: 20px;
}
.container {
display: grid;
grid-template-columns: 100px 1fr 2fr;
gap: 10px;
}
.item {
background: lightblue;
padding: 20px;
}
Строки и столбцы
grid-template-columns
- определяет количество и размеры столбцов;grid-template-rows
- определяет количество и размеры строк;grid
- сокращенная запись;grid: 100px 100px 100px / 50px 50px;
- 3 столбца, 2 строки;
Например:
html
<div class="grid-container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
</div>
css
.grid-container {
display: grid;
grid-template-columns: 100px 1fr 2fr;
grid-template-rows: 100px auto;
gap: 10px;
padding: 20px;
background: #eee;
}
.item {
background: #3498db;
color: white;
padding: 10px;
font-size: 1.2rem;
text-align: center;
}
Размеры и repeat
fr
- доля свободного пространства в контейнере;auto
- размер колонки зависит от содержимого;repeat()
- сокращенная запись размеров;
Например:
html
<div class="grid-1">
<div class="cell">1</div>
<div class="cell">2</div>
<div class="cell">3</div>
<div class="cell">4</div>
</div>
<div class="grid-2">
<div class="cell">1</div>
<div class="cell">2</div>
<div class="cell">3</div>
<div class="cell">4</div>
</div>
css
body {
padding: 10px;
background: #eee;
}
.grid-1 {
margin: 10px;
padding: 10px;
display: grid;
grid-template-columns: auto 1fr 2fr 100px;
gap: 10px;
background: white;
}
.grid-2 {
margin: 10px;
padding: 10px;
display: grid;
grid-template-columns: repeat(2, 1fr) 50px 2fr;
gap: 20px;
background: white;
}
.cell {
background: steelblue;
color: white;
padding: 20px;
text-align: center;
}
Именованные области
grid-template-areas
- задаёт именованные области;
Например:
html
<div class="grid-areas">
<div class="header">Header</div>
<div class="sidebar">Sidebar</div>
<div class="main">Main</div>
<div class="footer">Footer</div>
</div>
css
* {
margin: 0;
padding: 0;
text-align: center;
}
.grid-areas {
display: grid;
grid-template-areas:
'header header'
'sidebar main'
'footer footer';
grid-template-columns: 1fr 3fr;
grid-template-rows: auto 1fr auto;
gap: 10px;
height: 100vh;
}
.header {
grid-area: header;
background: #6c5ce7;
color: #fff;
height: 50px;
}
.sidebar {
grid-area: sidebar;
background: #00cec9;
color: #fff;
}
.main {
grid-area: main;
background: #0984e3;
color: #fff;
}
.footer {
grid-area: footer;
background: #2d3436;
color: #fff;
height: 50px;
}
Именованные линии
Линии - это границы между колонками и строками.
Например:
html
<div class="grid">
<div class="item a">A</div>
<div class="item b">B</div>
<div class="item c">C</div>
</div>
css
body {
font-family: sans-serif;
background: #ddd;
padding: 10px;
}
.grid {
display: grid;
grid-template-columns: [left] 1fr [middle] 2fr [right];
grid-template-rows: [top] 80px [center] 150px [bottom];
gap: 10px;
background: #f5f5f5;
padding: 10px;
border-radius: 10px;
}
.item {
background: steelblue;
color: white;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
border-radius: 6px;
padding: 20px;
}
.a {
grid-column: left / middle;
grid-row: top / span 1;
}
.b {
grid-column: middle / right;
grid-row: center / bottom;
}
.c {
grid-column: left / right;
grid-row: bottom / span 1;
}
Положение элемента в сетке
grid-column
положение элемента в сетке по столбцам;grid-column: 1 / 4;
- элемент займёт пространство с 1 до 4 столбца;grid-column: span 3;
- элемент займёт пространство с 1 до 4 столбца;
grid-row
- положение элемента в сетке по строкам;grid-area
- положение элемента по столбцам и строкам;grid-area: 1 / 1 / 3 / 3;
- с 1 строки, 1 столбца, до 3 строки, 3 столбца;
Например:
html
<div class="grid-pos">
<div class="box a">A</div>
<div class="box b">B</div>
</div>
css
.grid-pos {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
grid-template-rows: 100px 100px 100px;
gap: 10px;
}
.box {
background: coral;
color: white;
display: flex;
align-items: center;
justify-content: center;
}
.a {
grid-column: 1 / 4;
grid-row: 1 / 2;
}
.b {
grid-column: 2 / 5;
grid-row: 2 / 4;
}
Отступы между ячейками
column-gap
- задает отступы между ячейками в столбцах;row-gap
- задает отступы между ячейками в строках;gap
- задает отступы между ячейками в столбцах и строках;
Например:
html
<div class="grid gap-example">
<div class="cell">1</div>
<div class="cell">2</div>
<div class="cell">3</div>
<div class="cell">4</div>
<div class="cell">5</div>
<div class="cell">6</div>
</div>
css
.grid {
border: 1px dashed #888;
padding: 10px;
}
.gap-example {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 80px 80px;
column-gap: 10px;
row-gap: 20px;
}
.cell {
background: #74b9ff;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.5rem;
}
Выравнивание содержимого ячеек
align-items
- вертикальное выравнивание внутри ячеек;justify-items
- горизонтальное выравнивание внутри ячеек;place-items
- вертикальное и горизонтальное выравнивание;
Доступные значения:
stretch
- растягивание по размеру ячеек (по умолчанию);start
- выравнивание по началу;center
- по центру;end
- по концу;
Например:
html
<h3>align-items: center</h3>
<div class="grid align-grid">
<div class="cell">A</div>
<div class="cell">B</div>
<div class="cell">C</div>
</div>
<h3>justify-items: end</h3>
<div class="grid justify-grid">
<div class="cell">A</div>
<div class="cell">B</div>
<div class="cell">C</div>
</div>
<h3>place-items: center</h3>
<div class="grid place-grid">
<div class="cell">A</div>
<div class="cell">B</div>
<div class="cell">C</div>
</div>
css
body {
font-family: sans-serif;
padding: 20px;
background: #f8f8f8;
}
.grid {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 120px;
gap: 10px;
background: #eee;
margin-bottom: 30px;
border: 2px dashed #ccc;
}
.cell {
background: #74b9ff;
color: #fff;
font-weight: bold;
font-size: 1.5rem;
padding: 10px;
border-radius: 4px;
}
.align-grid {
align-items: center;
}
.justify-grid {
justify-items: end;
}
.place-grid {
place-items: center;
}
Выравнивание сетки
align-content
- выравнивание сетки по вертикали внутри контейнера;justify-content
- выравнивание сетки по горизонтали;place-content
- выравнивание по вертикали и горизонтали;
Доступные значения:
flex-start
илиstart
- элементы прижаты к началу;flex-end
илиend
- элементы прижаты к концу;center
- выровнены по центру;space-between
- первый - у начала, последний - у конца, остальные - между;space-around
- равные отступы вокруг каждого элемента;space-evenly
- равные отступы вокруг каждого элемента и краями;stretch
- растягивает элементы;
Например:
html
<h3>align-content: center</h3>
<div class="wrapper">
<div class="grid align-content">
<div class="cell">1</div>
<div class="cell">2</div>
<div class="cell">3</div>
<div class="cell">4</div>
<div class="cell">5</div>
<div class="cell">6</div>
</div>
</div>
<h3>justify-content: space-evenly</h3>
<div class="wrapper">
<div class="grid justify-content">
<div class="cell">A</div>
<div class="cell">B</div>
<div class="cell">C</div>
<div class="cell">D</div>
<div class="cell">E</div>
<div class="cell">F</div>
</div>
</div>
<h3>place-content: center</h3>
<div class="wrapper">
<div class="grid place-content">
<div class="cell">Я</div>
<div class="cell">в</div>
<div class="cell">центре</div>
<div class="cell">по</div>
<div class="cell">всем</div>
<div class="cell">осям</div>
</div>
</div>
css
body {
font-family: sans-serif;
padding: 20px;
background: #f0f0f0;
}
.wrapper {
height: 200px;
border: 2px dashed #ccc;
background: #fff;
}
.grid {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 40px 40px;
gap: 10px;
height: 100%;
}
.cell {
background: #0984e3;
color: white;
display: flex;
justify-content: center;
align-items: center;
font-weight: bold;
border-radius: 6px;
}
.align-content {
align-content: center;
}
.justify-content {
justify-content: space-evenly;
}
.place-content {
place-content: center;
}
Направление и порядок элементов
grid-auto-flow
- управление направлением элементов;row
- размещает элементы по строкам (по умолчанию);column
- размещает элементы по столбцам;row dense
- "уплотнение" элементов по строкам;column dense
- "уплотнение" элементов по столбцам;
Например:
html
<div class="example">
<h3>grid-auto-flow: row (по умолчанию)</h3>
<div class="grid row">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>
</div>
<div class="example">
<h3>grid-auto-flow: column</h3>
<div class="grid column">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>
</div>
<div class="example">
<h3>grid-auto-flow: row dense</h3>
<div class="grid row-dense">
<div>1</div>
<div>2</div>
<div class="wide">3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>
</div>
<div class="example">
<h3>grid-auto-flow: column dense</h3>
<div class="grid column-dense">
<div>1</div>
<div>2</div>
<div class="wide">3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>
</div>
css
body {
font-family: sans-serif;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20px;
padding: 20px;
}
.example {
border: 2px dashed #ccc;
padding: 10px;
}
h3 {
margin: 10px 0;
font-size: 1rem;
}
.grid {
display: grid;
grid-template-columns: repeat(3, 60px);
grid-template-rows: repeat(3, 60px);
gap: 5px;
background: #eee;
}
.grid div {
background: steelblue;
color: white;
font-weight: bold;
}
.row {
grid-auto-flow: row;
}
.column {
grid-auto-flow: column;
}
.row-dense {
grid-auto-flow: row dense;
}
.column-dense {
grid-auto-flow: column dense;
}
.wide {
grid-column: span 2;
}