Шикування елементів у гнучкому контейнері

Одна з причин того, що Флексбокс ("гнучкі рамки") швидко захопив інтерес веброзробників – те, що ця концепція вперше принесла у Веб годящу можливість шикування. Стало можливим пристойно виконувати вертикальне вирівнювання, так що, врешті решт, можна легко відцентрувати елемент. У цих настановах – докладний огляд того, як властивості шикування та вирівнювання працюють у Флексбоксі.

Аби відцентрувати елемент, слід використати властивість align-items, шикуючи елемент за поперечною віссю, котра у цьому випадку є вертикальною віссю блока. Слід використати justify-content, аби шикувати елемент за основною віссю, котра у цьому випадку є горизонтальною рядковою віссю.

Елемент-контейнер з іншим елементом, вміщеним у ньому.

Погляньте на код прикладу нижче. Змініть розмір контейнера чи вкладеного елемента, – вкладений елемент завжди залишатиметься відцентрованим.

Властивості, що керують шикуванням

У цих настановах розглядаються наступні властивості:

  • justify-content — керує шикуванням всіх елементів на головній осі.
  • align-items — керує шикуванням всіх елементів на поперечній осі.
  • align-self — керує шикуванням окремого гнучкого елемента на поперечній осі.
  • align-content — описана у специфікації як "нагромадження гнучких рядків"; керує простором між гнучкими рядками на поперечній осі.
  • gap, column-gap та row-gap — використовуються для створення вертикальних і горизонтальних розривів між гнучкими елементами.

Іще одна тема для розгляду – те, як автоматичні зовнішні поля можуть бути використані для шикування у гнучких контейнерах.

Поперечна вісь

Властивості align-items та align-self керують шикуванням елементів гнучкої розкладки на поперечній осі – у колонках, якщо значення властивості flex-directionrow, і у рядах, якщо flex-directioncolumn.

Погляньмо на використання шикування на поперечній осі у найпростішому прикладі гнучкої розкладки. Якщо додати контейнерові display: flex, то дочірні елементи стануть гнучкими елементами, впорядкованими у ряд. Вони будуть розтягнені, аби бути настільки ж високими, як найвищий елемент, оскільки такий елемент визначає висоту елементів на поперечній осі. Якщо гнучкий контейнер має явно вказану висоту, то всі елементи розтягнуться до його висоти, незалежно від того, скільки вмісту вони мають.

Три елементи, один з яких має додатковий текст, внаслідок чого є вищим за решту.

Три елементи, розтягнені до 200 пікселів висоти кожен

Причиною того, що елементи отримують однакову висоту, є те, що початкове значення align-items, властивості, котра керує шикуванням на поперечній осі, – stretch (розтягування).

Можна використати інші значення, аби керувати шикуванням елементів:

  • align-items: flex-start (шикувати до початку гнучкого контейнера)
  • align-items: flex-end (шикувати до кінця гнучкого контейнера)
  • align-items: center (шикувати до центру)
  • align-items: stretch (розтягнути)
  • align-items: baseline (шикувати за основною лінією)

У живому прикладі нижче значення align-itemsstretch. Спробуйте інші значення і перевірте, як елементи шикуватимуться відносно одне одного у flex-контейнері.

Вирівнювання одного певного елемента за допомогою align-self

Властивість align-items встановлює значення властивості align-self на всіх гнучких елементах як на групі. Отже, можна явно оголосити властивість align-self, аби точково вплинути на один елемент. Властивість align-self приймає такі ж значення, як align-items, і на додачу – auto, котре скидає значення до визначеного гнучким контейнером.

У наступному живому прикладі гнучкий контейнер має align-items: flex-start, а тобто – усі елементи вишикувані до початку поперечної осі. Перший елемент обрано за допомогою селектора first-child, і вказано йому align-self: stretch; інший елемент був обраний за допомогою свого класу selected, йому додано align-self: center. Можна змінити значення align-items або змінити значення align-self на окремих елементах, аби побачити, як це працює.

Переміна головної осі

