Введение в CSS Grid Layout Module

Введение в CSS Grid Layout Module

От автора: в этом вводном уроке я расскажу вам об этой относительно новой функции CSS, расскажу о текущей поддержке в браузерах и покажу вам несколько примеров того, как работает CSS Grid Layout Module.

Поскольку веб-приложения становятся все более сложными, нам нужен более естественный способ делать расширенные макеты без хакерских решений, которые используют обтекания и другие менее обременительные методы. Увлекательное новое решение для создания макетов идет с CSS Grid Layout Module.

Что такое CSS Grid Layout Module?

Основная идея Grid Layout состоит в том, чтобы разделить веб-страницу на столбцы и строки, а также возможность позиционирования и изменения размера элементов строительного блока на основе строк и столбцов, которые мы создали с точки зрения размера, положения и слоя.

Сетка также дает нам гибкий способ изменить положение элементов только с CSS без каких-либо изменений в HTML. Это можно использовать со медиа запросами для изменения макета на разных контрольных точках.

Поддержка в браузерах

Прежде чем мы сможем больше погрузиться в Grid Layout, важно взглянуть на состояние поддержки в браузерах.

Введение в CSS Grid Layout Module

Поддержка в современных браузерах

Как видно из приведенного выше изображения, отличная новость заключается в том, что CSS Grid поддерживается последней версией большинства браузеров.

Если вы нажмете кнопку «Показать все» на Can I use, вы увидите, как далеко назад эта поддержка идет. Поскольку Grid является такой новой функцией, обратная совместимость не распространяется далеко, поэтому вам нужно помнить об этом, если ваша аудитория использует старую версию какого-то основного браузера.

Однако, если навести курсор на версию на Can I use, можно посмотреть скорость глобального использования для этой версии. На момент написания статьи последние версии всех браузеров без поддержки Grid используется гораздо меньше одного процента.

Internet Explorer … и другие не поддерживающие браузеры

Первое предложение Grid Layout было разработано Microsoft, а в IE10 вышла реализация префиксом -ms. Если вы посмотрите на поддержку на Can I use, вы увидите, что IE10 и IE11 поддерживают CSS Grid … с оговоркой, что они поддерживают только более старую версию спецификации. Облом. Это не изменится. Но что изменится, это использование этих браузеров. В июле 2018 года использование IE11 сократилось примерно до 2% в глобальном масштабе, а использование IE10 составляет примерно одну десятую процента.

Can I use также указывает, что несколько других браузеров не поддерживают grid layout. К ним относятся Opera Mini и Blackberry Browser. Opera Mini – единственный браузер, обладающий значительным использованием, но поскольку это мобильный браузер, вы, скорее всего, захотите настроить таргетинг на мобильный, а не макет grid.

Фолбеки для не поддерживающих браузеров

Учитывая, что подавляющее большинство используемых сегодня браузеров поддерживают CSS Grid, стыдно не использовать его на том основании, что некоторые браузеры могут его не поддерживать. Существуют различные варианты использования Grid и обеспечения превосходных резервов для не поддерживающих браузеров.

Возможно, самый простой вариант — предоставить простой mobile first макет. Это будет вполне адекватно для мобильных устройств, которые не поддерживают Grid, а также настольных браузеров, таких как IE.

Другим вариантом является использование более сложных фолбеков и переопределений для получения аналогичных результатов для Grid, как указано Рэйчел Эндрю.

И polyfill также доступен для обеспечения рабочей реализации Grid Module для браузеров, которые его не поддерживают. Обратите внимание, что это может быть немного устаревшим.

Пример Grid Layout

Начнем с примера, чтобы увидеть силу Grid Layout, а затем я объясню некоторые новые концепции более подробно. Представьте, что вы хотите создать приложение Twitter с четырьмя полноразмерными раскладками столбцов (твиты, ответы, поиск и сообщения), что-то абстрагируемое и похожее на снимок экрана ниже.

Введение в CSS Grid Layout Module

Вот наш HTML:

<div class="app-layout"> <div class="tweets">Tweets</div> <div class="replies">Replies</div> <div class="search">Search</div> <div class="messages">Messages</div>
</div>

Затем мы применим CSS к контейнеру .app-layout:

.app-layout { display: grid; /* 1 */ grid-template-columns: 1fr 1fr 1fr 1fr; /* 2 */ grid-template-rows: 100vh; /* 3 */
}

