Создание сайтов в Новоазовске, ДНР. Flexbox или CSS Grid? Как принимать решения по планировке, которые имеют смысл

После повсеместного внедрения CSS Grid Layout в кругах веб-разработчиков стал задаваться один вопрос: есть ли еще какая-то польза от Flexbox?

Теперь Grid поддерживается всеми основными браузерами так же, как и Flexbox. Но ответ на вопрос таков: да, Flexbox по-прежнему является важной частью CSS.

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

Чтобы освоить Flexbox, Grid и многие другие расширенные функции CSS3, ознакомьтесь с CSS Master, 3rd Edition.

Что такое флексбокс?

CSS Flexible Box Layout, или для краткости Flexbox, начал появляться в браузерах примерно в 2012 году. В течение многих лет веб-дизайнеры и разработчики с энтузиазмом приветствовали этот новый модуль CSS, хотя потребовалось некоторое время, чтобы привыкнуть к его инопланетному синтаксису и полностью овладеть его внутренней работой.

Flex-контейнер может быть определен в документе CSS следующим образом:.container { display: flex; }. Затем, как говорится в Спецификации W3C, его дочерние элементы —

могут быть расположены в любом направлении и могут «изгибать» свои размеры, либо увеличиваясь, чтобы заполнить неиспользуемое пространство, либо уменьшаясь, чтобы избежать переполнения родительского элемента. Как горизонтальное, так и вертикальное выравнивание дочерних элементов можно легко манипулировать. Вложение этих блоков (горизонтальное внутри вертикального или вертикальное внутри горизонтального) может использоваться для построения макетов в двух измерениях.

С появлением Flexbox такие вещи, как создание столбцов одинаковой длины независимо от объема их содержимого, центрирование элементов как по горизонтали, так и по вертикали, выравнивание и размещение навигационных ссылок вдоль горизонтальной линии и многое другое, стали намного проще.

Обернуть столбцы внутри гибкого контейнера достаточно, чтобы получить столбцы одинаковой длины. Проверьте это!

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

.hero {

display: flex;

flex-direction: column;

/* centers vertically */

justify-content: center;

/* centers horizontally */

align-items: center;

}

Вот демо:

Наконец, выстраивание множества ссылок еще никогда не было таким безболезненным:

.links-container {

display: flex;

/* shortcut to specify direction (horizontal) and wrapping behavior */

flex-flow: row wrap;

gap: 1rem;

}

Вы можете увидеть демо этого на CodePen.

Чтобы ознакомиться с тем, как работает Flexbox, а также в качестве быстрого ознакомления с его свойствами и значениями, взгляните на ссылки ниже:

Дружественное введение в Flexbox для начинающих на SitePoint

Введение в Mozilla Flexbox

Шпаргалка Flexbox от CSS-Tricks

Что за флексбокс?! видео серия Веса Боса

Итак, это Flexbox в двух словах. Давайте теперь продолжим и посмотрим на Grid.

Что такое CSS-сетка?

В марте 2017 года CSS Grid Layout начал получать широкую поддержку браузеров. В соответствии со спецификацией Grid макет Grid —

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

С Grid возможность создавать все виды надежных макетов в Интернете значительно возросла, настолько, что Джен Симмонс, эксперт CSS и известный защитник Grid, поощряет веб-дизайнеров и разработчиков быть авантюрными в своих макетах и ​​вырваться из чрезмерное использование общих шаблонов. (См. ее видео на YouTube Modern Layouts: Getting Out of Our Ruts.)

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

Вот демо CodePen. (Обратите внимание, что сетка работает только на более широких экранах.)

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

.container {

display: grid;

grid-template-columns: 1fr 1.2fr 1.5fr;

grid-template-rows: 1fr 4fr 3fr 2fr;

}

Единица fr— это новая гибкая единица измерения, представленная в CSS Grid Layout. Часть frсокращена от дробной, так как она представляет часть доступного пространства в контейнере сетки. Использование fr, а не фиксированной единицы, такой как px, означает, что браузер может выполнить математические расчеты, необходимые для создания макета, что, как мне кажется, предпочтительнее в большинстве случаев.

Как только сетка будет готова, самое время поместить в нее дочерние элементы. Есть несколько разных способов сделать это. В приведенной выше демонстрации я использовал номера линий сетки и свойство grid-area, которое делает всю работу в одной строке кода. Например, вот код для размещения моего основного контента:

.main {

/* row start, row end, col start col end */

grid-area: 1 / 1 / 3 / 3;

}

Когда все секции размещены в сетке, вот как это выглядит:

Макет страницы с помощью CSS Grid

Для получения более подробной информации и полезных шпаргалок перейдите по ссылкам ниже:

Учебники SitePoint «Введение в макет CSS Grid «и «Создание макетов с помощью CSS Grid «.

Сетка Рэйчел Эндрю на примере

Jen Simmons’ s Experimental Layout Lab

CSS-Tricks «Полное руководство по сетке «