Досі розглядалась поведінка шикування у гнучкому контейнері за умови, що значення flex-directionrow (ряд), і мова використовує написання рядків згори донизу. Це означає, що головна вісь напрямлена вздовж ряду – горизонтально, а шикування поперечної осі рухає елементи вгору-вниз.

Три елементи, серед котрих перший вишикуваний до початку гнучкого контейнера, другий – до центру, третій – до кінця гнучкого контейнера. Шикування на вертикальній осі.

Якщо змінити flex-direction на колонкову, то align-items і align-self шикуватимуть елементи вліво-вправо.

Три елементи, серед яких перший вишикуваний до початку гнучкого контейнера, другий – до центру, третій – до кінця гнучкого контейнера. Шикування на горизонтальній осі.

В прикладі нижче можна це спробувати у гнучкому контейнері із flex-direction: column, що у решті є ідентичним до попереднього прикладу.

Шикування вмісту на поперечній осі – властивість align-content

Досі у прикладах цієї статті шикувались елементи, або окремий елемент, всередині області, визначеної гнучким контейнером. Якщо є гнучкий контейнер з кількома рядами вмісту, можна також використати властивість align-content, щоб керувати розподілом простору між рядами. У специфікації це описано як нагромадження гнучких рядків (англ.).

Щоб align-content працювала, гнучкий контейнер повинен мати більшу висоту, ніж необхідно для показу елементів. Тоді це працює на усіх елементах як на групі, і диктує поведінку вільного простору, а також шикування усієї групи елементів в ньому.

Властивість align-content приймає наступні значення:

  • align-content: flex-start
  • align-content: flex-end
  • align-content: center
  • align-content: space-between
  • align-content: space-around
  • align-content: stretch
  • align-content: space-evenly (не визначене у специфікації Флексбоксу)

У живому прикладі нижче гнучкий контейнер має висоту 400 пікселів, а це більше, ніж потрібно для показу елементів. Значення align-contentspace-between, тож доступний простір розподілений між гнучкими рядами, котрі розташовані рівномірно між початком та кінцем контейнера на поперечній осі.

Спробуйте інші значення і перевірте, як працює властивість align-content.

Іще раз повернімось до значення flex-direction column, аби перевірити, як ця властивість поводиться при роботі з колонками. Як і раніше, потрібно більше простору на поперечній осі, щоб мати трохи вільного місця, не зайнятого елементами.

Примітка: Значення space-evenly не описане специфікацією Флексбоксу і є пізнішим додатком до специфікації Box Alignment. Підтримка браузерами цього значення не є такою доброю, як для інших значень, описаних у специфікації Флексбоксу.

Шикування вмісту на головній осі

Після шикування на поперечній осі – варто розглянути головну ось. Для шикування на ній доступна єдина властивість — justify-content. Причина цього – те, що на головній осі елементи обробляються лише як група. За допомогою justify-content можна керувати тим, що відбувається із доступним простором, якщо доступно більше простору, ніж необхідно для показу елементів.

У прикладі вище з display: flex на контейнері елементи показані як ряд, вишикуваний на початку контейнера. Так відбувається, тому що початкове значення justify-contentflex-start. Будь-який доступний додатковий простір залишається в кінці ряду елементів.

Три елементи, кожен 100 пікселів завширшки, у 500-піксельному контейнері. Доступний простір – в кінці ряду елементів.

Властивість justify-content приймає такі ж значення, як align-content.

  • justify-content: flex-start
  • justify-content: flex-end
  • justify-content: center
  • justify-content: space-between
  • justify-content: space-around
  • justify-content: space-evenly (не визначений у специфікації Флексбоксу)

У прикладі нижче значення justify-contentspace-between. Доступний простір, не зайнятий елементами, розподілений у проміжках між елементами. Крайній лівий та правий елементи розташовані безпосередньо на початку та в кінці рядка, відповідно.

Якщо головна вісь збігається із блоковим напрямком (значення flex-directioncolumn), то justify-content розподілятиме простір між елементами у відповідному вимірі доти, доки у гнучкому контейнері більше не залишиться простору для розподілу.