Посмотреть демо

Вот объяснение того, что мы сделали в предыдущем CSS:

Установили свойство display в grid.

Разделили элемент контейнера на четыре столбца, каждый столбец — 1fr (одна доля) свободного пространства в контейнере сетки.

Создали одну строку и установили высоту равной 100vh (полная высота вьюпорта).

Как вы можете видеть, Grid Layout Module добавляет новое значение в свойство display — grid. Значение grid устанавливает .app-layout контейнером сетки, который также устанавливает новый контекст форматирования сетки для его содержимого. Это свойство необходимо для начала использования Grid Layout.

Свойство grid-template-columns задает ширину каждого столбца сетки внутри Grid, и в нашем случае оно делит контейнер .app-layout на четыре столбца; каждый из них равен 1fr (25%) доступного пространства.

grid-template-rows задает высоту каждой строки сетки, и в нашем примере мы создали только одну строку с высотой 100vh. Макет с двумя столбцами и двумя строками будет выглядеть так:

Введение в CSS Grid Layout Module

И мы будем использовать следующий CSS:

.app-layout { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 50vh 50vh;
}

Посмотреть демо

Мы также можем выполнить приведенный выше пример только на небольших экранах, обернув код внутри медиа-запроса. Это открывает отличную возможность для нас настроить макет по-разному в разных вьюпортах. Например, мы можем создать предыдущий макет только для вьюпортов под 1024px следующим образом:

@media screen and (max-width: 1024px) { .app-layout { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 50vh 50vh; }
}

Посмотреть демо

Концепции Grid Layout Module

Теперь, когда вы видели простой пример, есть несколько новых концепций, которые я хотел бы осветить, чтобы вы лучше поняли Grid Layout. Хотя есть много новых концепций, я лишь взгляну на некоторые из них.

Элемент Grid

Элементы сетки — это дочерние элементы контейнера сетки. В приведенном выше примере .tweets и .replies будут элементами сетки.

Линии Grid

Введение в CSS Grid Layout Module

Строка сетки — это линия, которая существует по обе стороны столбца или строки. Существует два набора линий сетки: один набор определяющих столбцов (вертикальная ось) и другой набор, определяющий строки (горизонтальная ось).

Из приведенного выше снимка экрана, который представляет первый пример, я создал четыре столбца по 1fr каждый, что даст нам пять вертикальных линий. Я также создал один ряд, который дает нам две горизонтальные линии.

Давайте посмотрим, как мы можем позиционировать элемент сетки внутри контейнера сетки.

Расположение элементов с помощью номера линии

Вы можете ссылаться на точный номер линии в сетке, используя свойства grid-column-start и grid-column-end. Затем мы даем эти свойства номерам начала и конца строки. Если посмотреть на предыдущий пример, это то, как браузер по умолчанию устанавливает элементы по умолчанию:

.tweets { grid-column-start: 1; grid-column-end: 2; grid-row: 1;
} .replies { grid-column-start: 2; grid-column-end: 3; grid-row: 1;
} .search { grid-column-start: 3; grid-column-end: 4; grid-row: 1;
} .messages { grid-column-start: 4; grid-column-end: 5; grid-row: 1;
}

Рассмотрим код для столбца .tweet. Что делает каждая из трех строк в CSS:

Помещает дочерний элемент, начиная с первой вертикальной линии слева.

Завершает положение элемента во второй вертикальной линии.

Помещает элемент внутри всей строки.

Вы можете изменить это, изменив порядок элементов с разными позициями, поэтому порядок элементов будет: .search, .replies, .messages и .tweets.

Введение в CSS Grid Layout Module

И мы можем сделать это следующим образом:

.tweets { grid-column-start: 4; grid-column-end: 5; grid-row: 1;
} .replies { grid-column-start: 2; grid-column-end: 3; grid-row: 1;
} .search { grid-column-start: 1; grid-column-end: 2; grid-row: 1;
} .messages { grid-column-start: 3; grid-column-end: 4; grid-row: 1;
}

Мы также можем использовать сокращенное свойство grid-column, чтобы установить начальную и конечную линии в одной строке:

.tweets { grid-column: 4 / 5; grid-row: 1;
} .replies { grid-column: 2 / 3; grid-row: 1;
} .search { grid-column: 1 / 2; grid-row: 1;
} .messages { grid-column: 3 / 4; grid-row: 1;
}

