Направление flex-элементов в CSS: свойство flex-direction

flex-direction задаёт направление, в котором flex-контейнер выстраивает свои элементы: в строку слева направо (row, по умолчанию), в строку справа налево (row-reverse), в столбец сверху вниз (column) или в столбец снизу вверх (column-reverse). Значение column и column-reverse не просто разворачивают ряд в столбец - они меняют местами, какая ось главная, а какая поперечная.

Попробуй прямо сейчас: замени flex-direction: row на column - те же три блока встанут друг под другом сверху вниз. Попробуй ещё row-reverse и column-reverse - порядок 1, 2, 3 развернётся на экране.

Четыре значения flex-direction: row, row-reverse, column, column-reverse

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

.container { display: flex; flex-direction: column; } - элементы встанут в столбец сверху вниз.

.item { flex-direction: column; } на отдельном элементе внутри контейнера - flex-direction относится к контейнеру целиком, у отдельного элемента это свойство не имеет смысла и ничего не изменит.

Как flex-direction меняет местами главную и поперечную ось

В уроке про то, что такое Flexbox, уже говорилось, что у flex-контейнера всегда есть главная ось (main axis) и поперечная (cross axis), и что по умолчанию (при row) главная ось горизонтальна. flex-direction - это как раз то свойство, которое задаёт, какая ось будет главной. При row и row-reverse главная ось остаётся горизонтальной: justify-content выравнивает элементы по горизонтали, а align-items - по вертикали. Но при column и column-reverse главная ось становится ВЕРТИКАЛЬНОЙ - и justify-content с align-items меняются ролями: теперь justify-content выравнивает элементы по вертикали, а align-items - по горизонтали. Это одна из самых частых причин путаницы у новичков: один и тот же код с justify-content: center даёт разный результат в зависимости от того, какое значение стоит у flex-direction.

.container { display: flex; flex-direction: column; justify-content: center; } - при column это центрирует элементы ПО ВЕРТИКАЛИ (вдоль главной оси).

.container { display: flex; justify-content: center; }, ожидая вертикальное центрирование - при значении flex-direction по умолчанию (row) justify-content центрирует по ГОРИЗОНТАЛИ, а не по вертикали.

Почему с row-reverse и column-reverse стоит быть осторожнее

row-reverse и column-reverse меняют только то, что видно на экране - порядок элементов в самом HTML-коде остаётся прежним. Из-за этого возникает расхождение: пользователь клавиатуры, переключающийся по элементам клавишей Tab, будет двигаться в исходном порядке HTML, а не в том, что видно на экране, и то же самое сделает скринридер. Если визуальный порядок важен для смысла (например, "сначала вопрос, потом ответ"), а реверс используется просто для красоты раскладки, для части пользователей получится нелогичная последовательность. Общая рекомендация: если нужен другой порядок, по возможности менять порядок прямо в HTML, а не полагаться только на reverse-значения flex-direction.

flex-direction: row; с элементами, расположенными в HTML именно в том порядке, в каком они должны восприниматься.

flex-direction: row-reverse; как единственный способ поменять порядок для важной по смыслу последовательности - визуально порядок поменяется, а для клавиатуры и скринридера - нет.

Из истории В уроке про историю Flexbox уже упоминалось, что самый первый черновик спецификации 2009 года использовал совсем другой синтаксис. Конкретно у направления тогда не было одного свойства - были ДВА разных: box-orient со значениями horizontal/vertical отвечал за саму ориентацию, а box-direction со значениями normal/reverse - за то, с какого конца начинать. При переписывании спецификации в 2011-2012 годах их объединили в одно flex-direction с четырьмя понятными значениями row/row-reverse/column/column-reverse - лишнее разделение на два свойства убрали как часть общего упрощения синтаксиса.

Частые ошибки новичков

ОшибкаЧто происходитКак исправить
Пишут flex-direction на отдельном элементе, а не на контейнере Свойство не действует, направление не меняется flex-direction всегда пишется на элементе с display: flex, а не на его детях
Ждут, что justify-content всегда центрирует по горизонтали При flex-direction: column результат неожиданно оказывается вертикальным центрированием Помнить: justify-content работает вдоль главной оси, а её направление задаёт flex-direction
Используют row-reverse/column-reverse только ради визуального эффекта в смыслово важном порядке Порядок для клавиатуры и скринридера остаётся прежним, получается расхождение Если порядок важен по смыслу - менять его в HTML, а не только визуально через reverse
Путают column (столбец) с обычным блочным потоком без flexbox Кажется, что display: flex не нужен вовсе для расположения "как обычно" column и обычный поток похожи визуально, но только column даёт доступ к justify-content, align-items и другим flex-свойствам

Шпаргалка

Что нужноКак сделать
В строку слева направо (по умолчанию)flex-direction: row;
В строку справа налевоflex-direction: row-reverse;
В столбец сверху внизflex-direction: column;
В столбец снизу вверхflex-direction: column-reverse;
Где применяется свойствотолько на контейнере (display: flex), не на элементах
Что меняется при column/column-reversejustify-content и align-items меняются ролями (главная ось становится вертикальной)

Коротко: отвечаем на вопросы

Можно ли задать flex-direction только одному элементу внутри контейнера?

Нет, flex-direction - свойство самого контейнера целиком, а не отдельных элементов внутри него. Оно всегда одно на весь набор элементов. Если нужно изменить позицию именно одного элемента, для этого есть другие инструменты - например, свойство order меняет порядок конкретного элемента, а align-self выравнивает его отдельно от остальных по поперечной оси.

Как flex-direction влияет на justify-content и align-items?

flex-direction определяет, какая ось главная. При row и row-reverse главная ось горизонтальна, поэтому justify-content выравнивает по горизонтали, а align-items - по вертикали. При column и column-reverse главная ось становится вертикальной, и эти два свойства меняются ролями: justify-content начинает выравнивать по вертикали, а align-items - по горизонтали.

Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×