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

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

1. Создание столбцов с одинаковой высотой


На первых порах, это может показаться не трудной задачей, но делать столбцы, которые имеют одинаковую высоту, иногда бывает сделать очень «геморройно». min-height в данном случае использовать будет не практично, так как с увеличением количества контента, находящегося в блоке, так же будет и увеличиваться его длина.

Flexbox не видит в этом проблемы. Все, что нам нужно, так это инициализировать гибкую модель. Обязательно убедитесь, что flex-direction и align-items имеют значения «по умолчанию».

<div class="container">
   <div></div>
   <div></div>
   <div></div>
</div>

.container{
   display: flex;
   flex-direction: row; /*Пункты внутри контейнера будут располагаться горизонтально*/
   align-items: stretch; /*Пункты внутри контейнер будут принимать всю его высоту*/
}

Пример

2. Изменение порядка


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

Это свойство называется order. Оно позволяет мне менять любое количество flex элементов и изменять их последовательность, в которой они появятся на экране. Этот параметр представляет собой целое число, определяющее положение элемента — более низкие числа означают больший приоритет.

<div class="container">
   <div class="blue">...</div>
   <div class="red">...</div>
   <div class="green">...</div>
</div>

.conteiner{
   display: flex;
}

/*Обратный порядок элементов*/

.blue{
   order: 3;
}

.red{
   order: 2;
}

.green{
   order: 1;
}

3.Горизонтальное и вертикальное центрирование


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

Flexbox предлагает более простое решение этой проблемы. Каждый гибкий макет имеет два направления на оси (X,Y) и два отдельных свойства для их выравнивания. Мы можем позиционировать любой элемент прямо в середине родительского контейнера.

<div class="container">
   <div>...</div>
</div>

.container{
   display: flex;
   /*Центр по главной оси*/
   justify-content: center;
   /*Центр по вспомогательной оси*/
   align-items: center;
}

Пример

4. Создание полностью отзывчивой сетки (Responsive Grids)


Большинство разработчиков полагаются на готовые CSS фреймворки при создании адаптивных сайтов. Bootstrap является наиболее популярным, но есть и сотни других фреймворков, которые помогут вам справиться с этой задачей. Как правило, они хорошо работают и имеют множество опций, но имеют тенденцию быть довольно тяжелыми. Если вы все хотите сделать своими руками и вам не нужных громоздких фреймвокров, тогда Flexbox именно для вас!

Строка flexbox сетки представляет собой простой контейнер с display: block;. Внутри горизонтального столбца может быть любое количество элементов, размер которого устанавливается с помощью Flex. Гибкая модель адаптируется под размер окна браузера, так что эта схема должна отлично выглядеть на всех устройствах. Тем не менее, если все таки не хватит места на экране по горизонтали, то мы сможем решить эту проблему с помощью медиа-запроса.

<div class="container">
   <!-- Эта колонка будет 25% в ширину -->
   <div class="col-1">...</div>
   <!-- Эта колонка будет 50% в ширину -->
   <div class="col-2">...</div>
   <!-- Эта колонка будет 25% в ширину -->
   <div class="col-1">...</div>
</div>

.container{
	display: flex;
}

.col-1{
	flex: 1;
}

.col-2{
	flex: 2;
}

@media (max-width: 800px){
	.container{
		flex-direction: column;		
	}
}

5. Создание идеального Sticky Footer (прилипающий футер)


Flexbox имеет простое решение этой проблемы. Применение display: flex; к тегу body позволяет построить весь наш макет страницы, на основе свойств Flex. Да чего я все говорю, да говорю? Давайте уже лучше посмотрим на практике.

<body>
	<div class="main">...</div>
	<!-- Наш липкий футер -->
	<footer>...</footer>
</body>

html{
    height: 100%;
}

body{
    display: flex;
    flex-direction: column;
    height: 100%;
}

.main{
   /*Основной раздел будет занимать все свободное место на странице*/
   flex: 1 0 auto;
}

footer{
   /*Футер будет занимать столько места по вертикали, сколько и должен и не пикселя больше */
   flex: 0 0 auto;
}

Вывод


Все браузеры (кроме IE 9) теперь поддерживают режим Flexbox. Если вы не использовали Flexbox до этого момента, то я рекомендуем Вам попробовать.

Надеюсь, что мои советы CSS были для вас полезны и что они помогут вам создавать более качественные и более адаптивные макеты.

Жду ваших комментариев по этому поводу.
Поделиться с друзьями
-->

Комментарии (7)


  1. Veikedo
    30.05.2016 13:52
    +1

    Для ie9 есть полифил github.com/10up/flexibility и плагин для postCSS
    ie10 не всегда правильно отображает вёрстку с флексбоксом, но тот же полифил помогает.


    1. kobiak
      03.06.2016 02:18

      Спасибо за плагин к postCSS.

      Не могу разобраться, не добавляет дополнительный CSS. У него параметры какие-то есть? Не покажите пример подключить с grunt


      1. Veikedo
        03.06.2016 11:26
        +1

        Да, в общем-то, всё просто. Просто вставляете в цепочку процессоров и всё работает.
        Пользуюсь галпом, но судя по https://github.com/nDmitry/grunt-postcss всё идентично.

        Ну, естественно, надо чтобы в стиле было display: flex


  1. StasIva
    30.05.2016 14:16

    Спасибо. Давно собирался попробовать этот флексбокс, но было как-то боязно. А оно вона как всё просто!


  1. Xazzzi
    30.05.2016 15:34

    Есть минус: гуглбот не воспринимает флексбокс, в итоге имею кучку писем о «неудобном» макете.


  1. vmm86
    31.05.2016 12:32

    Исправьте gjl => под


  1. ccartrec
    02.06.2016 12:54
    +1

    Флексбокс действительно упрощает верстку многих моментов=) уже использовал пару раз в рабочих проектах. багов не было