Flex-элементы
Часть 2
О flex-контейнере и его свойствах поговорили в части 1, теперь поговорим о дочерних элементах.
Свойства flex-элементов
order
По умолчанию элементы в контейнере располагаются в порядке следования в html-документе. Однако, с помощью свойства order порядок можно изменять.
|
|
flex-grow
Это свойство позволяет элементу при необходимости увеличиваться в размерах. Принимает пропорциональное число без единиц измерения и определяет, какое количество свободного пространства в контейнере каждый элемент может занимать. Если указанное значение flex-grow для всех элементов равно 1, каждый элемент займёт одинаковое количество пространства. Если присвоить одному элементу значение 2, он займёт в два раза больше пространства, чем остальные элементы.
|
|
Отрицательные значения не допустимы.
flex-shrink
По аналогии с предыдущим, это свойство позволяет элементу при необходимости уменьшаться в размерах.
|
|
Отрицательные значения не допустимы.
flex-basis
Определяет размер элемента по умолчанию до распределения свободного места в контейнере. Задаёт ширину или высоту элемента — в зависимости от указанного направления flex-direction.
|
|
Если указано значение 0, свободное пространство вокруг содержания элемента не учитывается. Если указано значение auto, пространство распределяется в соответствии с величиной свойства flex-grow данного элемента. Подробная иллюстрация здесь
flex
Это короткий вариант записи свойств flex-grow, flex-shrink и flex-basis. Два последних параметра (flex-shrink и flex-basis) - опциональны. Значения flex по умолчанию: 0 1 auto.
|
|
Рекомендуется использовать это короткое свойство flex вместо прописывания каждого свойства по-отдельности.
align-self
Это свойство задаёт выравнивание по перпендикулярной оси конкретному flex-элементу — и переопределяет указанное ранее для контейнера свойство align-items (возможные значения такие же - см. в разделе «Свойства flex-контейнера»).
|
|
Имейте в виду, что свойства float, clear и vertical-align не работают для flex-элементов.
Перейдём к примерам
Начнём с примера, решаюшего тривиальную задачу — идеальное центрирование. С flexbox это просто:
|
|
Этот пример основан на том, что свойство margin: auto в flex-контейнере распределяет всё свободное пространство. Таким образом, flex-элемент идеально выравнивается по обеим осям.
Другой пример. Рассмотрим список из 6 элементов, в эстетических целях всем заданы фиксированные размеры, хотя они могли быть и не указаны. Нам нужно, чтобы элементы были красиво выравнены по горизонтальной оси так, чтобы при изменении размера браузера, всё оставалось по-прежнему красивым (без @media queries):
|
|
Готово. Остальное — вопрос дизайна. Ниже вставлен пример с codepen с данным кодом. Не поленитесь, сходите на Codepen, и поиграйтесь с размерами вашего браузера:
See the Pen Demo Flexbox 1 by Hugo Giraudel (@HugoGiraudel) on CodePen.
Попробуем что-нибудь ещё. В верхней части нашего сайта имеется выравненная по правому краю навигация. Нам надо, чтобы на средних экранах она была выравнена по центру, а на малых экранах превращалась в одну колонку. Легко.
|
|
See the Pen Demo Flexbox 2 by Hugo Giraudel (@HugoGiraudel) on CodePen.
Поиграемся с гибкостью flex-элементов. Нам нужен макет из трёх колонок, с полноразмерным header и footer, и порядком, отличным от указанного в html-коде. Выстраиваем макет по принципу mobile-first:
|
|
See the Pen Demo Flexbox 3 by Hugo Giraudel (@HugoGiraudel) on CodePen.
Префиксы для Flexbox
Для поддержки во всех возможных браузерах Flexbox требует вендорных префиксов, причём не достаточно просто приставить к свойству вендорный префикс, иногда это совсем иные названия свойств и параметров. Связано это неудобство с изменениями, вносимыми в спецификацию Flexbox с течением времени, в результате чего появился «старый» и «новый» синтаксис flexbox .
Проще всего обойти это неудобство, используя новый (и окончательный) синтаксис в связке с Autoprefixer .
Или, в качестве альтернативы, можно использовать приведённый ниже Sass @mixin:
|
|
Баги
Есть у Flexbox и ошибки. Наиболее полный их перечень можно найти у Филиппа Уолтона и Грега Витворта по ссылке.
Браузерная поддержка
разбита по «версиям» flexbox:
новая (подразумевает последний синтаксис спецификации — напр., display: flex;)
промежуточная (неофициальный синтаксис 2011 года — напр., display: flexbox;)
старая (старый синтаксис 2009 года — напр., display: box;)
Браузеры Blackberry 10+ поддерживают новый синтаксис.
Более полная информация о том, какой синтаксис лучше использовать для наиболее полной поддержки, можно изучить эту и эту статьи.
Дополнительная информация (англ источники)
Flexbox in the CSS specifications
Mixing syntaxes for best browser support on CSS-Tricks