Не всё в интерфейсе располагается слева направо. Меню бывает вертикальным, карточки — колонкой на телефоне и рядом на десктопе, а длинный ряд элементов должен уметь переноситься на новую строку, чтобы не вылезать за края экрана. Свойства flex-direction и flex-wrap дают полный контроль над направлением ряда и его переносом — без них гибкая раскладка была бы наполовину слепой.
После этого урока вы сможете выстраивать флекс-элементы в любую сторону — в ряд или в колонку — и разрешать им переноситься на несколько строк.
Что уже умеем / что добавим
Вы умеете включать флекс и понимаете, что раскладкой управляет контейнер. Теперь научимся задавать направление главной оси и разрешать перенос. В сквозном проекте мы соберём ряд карточек услуг, который будет аккуратно переноситься на новую строку.
Что вы узнаете в рамках статьи
- Как менять направление раскладки свойством
flex-direction. - Чем отличаются значения
rowиcolumn. - Что делают обратные направления
row-reverseиcolumn-reverse. - Как разрешить перенос элементов свойством
flex-wrap. - Как направление влияет на положение главной оси.
Ключевые термины
flex-direction— свойство направления главной оси.row— раскладка в ряд (по горизонтали), значение по умолчанию.column— раскладка в колонку (по вертикали).flex-wrap— свойство переноса элементов на новые строки.nowrap— запрет переноса (по умолчанию);wrap— разрешение переноса.
Направление: flex-direction
Свойство flex-direction задаёт, вдоль какой оси выстраиваются элементы. Значение по умолчанию — row (ряд слева направо). Чтобы поставить элементы в колонку, используют column:
.menu {
display: flex;
flex-direction: column;
}
Элементы, которые раньше стояли в ряд, теперь выстроятся друг под другом сверху вниз. Важный момент: flex-direction меняет саму главную ось. При column главная ось становится вертикальной — а значит, все выравнивания, которые мы разберём дальше, тоже развернутся вслед за ней. Это частый источник путаницы, поэтому держите направление в голове.
Ряд или колонка
Сравним два основных значения на одном примере:
.row-layout {
display: flex;
flex-direction: row; /* в ряд, слева направо */
}
.column-layout {
display: flex;
flex-direction: column; /* в колонку, сверху вниз */
}
Контейнер .row-layout расставит детей горизонтально, .column-layout — вертикально. На практике row используют для меню, панелей и рядов кнопок, а column — когда нужно выстроить блоки в вертикальный стек, но с возможностями флекса (например, чтобы удобно управлять выравниванием и промежутками).
Обратные направления
У каждого направления есть «обратная» версия, которая разворачивает порядок элементов: row-reverse (справа налево) и column-reverse (снизу вверх):
.menu {
display: flex;
flex-direction: row-reverse;
}
Элементы визуально поменяются местами: первый по коду окажется справа, последний — слева. Обратите внимание — меняется только визуальный порядок, а не сам HTML. Это удобно в отдельных случаях, но злоупотреблять не стоит: если по коду порядок один, а на экране другой, это может запутать тех, кто пользуется страницей с клавиатуры или экранным диктором.
Перенос: flex-wrap
По умолчанию флекс-элементы стараются уместиться в одну линию и, если места мало, сжимаются, но не переносятся. Такое поведение задаёт значение nowrap. Чтобы разрешить перенос на новые строки, используют flex-wrap: wrap:
.cards {
display: flex;
flex-wrap: wrap;
}
Теперь, когда элементам не хватает ширины, лишние аккуратно переходят на следующую строку, а не сжимаются в тонкую полоску и не вылезают за край. Это основа отзывчивых сеток карточек: на широком экране они умещаются в один ряд, на узком — переносятся. Практически всегда, когда вы делаете ряд карточек, flex-wrap: wrap нужен.
Применяем в проекте
Соберём секцию услуг компании как ряд карточек, который умеет переноситься. Возьмём блок с несколькими карточками и включим флекс с переносом.
<section class="services">
<div class="card">Веб-разработка</div>
<div class="card">Дизайн</div>
<div class="card">Поддержка</div>
<div class="card">Консалтинг</div>
</section>
.services {
display: flex;
flex-wrap: wrap;
}
Обновите страницу и попробуйте менять ширину окна: карточки выстроены в ряд, а когда места не хватает, часть из них переносится на новую строку, сохраняя порядок. Мы заложили основу отзывчивой секции услуг — расстояния между карточками и их размеры настроим в следующих уроках.
Частые ошибки
- Забыли, что
columnразворачивает оси.
При вертикальном направлении главная ось становится вертикальной, и выравнивания меняются местами. - Нет
flex-wrap: wrapдля карточек.
Без него элементы сжимаются в одну строку вместо переноса. - Путаница
row-reverseи реального порядка.
Обратное направление меняет только вид, а не HTML — не полагайтесь на него для смысла. flex-directionна элементе, а не контейнере.
Свойство, как и весь флекс, задаётся контейнеру.
Итоги
Замечательно — теперь вы управляете направлением раскладки! Вы умеете выстраивать элементы в ряд и в колонку, разворачивать их обратными направлениями и, что особенно важно, разрешать перенос на новые строки через flex-wrap. Это уже позволяет строить отзывчивые сетки, которые не ломаются на узких экранах. Ваш проект обзавёлся секцией услуг с переносимыми карточками.
Вы отлично продвигаетесь! В следующем уроке возьмёмся за самое востребованное во Flexbox — выравнивание элементов по осям с помощью justify-content и align-items.