Руководство по компоновке сетки MDN CSS

Курс CSS Grid Уэса Боса

Grid или Flexbox: что выбрать?

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

Вот тема в Твиттере, которую Крис Койер запустил пару лет назад, в основном задавая тот же вопрос:

Для всех, кто понимает как CSS grid, так и flexbox, какой ваш любимый способ объяснить разницу?

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

Сетка для макета страницы и Flexbox для компонентов

«Сетка для макета страницы и Flexbox для компонентов» — пожалуй, самый интуитивный ответ, который можно было бы дать на этот вопрос. На самом деле, у меня не было бы никаких сомнений относительно того, какую технологию я бы использовал при кодировании всего макета страницы. Вы можете делать макеты страниц с помощью Flexbox — и действительно, это то, что большинство из нас делало до того, как Grid вышел на сцену. Но создание сетки с помощью flexbox никогда не было по-настоящему «гибким» и никогда не обходилось без нескольких головных болей. Сетка, с другой стороны, просто была рождена для этого. Однако остается вопрос: был ли он рожден именно для этого?

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

Несмотря на то, что метки Email и Password имеют разную длину, поля формы идеально выстраиваются как по горизонтали, так и по вертикали. И в этом заключается магия Grid: он по умолчанию размещает веб-элемент как по горизонтали, так и по вертикали, будь то элементы уровня страницы или элементы уровня компонента. Эта специфика, которой обладает Grid, является мощным фактором при принятии решения о том, когда использовать Flexbox или Grid.

Двухмерный макет против одномерного

Как поясняет Рэйчел Эндрю в упомянутой выше ветке Твиттера:

Flexbox предназначен для одномерного макета. Строка ИЛИ столбец. Сетка предназначена для двухмерного макета. Строки И столбцы.

Макеты уровня страницы, а также внутренние компоненты могут нуждаться в сетке. Это важно в той мере, в какой указывает на фундаментальное эмпирическое правило, которое вступает в игру при принятии решения о том, какой из них и когда использовать. Если вашему дизайну требуется, чтобы элементы в сетке выстраивались в столбцы и строки, Grid не только идеально подходит для этой работы, но и является единственным инструментом, который делает это по умолчанию. С другой стороны, если вы хотите, чтобы элементы просто складывались так, чтобы каждая строка была независима от других с точки зрения длины и выравнивания, то Flexbox — ваш лучший друг, просто потому, что он делает это по умолчанию.

Как ясно дает понять Джен Симмонс в той же ветке Твиттера:

Сетка создает фактические столбцы и строки. Контент будет выстраиваться от одного к другому, как вы попросите. Флексбокс нет. Не только во втором измерении (о котором проще всего говорить), но и в первом измерении.

Когда вы сжимаете окно браузера, проверьте разницу между макетами на основе Flexbox и на основе сетки ниже:

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

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

В заключение, если вы не хотите, чтобы строки выстраивались в линию, обязательно используйте Flexbox.

Но следует ли из этого, что Grid годится только для создания 2D-макетов? Не обязательно. Крис Койер отмечает это в своей статье в твиттере:

Я не самый большой в мире поклонник 1D- и 2D-дифференциации сетки и flexbox, только потому, что я считаю, что большая часть моего повседневного использования сетки — это 1D, и это отлично подходит для этого.

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

Контент вне или макет в

Спецификации W3C для Flexbox и Grid могут быть полезны для разъяснения выражений «из содержимого наружу» и «из макета внутрь».

Что касается Flexbox, в спецификации указано, что он предлагает:

простые и мощные инструменты для распределения пространства и выравнивания содержимого способами, которые часто требуются веб-приложениям и сложным веб-страницам.

Другими словами, Flexbox сообщает браузеру следующее: вот мой контент, просто придумайте лучший способ его распределения по горизонтали (или по вертикали, если это необходимо) наилучшим образом на основе заданного пространства.

В случае Grid спецификация Grid поясняет, что это —

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

В случае Grid отправной точкой является структура столбцов и строк, которую Grid создает явно или неявно. Код говорит браузеру: это мои блоки контента; теперь поместите их точно в структуру сетки в указанных местах.

Каким бы убедительным ни был этот подход к текущему обсуждению, я думаю, что он все же что-то упускает. Рассмотрите возможность использования этого кода в контейнере сетки:

grid-template-columns: repeat (auto-fit, minmax (minimum width, 1fr));

Это позволяет браузеру, а не разработчику, определять, сколько столбцов и строк необходимо для контента в соответствии с доступным пространством, а также размещать конкретный фрагмент контента в столбце или строке один, два и т. д. немного похоже на Flexbox, но с идеальным выравниванием. (См. демонстрацию Grid со значками яблока в предыдущем разделе.)

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

Какому практическому правилу я следую?

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

Примеры использования Flexbox

