В последние годы макет CSS достиг совершеннолетия: специальные инструменты для сложных макетов заменили различные обходные пути использования таблиц, плавающего, абсолютного позиционирования и так далее. Flexbox (или модуль Flex Box Layout) был первым из этих выделенных модулей макета, а затем CSS Grid Layout . В этой статье мы предоставляем удобное введение в flexbox.
С введением CSS Grid Layouts вы можете спросить, нужен ли вообще flexbox. Несмотря на то, что они могут частично совпадать, у каждого из них есть свои особые цели и роли в макете CSS. Как правило, самое приятное место для flexbox — это макет в одном измерении (скажем, строка похожих элементов), тогда как Grid идеально подходит для макета в двух измерениях (например, элементов целой страницы).
Тем не менее, flexbox может использоваться для полностраничных макетов и, таким образом, предоставляет удобный запасной вариант для макетов Grid в браузерах, которые еще не поддерживают Grid. (Следует признать, что поддержка Grid быстро распространилась в большинстве современных браузеров , но поддержка flexbox все еще шире, что удобно, если вам нужны макеты для работы в некоторых более старых браузерах.)
Преимущества использования Flexbox
Некоторые из преимуществ flexbox:
- содержимое страницы может быть выложено в любом направлении (влево, вправо, вниз или даже вверх)
- биты содержимого могут иметь обратный или переставленный визуальный порядок
- элементы могут «изгибать» свои размеры в соответствии с доступным пространством и могут быть выровнены относительно их контейнера или друг друга
- достижение макетов с одинаковыми столбцами (независимо от количества содержимого внутри каждого столбца) — очень просто.
Чтобы проиллюстрировать различные свойства и возможности, давайте предположим следующую простую схему для некоторых демонстраций в этой статье:
<div class="example"> <header> header content here </header> <main class="main"> <nav> nav content here </nav> <div class="content"> main content here </div> <aside> aside content here </aside> </main> <footer> footer content here </footer> </div>
Первым шагом является размещение элементов внутри .main
, то есть <nav>
и <aside>
, рядом. Без флексбокса мы, вероятно, разместили бы все три элемента, но заставить его работать так, как хотелось бы, было бы не очень просто. Более того, традиционный способ ведения дел представляет собой хорошо известную проблему: каждый столбец так же высок, как и его содержание. Как следствие, вам нужно будет установить одинаковую высоту для всех трех столбцов, чтобы иметь одинаковую длину, или использовать какой-то вид взлома .
Введите flexbox в помощь.
Давайте согнем
Основным элементом flexbox является новое значение flex
свойства display
, которое необходимо установить для элемента контейнера. Это превращает его детей в «гибкие предметы». Эти предметы приобретают некоторые удобные свойства по умолчанию. Например, они располагаются рядом, а элементы без указанной ширины автоматически занимают оставшееся пространство.
Таким образом, если вы установите display: flex
для .main
, его дочерний элемент .content
автоматически сжимается между <nav>
и <aside>
. Нет больше расчетов, насколько это удобно? В качестве специального бонуса все эти три элемента магически имеют одинаковую высоту.
.main { display: flex; }
Проверьте демо ниже для всех деталей:
Порядок вещей: Flexbox order
Свойство
Еще одним свойством flexbox является возможность легко менять порядок элементов. Давайте предположим, что вы создали вышеупомянутый макет для клиента, и теперь она хочет, чтобы .content
предшествовал <nav>
.
Обычно вы погружаетесь в исходный код HTML и меняете там порядок. С flexbox вы можете выполнить задачу полностью с помощью CSS. Просто установите order
свойства order
.content
значение -1
и столбец содержимого будет первым.
.main { display: flex; } .content { order: -1; }
В этом случае вам не нужно указывать порядок для других столбцов:
Если вы предпочитаете указывать значение свойства order
явно для каждого столбца, вместо этого вы можете установить order
1
для .content
, 2
для <nav>
и 3
для <aside>
.
Исходный код HTML не зависит от стилей CSS с помощью Flexbox
Но ваш клиент еще не удовлетворен. Она хотела бы, чтобы <footer>
был первым элементом на странице, даже до <header>
. Что ж, еще раз, flexbox — ваш друг (хотя в подобных случаях, возможно, было бы лучше обучить вашего клиента, чем следовать его примеру). Поскольку вам нужно переставить не только внутренние элементы, но и внешние, правило display: flex
должно быть установлено для <div class="example">
. Обратите внимание, как вы можете вкладывать flex-контейнеры на своей веб-странице для достижения желаемого результата.
Поскольку <header>
, <main.main>
и <footer>
расположены друг над другом, вам нужно сначала установить вертикальный контекст, что можно быстро сделать с помощью flex-direction: column
. Кроме того, <footer>
получает значение order
-1
чтобы оно отображалось первым на странице. Это так просто.
.example { display: flex; flex-direction: column; } footer { order: -1; }
Итак, если вы когда-нибудь захотите изменить строку элементов в столбец или наоборот, вы можете использовать свойство flex-direction
и установить для него соответственно column
или row
( row
является значением по умолчанию):
Однако с большой силой приходит большая ответственность: имейте в виду, что многие посетители будут использовать клавиатуру для навигации по вашим веб-сайтам на основе flexbox, поэтому, если порядок элементов в источнике HTML не соответствует тому, что появляется на экране, доступность может стать серьезной проблемой. Чтобы узнать больше об этом, не пропустите Порядок исходного кода HTML и Порядок отображения CSS , углубленный анализ именно этой проблемы экспертом по доступности и удобству использования Адрианом Розелли.
Как выровнять элементы с помощью Flexbox
Flexbox также упрощает выравнивание дочерних элементов как по горизонтали, так и по вертикали.
Вы можете применить одинаковое выравнивание ко всем элементам в гибком контейнере с помощью align-items
. Если вам нужны разные выравнивания для отдельных элементов, используйте align-self
. Выравнивание элементов зависит от значения свойства flex-direction
. Если его значение равно row
(то есть элементы проходят по горизонтальной линии), выравнивание применяется к вертикальной оси. Если для flex-direction
установлено значение column
(то есть элементы проходят по вертикальной линии), оно применяется к горизонтальной оси.
Например, у вас есть несколько фигур, которые вы хотите выровнять по-разному внутри элемента контейнера. Тебе нужно: .
- Установите для свойства shape
align-self
каждой фигуры соответствующее значение. Возможные значения:center
,stretch
(элемент расположен так, чтобы соответствовать его контейнеру),flex-start
,flex-end
иbaseline
(элемент расположен на базовой линии своего контейнера) - Установите элемент контейнера для
display:flex
- Наконец, обратите внимание на свойство
flex-direction
в родительском контейнере, поскольку его значение влияет на выравнивание детей.
.example { display: flex; flex-direction: column; } .red { align-self: center; } .blue { align-self: flex-start; } .pink { align-self: flex-end; }
Попробуйте переключить свойство flex-direction
родительского контейнера в демонстрации ниже из row
в column
и наоборот, чтобы увидеть это поведение в действии:
Если все элементы в родительском контейнере должны быть выровнены одинаково, вы можете использовать свойство align-items
в родительском контейнере. Возможные значения: center
, flex-start
, flex-end
, stretch
(значение по умолчанию: элементы растягиваются, чтобы соответствовать их контейнеру) и baseline
(элементы расположены на базовой линии их контейнеров).
.example { display: flex; align-items: center; }
Как обычно, попробуйте переключить значение свойства flex-direction
родительского элемента между row
и column
чтобы увидеть, как меняется эффект значений, применяемых к align-items
:
Обоснование контента с помощью Flexbox
Еще одним свойством выравнивания является justify-content
, которое очень удобно, когда вы хотите равномерно распределить доступное пространство между несколькими элементами.
Допустимые значения: center
, flex-start
, flex-end
, space-between
элементами (элементы располагаются с пробелами между строками) и space-around
(элементы располагаются с пробелом до, между и после строк).
Например, внутри элемента <main>
в простом HTML-шаблоне, который вы использовали все это время, вы можете найти три элемента: <nav>
, .content
и <aside>
. На данный момент они все отодвинуты на левую часть страницы. Если вы хотите отобразить эти три элемента таким образом, чтобы между ними было свободное пространство, но не слева и справа от первого и последнего элементов соответственно, установите justify-content
inside .main
(их родительский контейнер ) к space-between
:
.main { display: flex; justify-content: space-between; }
Попробуйте также поэкспериментировать с space-around
и обратите внимание на разные результаты:
В демонстрации выше я также центрировал текст внутри элемента <header>
как по горизонтали, так и по вертикали, используя justify-content
(горизонтальное центрирование) и align-items
(вертикальное центрирование) и установив их оба по center
:
header { height: 100vh; display: flex; justify-content: center; align-items: center; }
Сгибание размеров элементов с помощью Flexbox
С помощью свойства flex
вы можете контролировать длину вашего элемента относительно других элементов внутри контейнера flex.
Это свойство является сокращением для следующих отдельных свойств:
-
flex-grow
— число, определяющее, насколько элемент будет расти относительно других гибких элементов. -
flex-shrink
— число, указывающее, насколько элемент будет сокращаться относительно других гибких элементов. -
flex-basis
— длина элемента. Допустимые значения:auto
,inherit
или число, за которым следует «%», px , em или любая другая единица длины.
Например, чтобы получить три одинаковых столбца, просто установите flex: 1
для каждого столбца, и все готово:
nav, aside, .content { flex: 1; }
Если вам нужно, чтобы область содержимого была вдвое больше ширины <nav>
и <aside>
, установите flex: 2
для .content
и оставьте две другие .content
1
:
Это самое простое применение свойства flex
, также можно установить значения flex-grow
, flex-shrink
и flex-basis
based, но это выходит за рамки данной статьи.
Дополнительные ресурсы
Если вы готовы двигаться дальше и узнать больше о освоении flexbox, ознакомьтесь со следующими ресурсами:
- Flexbox , платный курс по SitePoint Premium от Гая Роутледжа
- Создание мега-меню с Flexbox
- Как 3 современных инструмента используют сетки Flexbox
- Сделайте формы забавными с Flexbox .
Вывод
Как видите, flexbox может сделать нашу жизнь намного проще, если нам нужно контролировать положение элементов на веб-сайте. Он твердый и делает любые хаки, разрушающиеся контейнеры или другие странные вещи, с которыми нам приходилось иметь дело каждый день, устаревшими.
Как уже упоминалось, в наши дни лучшим вариантом для макета всей страницы является CSS Grid, но все же стоит понять, что может делать flexbox. Приятным моментом для flexbox является выравнивание связанных элементов в одном измерении, но это также удобный запасной вариант для работы Grid в немного более старых браузерах, если это необходимо.