Вёрстка веб-страниц — ключевое применение CSS.

Традиционное решение для вёрстки основано наблочной модели, полагаясь наdisplayсвойство +positionсвойство +floatсвойства. Это очень неудобно для специальных макетов, таких как,вертикальное центрирование, которое нелегко реализовать.

В 2009 году W3C предложил новое решение — Flex-верстка — которое позволяет просто, полно и адаптивно реализовывать различные макеты страниц. В настоящее время оно поддерживается всеми браузерами, а значит, теперь вы можете безопасно использовать эту возможность.

Flex-верстка станет предпочтительным решением для верстки в будущем. В этой статье представлен синтаксис Flex-верстки.
Следующий материал в основном основан на этих двух статьях:Полное руководство по FlexboxиВизуальное руководство по свойствам CSS3 Flexbox。
1. Что такое Flex-верстка?
Flex — это сокращение от Flexible Box, означающее «гибкая верстка», используется для обеспечения максимальной гибкости блочной модели.
Любой контейнер можно задать как Flex-верстку.
.box{
display: flex;
}
Строчные элементы также могут использовать Flex-верстку.
.box{
display: inline-flex;
}
Браузеры с ядром Webkit должны добавлять префикс -webkit.
.box{
display: -webkit-flex; /* Safari */
display: flex;
}
Обратите внимание, что после установки Flex-верстки свойства float, clear и vertical-align дочерних элементов станут недействительными.
2. Основные понятия
Элементы, использующие Flex-разметку, называются Flex-контейнерами (flex container), сокращенно "container". Все их дочерние элементы автоматически становятся членами контейнера, называемыми Flex-элементами (flex item), сокращенно "item".

По умолчанию контейнер имеет две оси: горизонтальную главную ось (main axis) и вертикальную поперечную ось (cross axis). Начальное положение главной оси (пересечение с границей) называется main start, а конечное положение — main end; начальное положение поперечной оси называется cross start, а конечное положение — cross end.
По умолчанию элементы располагаются вдоль главной оси. Пространство главной оси, занимаемое одним элементом, называется main size, а пространство поперечной оси, которое он занимает, называется cross size.
3. Свойства контейнера
Следующие 6 свойств задаются для контейнера.
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
3.1 Свойство flex-direction
Свойство flex-direction определяет направление главной оси (то есть направление, в котором располагаются элементы).
.box {
flex-direction: row | row-reverse | column | column-reverse;
}

Оно может иметь 4 значения.
- row (по умолчанию): главная ось горизонтальна, начинается слева.
- row-reverse: главная ось горизонтальна, начинается справа.
- column: главная ось вертикальна, начинается сверху.
- column-reverse: главная ось вертикальна, начинается снизу.
3.2 Свойство flex-wrap
По умолчанию элементы располагаются в одну строку (также называемую осью). Свойство flex-wrap определяет, как выполнять перенос, если на одной оси не помещаются все элементы.

.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}
Свойство может принимать три значения.
(1) nowrap (по умолчанию): без переноса.

(2) wrap: перенос, первая строка сверху.

(3) wrap-reverse: перенос, первая строка снизу.

3.3 flex-flow
Свойство flex-flow — это сокращённая запись для свойств flex-direction и flex-wrap со значением по умолчанию row nowrap.
.box {
flex-flow: <flex-direction> <flex-wrap>;
}
3.4 Свойство justify-content
Свойство justify-content определяет выравнивание элементов по главной оси.
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}

Свойство может принимать 5 значений. Конкретное выравнивание зависит от направления оси. Далее предполагается, что главная ось направлена слева направо.
- flex-start (по умолчанию): выравнивание по левому краю
- flex-end: выравнивание по правому краю
- center: выравнивание по центру
- space-between: выравнивание по обоим краям с равными интервалами между элементами.
- space-around: интервалы с обеих сторон каждого элемента равны. Поэтому интервал между элементами в два раза больше интервала между элементами и границей.
3.5 свойство align-items
Свойство align-items определяет, как элементы выравниваются по поперечной оси.
.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}