Посмотреть демо

Это изменило структуру компоновки только с помощью CSS, в то время как разметка остается без изменений. Это огромное преимущество использования модуля компоновки сетки. Мы можем изменить расположение элементов независимо от их исходного порядка, чтобы мы могли достичь любой желаемой компоновки для разных размеров экрана и ориентации.

Расположение элементов с помощью именованных областей

Область сетки — это логическое пространство, используемое для выкладки одного или нескольких элементов сетки. Мы можем назвать область сетки явным образом с помощью свойства grid-template-areas, тогда мы можем поместить элемент сетки в определенную область, используя свойство grid-area.

Чтобы сделать эту концепцию более понятной, давайте повторим пример с четырьмя столбцами с первым столбцом search:

.app-layout { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; grid-template-rows: 100vh; grid-template-areas: "search replies messages tweets";
}

В последней строке мы разделим контейнер сетки на четыре именованные области сетки, каждое имя для столбца. Следующий шаг — разместить каждый элемент сетки в именованной области:

.search { grid-area: search;
} .replies { grid-area: replies;
} .messages { grid-area: messages;
} .tweets { grid-area: tweets;
}

Посмотреть демо

Пример Slack

Как насчет использования Grid Layout Module для реализации более сложного примера, например, создания строительных блоков макета Slack. Поскольку мы говорим о макетах, мы будем абстрагироваться и упрощать дизайн Slack до строительных блоков, представленных в сетке. Что-то вроде этого:

Введение в CSS Grid Layout Module

Из этого макета мы создадим три вертикальных столбца и три горизонтальные строки, и мы можем визуализировать их с использованием линий сетки следующим образом:

Введение в CSS Grid Layout Module

<div class="app-layout"> <div class="teams">Teams</div> <div class="channels">Channels</div> <div class="header">Header</div> <div class="messages"> <ul class="message-list"> <li></li> <li></li> </ul> </div> <div class="input"> <input type="text" placeholder="CSS Grid Layout Module"> </div>
</div>
.app-layout { display: grid; height: 100vh; grid-template-columns: 100px 250px 1fr; grid-template-rows: auto 1fr auto;
}

Здесь я использую свойство grid-template-columns для создания трех столбцов в 100px, 250px, а третий столбец занимает оставшееся свободное пространство. Последняя строка создает три строки: первая и третья строки с автоматической высотой, а средняя строка занимает оставшееся свободное пространство. Остальная часть CSS выглядит так:

.teams { grid-column: 1; grid-row: 1 / 4;
} .channels { grid-column: 2; grid-row: 1 / 4;
} .header { grid-column: 3; grid-row: 1;
} .messages { grid-column: 3; grid-row: 2;
} .input { grid-column: 3; grid-row: 3;
}

Посмотреть демо

Мы также можем создать макет Slack с использованием именованных областей, которые вы можете увидеть в этой демонстрации.

Grid Layout Module или Flexbox

Поскольку многие из вас начали использовать Flexbox, вы можете задаться вопросом: когда было бы целесообразно использовать Flexbox, и когда было бы более целесообразно использовать Grid Layout?

Я нашел хорошее объяснение от Tab Atkins: Flexbox подходит для многих макетов и множества элементов (компонент страницы), поскольку большинство из них принципиально линейны. Grid подходит для общего макета страницы и для сложных компонентов страниц, которые не являются линейными по своему дизайну.

Оба могут быть составлены произвольно, поэтому, как только они будут широко поддерживаться, я считаю, что большинство страниц будут состоять из внешней grid для общей компоновки, комбинации вложенных flexbox и grid для компонентов страницы и, наконец, макета block/inline/table на «концах» страницы, где располагается текст и контент.

Также Rachel Andrew поясняет: Grid Layout для основной структуры страниц строк и столбцов. Flexbox для навигации, элементы пользовательского интерфейса, все, что вы можете перевести в линейное пространство.

Заключение

Как вы видели, модуль компоновки сетки CSS является мощным из-за его краткости кода и того факта, что у вас есть возможность изменить порядок макета, не касаясь разметки. Эти функции помогли нам постоянно менять способ создания макетов для Интернета.

Автор: Ahmad Ajmi

Источник: https://www.sitepoint.com/

Редакция: Команда webformyself.