CSS Grid — це техніка в каскадних таблицях стилів, що дозволяє веброзробникам створювати складні адаптивні макети вебдизайну більш легко і послідовно у різних вебпереглядачах. Є й інші методи макета вебсторінок, що використовувались раніше, включаючи tables, CSS Box model та CSS Flexbox.
CSS Grid — це модель шаблону, оптимізована для двовимірних шаблонів. Використовується як модель для шаблонів вебсайтів, форм, галерей і всього, що вимагає точного та уважного позиціювання. Сітки CSS це новий підхід до створення адаптивних сайтів з великою кількістю блоків, розташованих в будь-яких місцях сайту. Крім CSS Grid існує також технологія Flexbox, яка дуже схожа з CSS Grid.
Grid модуль в CSS був розроблений CSS Working Group для того, щоб надати найкращий спосіб створення шаблонів в CSS. Він потрапив в W3C Candidate Recommendation в лютому 2017 року, а основні браузери почали його підтримку в березні 2017 року. Використовується для front-end розробки. Дана технологія має потужний функціонал та інтуїтивно зрозумілий синтаксис, а шаблони на grid безсумнівно змінюватимуть те, на чому створюється Web[1].
CSS Grid можна назвати поліпшеною версією Flexbox, адже Flexbox дозволяє працювати лише в одній площині: або створювати стовпці, або створювати рядки.
CSS Grid дозволяє робити більше, так як дана технологія працює в обох площинах одночасно. Таким чином, створення адаптивних блоків сайту відбувається простіше, а можливості для розташування об'єктів збільшуються.
Станом на березень 2017 року більшість браузерів постачали безпрефіксну підтримку CSS Grid: Chrome (включаючи Android), Firefox, Safari (включаючи iOS) та Opera. Internet Explorer 10 та 11, з іншого боку, підтримують його стару реалізацію із застарілим синтаксисом. Всі сучасні браузери для мобільних пристроїв підтримують CSS Grid, окрім браузерів Opera mini та UC.
Алгоритм дій роботи з CSS Grid є наступним:
display: grid
;Кожному блоку можна встановлювати ширину, висоту та його розташування. Блоки, які створюються на основі сіток, відразу мають адаптивний дизайн, який підлаштовує блоки під різні розширення екранів, що дозволяє зменшувати кількість написаного коду.
Під час роботи з CSS Grid розробник працює з Grid Layout, застосовуючи правила CSS як для батьківського (parent) елемента (який стає Grid Container), так і до дочірніх (children) елементів (які стають елементами Grid).
Макет сітки CSS має такі особливості:
z-index
.До Grid container застосовується display: grid
. Це прямий батьківський (parent) елемент для всіх елементів сітки.
<div class="container">
<div class="item item-1"></div>
<div class="item item-2"></div>
<div class="item item-3"></div>
</div>
Тут item — це елемент сітки, але не sub-item.
<div class="container">
<div class="item"></div>
<div class="item">
<p class="sub-item"></p>
</div>
<div class="item"></div>
</div>
Grid-лінії формують структуру контейнера. Автор може задати для елемента ім'я або числовий індекс, які може використовувати далі в стилях. Нумерація починається з одиниці.
Елемент grid line сприйнятливий до режиму написання, який використовується на вашому ресурсі. Наприклад, якщо ви використовуєте арабську мову або будь-який іншу мову, у якої режим написання справа наліво, то нумерація ліній буде починатися з правого боку.
До grid lines можна прив'язувати grid-елементи — і за номерами, і по іменах, як зручніше.
Grid-області — прямокутники з M × N суміжних grid-осередків (1 × 1 і більше). Кожна grid-область обмежена двома парами grid-ліній (парою вертикальних і парою горизонтальних). У них і розміщуються grid-елементи. Grid-областям теж можна задавати імена.
.container {
grid-column-gap: 10px;
grid-row-gap: 15px;
}
В CSS Grid можна розміщувати елементи, використовуючи номери рядків. Є можливість іменувати рядки, використовуючи grid-area
, а також можливість прив'язки до області Grid.
.wrapper {
display: grid;
grid-template-areas:
"a a b"
"a a b"
"c d d";
}
.item1 {grid-area: a;}
.item2 {grid-area: b;}
.item2 {grid-area: c;}
.item2 {grid-area: d;}
Сітку в Grid можна створювати з фіксованими розмірами («px»), відносними розмірами («em», «rem»), а також задаючи гнучкі розміри — '%' або 'fr' (fraction). Нова одиниця розраховується самостійно.
Наприклад, якщо доступне місце становить 900 px, і при цьому першому елементу дістається одна частка, а другому — дві, то перший отримує 1/3, а другий — 2/3 від 900 px.
<div class="grid">
<div class="box item1">Item 1</div>
<div class="box item2">Item 2</div>
<div class="box item3">Item 3</div>
<div class="box item4">Item 4</div>
</div>
.grid {
display: grid;
grid-gap:20px;
grid-template: 100px auto 100px /1fr 80px 3fr 20%;;
}
Великі grid-сітки з багатьма смугами можуть використовувати значення repeat()
для скорочення при визначенні стовпчиків:
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
Також може бути записано як:
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
Значення repeat може використовуватись лише для частини стовпчиків. В наступному прикладі ініційовано смугу 20рх, секцію з 6 смуг шириною 1fr, і смугу 20рх.
.wrapper {
display: grid;
grid-template-columns: 20px repeat(6, 1fr) 20px;
}
Значення repeat визначає смуги, тобто його можливо використовувати для створення цілих шаблонів стовпчиків. В наступному прикладі grid-сітка складається з 10 смуг. Смуга 1fr, смуга 2fr і так п'ять разів.
.wrapper {
display: grid;
grid-template-columns: repeat(5, 1fr 2fr);
}
При роботі з Grid є дві осі для вирівнювання елементів.
Коли розробник використовує властивості align-self
і align-items
, змінюється вирівнювання елемента в області сітки, яку помістили. Властивість align-items
встановлює властивість align-self
для всіх дочірніх елементів сітки. Це означає, що можна встановити властивість індивідуально, використовуючи align-self
по елементу сітки.
Елементи управління justify-items
і justify-self
на осі row / inline:
<div class="grid">
<div class="box item1">Item 1</div>
<div class="box item2">Item 2</div>
<div class="box item3">Item 3</div>
<div class="box item4">Item 4</div>
</div>
.grid {
display: grid;
grid-gap:20px;
grid-template: 100px auto 100px / 1fr 1fr 1fr 1fr;
align-items: stretch;
}
.item1 {
background: #f00;
align-self: end;
}
.item2 {
background: #f0f;
align-self: flex-start;
}
.item3 {
background: #008000;
align-self: end;
}
.item4 {
background: #000;
}
grid-auto-rows
та grid-auto-columns
[3].В прикладі нижче використовується grid-auto-rows
щоб забезпечити неявне створення смуги висотою 200рх.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 200px;
}
Встановлюючи явну grid-сітку або визначаючи розміри для автоматично створених рядків або стовпчиків може виникнути необхідність надання смугам мінімального розміру. Але треба переконатись що розширюючись, вони відповідатимуть будь-якому доданому контенту. Наприклад, для того, щоб рядки ніколи не були менше 100рх, але якщо контент розширюється до 300рх, необхідно зробити, щоб рядок розширився до такої висоти.
Grid для таких випадків має функцію minmax()
. В наступному прикладі використовується minmax()
в значенні grid-auto-rows
. Це означає, що автоматично створені рядки матимуть мінімальну висоту 100рх, а максимальна встановлена в auto. Використання auto означає, що розмір підлаштовується під розмір контенту таким чином, щоб вмістити найвищий елемент в цьому рядку.
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: minmax(100px, auto);
}
<div class="wrapper">
<div>One</div>
<div>Two
<p>I have some more content in.</p>
<p>This makes me taller than 100 pixels.</p>
</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
Grid-елементи можуть ставати Grid-контейнерами. У прикладі створено Grid-сітку з трьох стовпчиків з двома позиційованими елементами. Перший з них має піделементи. Оскільки ці елементи не є прямими нащадками, вони не беруть участі в Grid-розкладці і відображаються в нормальному потоці.
<div class="wrapper">
<div class="box box1">
<div class="nested">a</div>
<div class="nested">b</div>
<div class="nested">c</div>
</div>
<div class="box box2">Two</div>
<div class="box box3">Three</div>
<div class="box box4">Four</div>
<div class="box box5">Five</div>
</div>
Якщо застосувати display: grid
до box1, то ця Grid-смуга також стане Grid-сіткою. А елементи, що в ній містяться, надалі розташовуватимуться на цій новій Grid-сітці.
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
display: grid;
grid-template-columns: repeat(3, 1fr);
}
В цьому випадку, дочірня сітка немає відношення до батьківської. Як ви можете бачити на прикладі, вона не наслідує батьківський grid-gap
, а також лінії дочірньої сітки не вирівнюються по лініях батьківської сітки.
Grid-елементи можуть займати одну і ту ж саму клітинку.
<div class="wrapper">
<div class="box box1">One</div>
<div class="box box2">Two</div>
<div class="box box3">Three</div>
<div class="box box4">Four</div>
<div class="box box5">Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
}
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
}
.box2 {
grid-column-start: 1;
grid-row-start: 2;
grid-row-end: 4;
}
Елемент box2 тепер перекриває box1, він відображається зверху, тому що пізніше трапляється в коді документу.
Для контролювання порядку, в якому елементи накладаються один на одного, використовується властивість z-index
. Якщо надати box2 нижчий z-index
, ніж в box1, то він і буде показаний нижче у стеку.
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
}
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
z-index: 2;
}
.box2 {
grid-column-start: 1;
grid-row-start: 2;
grid-row-end: 4;
z-index: 1;
}