Оно может принимать 5 значений. Конкретное выравнивание связано с направлением поперечной оси. Далее предполагается, что поперечная ось направлена сверху вниз.
- flex-start: выравнивание по началу поперечной оси.
- flex-end: выравнивание по концу поперечной оси.
- center: выравнивание по центру поперечной оси.
- baseline: выравнивание по базовой линии первой строки текста в элементе.
- stretch (по умолчанию): если у элемента не задана высота или она установлена в auto, он заполнит всю высоту контейнера.
3.6 Свойство align-content
Свойство align-content определяет выравнивание нескольких осей. Если у элементов только одна ось, это свойство не оказывает никакого эффекта.
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}

Это свойство может принимать 6 значений.
- flex-start: выравнивание по началу поперечной оси.
- flex-end: выравнивание по концу поперечной оси.
- center: выравнивание по центру поперечной оси.
- space-between: выравнивание по обоим концам поперечной оси, интервалы между осями распределены равномерно.
- space-around: интервал с обеих сторон каждой оси одинаков. Поэтому интервал между осями в два раза больше интервала между осями и границей.
- stretch (по умолчанию): ось заполняет всю поперечную ось.
4. Свойства элементов
Следующие 6 свойств задаются для элементов.
- order
- flex-grow
- flex-shrink
- flex-basis
- flex
- align-self
4.1 Свойство order
Свойство order определяет порядок, в котором располагаются элементы. Чем меньше значение, тем раньше элемент располагается. По умолчанию — 0.
.item {
order: <integer>;
}

4.2 Свойство flex-grow
Свойство flex-grow определяет коэффициент, на который элемент может увеличиваться; значение по умолчанию — 0, что означает, что даже при наличии оставшегося пространства он не будет увеличиваться.
.item {
flex-grow: <number>; /* default 0 */
}

Если у всех элементов свойство flex-grow равно 1, они поровну разделят оставшееся пространство (если оно есть). Если у одного элемента свойство flex-grow равно 2, а у остальных — 1, первый займет в два раза больше оставшегося пространства, чем остальные.
4.3 Свойство flex-shrink
Свойство flex-shrink определяет коэффициент, на который элемент может сжиматься; значение по умолчанию — 1, что означает, что при недостатке пространства элемент будет сжиматься.
.item {
flex-shrink: <number>; /* default 1 */
}

Если у всех элементов свойство flex-shrink равно 1, они будут пропорционально сжиматься при недостатке пространства. Если у одного элемента свойство flex-shrink равно 0, а у остальных — 1, первый не будет сжиматься при недостатке пространства.
Отрицательные значения недопустимы для этого свойства.
4.4 Свойство flex-basis
Свойство flex-basis определяет пространство главной оси (главный размер), занимаемое элементом до распределения дополнительного пространства. Браузер вычисляет, есть ли дополнительное пространство на главной оси, на основе этого свойства. Значение по умолчанию — auto, что соответствует исходному размеру элемента.
.item {
flex-basis: <length> | auto; /* default auto */
}
Его можно задать значением, как у свойства width или height (например, 350px), и элемент будет занимать фиксированное пространство.
4.5 Свойство flex
Свойство flex — это сокращённая запись для flex-grow, flex-shrink и flex-basis со значением по умолчанию 0 1 auto. Последние два свойства необязательны.
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
У этого свойства есть два сокращённых значения: auto (1 1 auto) и none (0 0 auto).
Рекомендуется сначала использовать это свойство, а не писать три отдельных свойства, потому что браузер вычислит связанные значения.
4.6 Свойство align-self
Свойство align-self позволяет отдельному элементу иметь выравнивание, отличное от других элементов, и может переопределять свойство align-items. Значение по умолчанию — auto, что означает наследование свойства align-items родительского элемента; если родительского элемента нет, это эквивалентно stretch.
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

Это свойство может принимать 6 значений. За исключением auto, остальные точно такие же, как у свойства align-items.
Источник: http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html