Обзор CSS Grid – технологии для упрощения разметки HTML-страниц
Появившись в 2011 году, технология CSS Grid продолжает вызывать все больше интереса. Эта статья — небольшое руководство по технологии с кратким описанием самых интересных возможностей и функций. Она будет полезна фронт-енд разработчикам, а также другим специалистам веб-разработки и дизайна.
Спецификация CSS Grid полностью меняет подход к разработке пользовательских интерфейсов, позволяя менять расположение grid-элементов, не затрагивая HTML.
Технология разрабатывалась более 5 лет и начала поддерживаться современными браузерами в середине 2017 года. CSS Grid упрощает описание разметки страницы, делая вёрстку HTML-страниц более адаптивной и простой.
Что такое Grid. Основные термины
Grid коренным образом меняет процесс создания адаптивных интерфейсов, включая:
- фиксированные и гибкие размеры полос;
- расположение элемента;
- управление выравниванием;
- управление перекрывающимся контентом.
Прежде чем приступать к работе с CSS Grid, нужно разобраться с основными терминами. На основе этих терминов построена вся спецификация. Каждый элемент тесно связан друг с другом и отвечает за определенную часть grid-контейнера.
Grid container (грид-контейнер) — это набор пересекающихся горизонтальных и вертикальных grid-линий, которые делят пространство на grid-области, в которые могут быть помещены grid-элементы. Внутри grid-контейнера есть два набора grid-линий: один определяет ось столбцов, другой определяет ось строк.
К Grid container применяется display: grid. Это прямой родитель для всех элементов сетки.
<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 lines (грид-линии) — это горизонтальные и вертикальные разделители grid-контейнера. Эти линии находятся по обе стороны от столбца или строки.
Грид-линии формируют структуру контейнера. Автор может задать для элемента имя или числовой индекс, которые может использовать дальше в стилях. Нумерация начинается с единицы.
Элемент Grid line восприимчив к режиму написания, который используется на вашем ресурсе. Например, если вы используете арабский язык или любой другой язык, у которого режим написания справа налево, то нумерация линий будет начинаться с правой стороны.
К грид-линиям можно привязывать грид-элементы — и по номерам, и по именам, как удобнее.
Грид-полосы — то, что ограничено парой соседних грид-линий. Вертикальные грид-полосы — это колонки грида (аналог столбцов таблицы), горизонтальные — ряды (аналог строк).
Grid cell — это наименьшая неделимая единица grid-контейнера, на которую можно ссылаться при позиционировании grid-элементов. Образуется на пересечении grid-строки (ряда) и grid-колонки.Аналог ячейки таблицы.
Grid area (грид-области) — это пространство внутри grid контейнера, в которое может быть помещен один или больше grid элементов. Этот элемент может состоять из одной или более grid ячеек.
Грид-области — прямоугольники из M×N смежных грид-ячеек (1×1 и больше). Каждая грид-область ограничена двумя парами грид-линий (парой вертикальных и парой горизонтальных). В них и размещаются грид-элементы.
Грид-областям тоже можно задавать имена.
Grid track (грид-интервалы) — это пространство между двумя смежными grid-линиями, вертикальными или горизонтальными. Аналог border-spacing в таблице.
.container { grid-column-gap: 10px; grid-row-gap: 15px; }
Различие Grid и Flexbox
Flexbox позволяет управлять элементами в одномерном пространстве.
Grid же — это двухмерный массив (в котором используются колонки и строки).
Это дает нам массу преимуществ по адаптивной трансформации и перестроению.
.grid { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; grid-template-rows: 100px auto 100px; }
Сокращенная запись (rows / column).
.grid { grid-template: 100px auto 100px / 1fr 1fr 1fr 1fr; }
See the Pen codepen.io/sukhachov/pen/XYjZQj">Grid template 01 by Yaroslav (codepen.io/sukhachov">@sukhachov) on codepen.io">CodePen.
Строки и расположение элементов
В 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;}
See the Pen codepen.io/sukhachov/pen/XYjZQj">Grid template 01 by Yaroslav (codepen.io/sukhachov">@sukhachov) on codepen.io«>CodePen.
Размеры полос (треков)
Сетку в Grid можно создавать с фиксированными размерами («px»), относительными размерами («em», «rem»), а также задавая гибкие размеры — ’%’ или ’fr’ (fraction). Новая единица рассчитывается самостоятельно.
Fr (fraction) не измеряется в привычных единицах, таких как «px», «em», «rem», etc, а рассчитывается самостоятельно.
Калькуляция в «fr»
Например, если доступное место составляет 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%;; }
See the Pen codepen.io/sukhachov/pen/JZRago">Grid template 02 by Yaroslav (codepen.io/sukhachov">@sukhachov) on codepen.io">CodePen.
Оси элементов в Grid
При работе с Grid у нас есть две оси для выравнивания элементов.
Ось column (столбца)
Когда мы используем свойства align-self и align-items, мы меняем выравнивание элемента в области сетки, которую поместили. Свойство align-items устанавливает свойство align-self для всех дочерних элементов сетки. Это означает, что вы можете установить свойство индивидуально, используя align-self по элементу сетки.
Ось row (строки)
Элементы управления 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; }
See the Pen codepen.io/sukhachov/pen/ERgdNa">Grid template 04 by Yaroslav (codepen.io/sukhachov>@sukhachov) on codepen.io«>CodePen.
Препроцессоры
Препроцессоры Sass и Less поддерживают работу с Grid. Также с CSS Grid работают Stylus и PostCSS.
Софт
Google Chrome и Mozilla подсвечивают гриды расширением Firebug. Также для Chrome есть расширение Gridman — CSS Grid inspector.
Support
CSS-гриды уже есть в Safari 10.3, Firefox 61 и Chrome 63.
В IE10 & IE11 используется префикс «-ms-» для определения свойств Grid. К сожалению, эти браузеры поддерживают только одну из самых ранних ограниченных спецификаций Grid Layout 2011 года.
Современная версия очень отличается от предшествующих.
В поддержке браузерами IE:
- Нет автоматического размещения. Необходимо поместить каждый элемент в сетку, используя линейное позиционирование.
- Невозможна реализация свойств:
grid-gap grid-template grid-template-areas grid-auto-columns grid-auto-rows grid-auto-flow grid-row-end grid-column-end grid-area grid-row-gap grid-column-gap grid-gap justify-self
Это не полный список всех изменений спецификации.
Имеет ли смысл использовать Grid Layout в IE вообще?
Если вы используете Grid, позиционируя элементы средствами CSS вместо использования автоматического размещения, то сетка в Internet Explorer 10, может оказаться очень полезной.
Пример базовой сетки Grid для IE
<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: -ms-grid; -ms-grid-columns: 1fr 1fr 1fr 1fr; -ms-grid-rows: 4fr; } .item1 { -ms-grid-column: 1; -ms-grid-row: 1; } .item2 { -ms-grid-column: 2; -ms-grid-row: 1; } .item3 { -ms-grid-column: 3; -ms-grid-row: 1; } .item4 { -ms-grid-column: 4; -ms-grid-row: 1; }
See the Pen codepen.io/sukhachov/pen/KegGbO">Grid IE11 template 05 by Yaroslav (codepen.io/sukhachov">@sukhachov) on codepen.io">CodePen.
Выводы
CSS Grid открывает перед разработчиками мощные возможности, но полноценно реализовать их пока мешает недостаточная поддержка браузеров IE10 и 11 (поддерживаются частично свойства через вендорные префиксы).
Преимущества
- CSS Grid сделает HTML более чистым (разметка проще, отсутствие множества классов и дополнительных тегов).
- Простота макета страницы.
- Гибкость и адаптация при работе с элементами.
- Layout можно изменять, не затрагивая разметку.
- Возможность построения блоков в двумерном пространстве (layout учитывает горизонтальное и вертикальное пространство одновременно).
- Нет ограничений по элементам построения сетки макета.
- Отлично подходит для создания больших макетов и управления ими.
- Возможно создавать сайты с динамическим контентом.
- Медиазапросы не требуются, чтобы адаптироваться к свободному пространству.
Недостатки
- Частичная поддержка в браузерах IE10 и IE11.
Grid остается революционной областью для веб. Его возможности в сочетании с другими инструментами позволят создавать более интересные и гибкие раскладки без лишних стилей, не думая про отдельные фреймворки.