Как указывалось выше, одна вещь, которую Flexbox делает по своей природе, заключается в том, чтобы оборачивать элементы вдоль разных строк, каждый из которых заботится только о распределении своих элементов в доступном пространстве с учетом их различной ширины, без какого-либо отношения к строкам выше или ниже... Итак, если мне не нужен вид сетки с идеально выровненными строками и столбцами, я обращусь к Flexbox.

Еще одна ситуация, в которой я бы подумал об использовании Flexbox вместо Grid, — это если мне нужна простая одномерная компоновка элементов, которые мне нужно будет легко переворачивать и/или анимировать.

Flexbox позволяет изменить порядок элементов всего одним правилом для flex-контейнера: flex-direction: row-reverse/column-reverse. Вы не можете сделать это с помощью Grid, если только вы не настроите orderсвойство вручную для каждого дочернего элемента, что может быть утомительно. Однако помните о последствиях этого для доступности, будь то во Flexbox или Grid.

Кроме того, Flexbox позволяет легко анимировать размер своих дочерних элементов, чего также нельзя добиться в кросс-браузерном режиме с помощью Grid.

Вот демонстрация того, как Flexbox справляется с обоими требованиями.

Последний случай использования, в котором я бы предпочел использовать Flexbox вместо Grid, — это если я хочу создать дизайн, в котором два или более элемента выровнены по горизонтали, причем только один из них растягивается на все доступное пространство, в то время как другие остаются. до их естественной ширины. Другими словами, что-то похожее на панель поиска CodePen на странице «Ваша работа».

Панель поиска CodePen

Я думаю, что желаемая гибкость, требуемая этим компонентом, лучше обеспечивается с помощью Flexbox, хотя такой же дизайн можно легко реализовать с помощью Grid.

Вот живая демонстрация с использованием Flexbox, а вот с Grid.

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

Панель поиска CodePen во Flexbox с дополнительными элементами, добавленными слева от панели поиска.

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

На изображении ниже показан редизайн панели поиска CodePen в Grid с дополнительными элементами, добавленными справа.

Редизайн панели поиска CodePen в Grid с добавлением дополнительных элементов справа

На следующем изображении показан редизайн панели поиска CodePen в Grid с дополнительными элементами, добавленными как слева, так и справа.

Редизайн панели поиска CodePen в Grid с добавлением дополнительных элементов слева и справа

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

Сетка для всего остального

Для всего остального я бы выбрал Грида. Очевидно, я не сталкивался со всеми проектами, которые возможны в Интернете, но по большей части я не вижу ничего более мощного, чем Grid.

Есть задачи, которые Grid может выполнять не хуже Flexbox. Вот несколько примеров.

Центрирование элементов, которое было сделано с помощью Flexbox с момента его первой реализации в браузерах, можно так же быстро сделать с помощью Grid. Вот тот же дизайн, который показан в разделе выше на Flexbox, но на этот раз реализованный с использованием CSS Grid:

Вся магия заключена в этих трех строчках:

.hero {

display: grid;

/* centers vertically */

align-items: center;

/* centers horizontally */

justify-items: center;

}

Еще один случай, который идеально подходит для Flexbox, но также выполним в Grid, — это выравнивание небольших элементов. В «Как выровнять вещи в CSS «Рэйчел Эндрю отмечает:

Я думаю, что одна из вещей, которую часто упускают из виду, — это то, насколько полезен Flexbox для выполнения небольших заданий по макету, когда вы можете подумать, что использование vertical-align— это путь. Я часто использую Flexbox для аккуратного выравнивания небольших шаблонов; например, выравнивание значка рядом с текстом...

Вот демонстрация Рэйчел, которая иллюстрирует ее точку зрения:

А вот мой форк, который повторяет тот же дизайн с помощью Grid:

Вместо использования inline-flex, как это сделала Рэйчел в своей демонстрации, я использую inline-grid:

span {

display: inline-grid;

align-items: center;

grid-auto-flow: column;

}

Вы даже можете добавить больше значков после текста, и он все равно выровняется, как и во Flexbox.

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

И я даже не упомянул, что будет в будущем с CSS Grid Level 2. Я не могу дождаться, когда подсетка будет широко реализована в браузерах. В этот момент выравнивание элементов, которые не являются прямыми дочерними элементами контейнера сетки без необходимости во вложенном контейнере сетки, будет таким же простым, как добавление значения subgridк grid-template-columnsиgrid-template-rows. Ознакомьтесь с CSS Grid Level 2: Here Comes Subgrid Рэйчел Эндрю для глубокого погружения.

Наконец, есть даже спецификация CSS Grid Layout Module Level 3, которая может включать возможность построения макетов каменной кладки с использованием значения masonryдля grid-template-columns/ grid-template-rows. И снова Рэйчел Эндрю предоставляет подробную информацию об этом в своей статье «Native CSS Masonry Layout in CSS Grid «.

Заключение

В этой статье я обсудил несколько способов, которыми вы можете подойти к выбору между использованием Flexbox или Grid для своих макетов.

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

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

Делитесь нашими материалами с друзьями!

 

 

Заказать разработку сайта