Шикування та режими письма

Не забуваймо, що для усіх методів шикування дія значень flex-start та flex-end залежить від режиму письма. Якщо значення justify-contentflex-start, а режим письма - зліва направо, як в українській мові, то елементи будуть шикуватися з лівого боку контейнера.

Три елементи, вишикувані зліва

Втім, якщо режим письма – справа наліво, як в арабській мові, елементи шикуватимуться починаючи з правого боку контейнера.

Три елементи, вишикувані справа

Живий приклад нижче має властивість direction, встановлену у значення rtl, щоб примусити елементи до плину справа наліво. Це можна прибрати, або встановити значення властивості justify-content, щоб перевірити поведінку flexbox в умовах, коли початок рядків знаходиться справа.

Шикування та flex-direction

Початок рядка також зміниться, якщо змінити значення властивості flex-direction — наприклад, вказати row-reverse замість row.

У наступному прикладі елементи розкладені із flex-direction: row-reverse та justify-content: flex-end. У мовах зліва направо елементи вишикуються зліва. Спробуйте замінити flex-direction: row-reverse на flex-direction: row. Елементи перемістяться до правого краю.

Це може трохи спантеличувати, втім, слід запам'ятати правило: поки не вказано інакше, гнучкі елементи розкладаються у тому напрямку, в якому ставлять літери тієї мови, яку має документ в цілому, вздовж рядкової, горизонтальної осі. flex-start, таким чином, буде там, де почалось би речення.

Діаграма, що показує початок зліва та кінець справа.

Можна перемкнутись на показ у блоковому (вертикальному) напрямку для мови документа, встановивши flex-direction: column. Тоді flex-start буде там, де почався б перший абзац тексту.

Діаграма, що показує початок згори й кінець внизу.

Якщо змінити flex-direction на одне зі зворотних значень, то елементи розставлятимуться починаючи від кінця осі у зворотному порядку до написання слів мовою документа. flex-start тоді означатиме кінець тієї осі – тож місце, де б відбувалось перенесення (при роботі з рядами), або кінець останнього параграфа тексту (при роботі з колонками).

Діаграма, що показує початок справа і кінець зліва.

Діаграма, що показує кінець згори й початок знизу

Використання автоматичних зовнішніх полів для шикування головної осі

Немає властивостей justify-items чи justify-self на головній осі, оскільки елементи на цій осі обробляються як єдина група. Втім, можливо виконати певне окреме шикування для відділення елемента чи групи елементів від решти за допомогою автоматичних зовнішніх полів вкупі із flexbox.

Загальноприйнятим зразком є панель навігації, на котрій певні ключові елементи вишикувані до правого краю, а головна група – до лівого. Можна було б припустити, що це має бути приклад використання властивості justify-self, однак погляньмо на зображення нижче. Є три елементи з одного боку і два з іншого. Якби можна було використати justify-self на елементі d, це б також змінило шикування елемента e, який йде наступним, що може бути як доречним, так і небажаним.

П'ять елементів у двох групах. Три зліва, два справа.

Замість цього, можна взяти 4 елемент і відділити його від перших трьох елементів, вказавши його властивості margin-left значення auto. Автоматичні зовнішні поля займають увесь простір, котрий можуть, за своєю віссю, – так працює центрування блока за допомогою автоматичних лівого та правого зовнішніх полів. Кожен бік намагається захопити стільки простору, скільки може, і блок виштовхується в середину.

У наступному живому прикладі гнучкі елементи утворюють ряд із базовими значеннями flex, а клас push має margin-left: auto. Можна спробувати прибрати це, або додати клас до іншого елемента, щоб перевірити, як це вплине.

Утворення розривів між елементами

Щоб створити розрив між гнучкими елементами, слід використати властивості gap, column-gap та row-gap. Властивість column-gap утворює розриви між елементами в ряду. Властивість row-gap утворює розриви між гнучкими рядами, коли властивість flex-wrap має значення wrap. Властивість gap – скорочений спосіб вказати обидві вищезгадані властивості разом.

Дивіться також