Flexbox: выстраиваем в ряд и в столбец
Зачем:Большинство меню, рядов карточек и шапок сегодня строится на flex. После урока вы выравниваете элементы по двум осям, распределяете место и делаете меню, которое переносится на узком экране.
25 минут
Озвучено синтезом речи (Qwen3-TTS), голос не принадлежит человеку.
Flexbox — раскладка CSS, которая выстраивает дочерние элементы в ряд или в столбец и распределяет место по главной и поперечной осям.
Новая эпоха, новая раскладка
Вы дошли до 2014 года. Большая часть сайтов открывается на телефонах, ширина экранов самая разная, а float как инструмент раскладки уже надоел всем. Тогда в браузерах появляется flexbox (Flexible Box Layout, «гибкие блоки»). Первые черновики спецификации относятся к 2009 году, а окончательный вид, с которым вы сейчас будете работать, закрепился около 2012–2014 годов, и массово им стали пользоваться, когда его поддержали все основные браузеры. Для нашей практики это значит: никаких таблиц и плавающих блоков, ряды и столбцы выстраивают сами.
Контейнер и элементы
Flexbox работает так: вы объявляете родителя flex-контейнером, и его дети становятся flex-элементами, которые выстраиваются в ряд или в столбец.
.menu {
display: flex;
gap: 1rem;
} Две строки, и пункты меню стоят в ряд с промежутком. Теперь два понятия, на которых держится всё остальное:
- главная ось: направление, в котором идут элементы. По умолчанию слева направо (
flex-direction: row). Если сказатьcolumn, то сверху вниз; - поперечная ось перпендикулярна главной.
И два свойства для двух осей: justify-content распределяет элементы по главной оси, а align-items выравнивает по поперечной. Когда меняется направление, оси меняются местами, и вместе с ними меняют работу свойства. Это единственное, что здесь путают. Поиграйте на схеме: смените направление и посмотрите.
.menu {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: stretch;
flex-wrap: nowrap;
gap: 8px;
}Главная ось идёт слева направо: по ней работает justify-content. Поперечная ось перпендикулярна ей: по ней работает align-items. Смените flex-direction, и оси поменяются местами вместе со своими свойствами.
Проверьте себя: что изменится, если flex-direction поменять с row на column?
Главная ось станет вертикальной, и justify-content начнёт распределять элементы сверху вниз, а align-items выравнивать по горизонтали.
Свойства контейнера
display: flexэто включает flexbox;flex-direction: row | column(и-reverse) это куда идут элементы;flex-wrap: wrapэто разрешает переносить элементы на следующую строку. Без него всё стоит в одну линию и, если места не хватает, сжимается или вылезает за край;justify-content: flex-start | center | flex-end | space-between | space-aroundэто распределение по главной оси;align-items: stretch | flex-start | center | flex-endэто выравнивание по поперечной оси;stretch(по умолчанию) растягивает элементы на всю высоту ряда, поэтому карточки одной строки одинаковой высоты;gap: 1remэто расстояние между элементами. Раньше его делали внешними отступами и боролись с лишним отступом у последнего. Для flexboxgapработает во всех современных браузерах с 2021 года.
Свойства элементов
Главное свойство элемента: flex, сокращение из трёх чисел:
.card {
flex: 1 1 14rem;
} Это flex-grow (может ли расти и занимать свободное место), flex-shrink (может ли сжиматься) и flex-basis (желаемый размер до роста и сжатия). Запись flex: 1 1 14rem читается так: «я хочу ширину 14rem, но могу вырасти, чтобы заполнить ряд, и могу сжаться». Из этого получаются карточки, которые сами переносятся на следующую строку: четыре в ряд на широком экране, одна на телефоне. Без единой строки про экран.
Есть ещё align-self (выровнять один элемент иначе) и order (поменять порядок). Со вторым осторожнее: меняется только вид, а порядок с клавиатуры и в программе чтения остаётся прежним. Глаза и диктор разойдутся. Лучше менять порядок самих элементов в HTML.
Из готовых приёмов запомните три:
- шапка: название слева, меню справа:
justify-content: space-between; - центрирование блока по обеим осям (задача, которая раньше считалась дурацкой):
justify-content: center; align-items: center; - «прижать» один элемент вправо:
margin-left: auto.
Проверьте себя: что делает flex: 1 1 14rem?
Желаемая ширина 14rem, но элемент может расти, чтобы заполнить свободное место, и сжиматься, если места мало.
Практика
Новая эпоха, новая страница: в 2014 году ваш сайт заново собран, но без оформления. Ваш styles.css уже содержит базу, как в 2014-м писали «reset»: размеры, шрифты, цвета. Ваша работа раскладка.
Поскольку каждая эпоха собирается заново, файл стилей нужно подключить. Это та же строка, что в 2005-м. Потом вы выстраиваете шапку, меню, основное с боковым и карточки на flexbox. Попробуйте проверить результат сами: потяните границу окна браузера и убедитесь, что меню и карточки переносятся, а не вылезают за край.
Что было не так с 2014 годом
Новая раскладка была хороша, но её по-прежнему писали «настольными» размерами: ширины в пикселях, картинки без запасного размера. В следующих уроках вы доведёте её до адаптивной. Был и другой подвох: у первого flexbox было два разных синтаксиса, а Internet Explorer 10 понимал третий, и авторы писали все варианты подряд. Эта мода ушла вместе с теми браузерами.
Практика
Готовлю вашу страницу…
Тест
Вопрос 1 из 6
Карточки
Эти карточки попадут в повторение, когда вы завершите урок.
Что такое главная и поперечная оси во flexbox?
Ответ
Главная ось идёт по flex-direction (по умолчанию слева направо), поперечная перпендикулярна ей. justify-content работает по главной, align-items по поперечной.
Какие свойства у flex-контейнера?
Ответ
display: flex, flex-direction, flex-wrap, justify-content, align-items и gap. Они управляют тем, как выстраиваются дети.
Что значит flex: 1 1 14rem?
Ответ
flex-grow 1 (может расти), flex-shrink 1 (может сжиматься), flex-basis 14rem (желаемая ширина). Из этого получаются карточки, которые переносятся сами.
Когда flexbox, а когда grid?
Ответ
Flexbox для одного ряда или столбца (меню, шапка, ряд карточек), grid для строк и столбцов вместе (макет страницы, сетка).
Источники
- Flexbox (MDN) CC BY-SA, по-английски
- Flexbox (web.dev) CC BY, по-английски
- Руководство по flexbox — Дока только ссылка, по-русски
- CSS Flexible Box Layout Module Level 1 только ссылка, по-английски
- Flexbox Froggy: игра только ссылка, по-английски
Дальше
Теперь вы знаете: Flexbox.