Методи вирівнювання гнучких предметів уздовж основної осі
Як зазначено у запитанні:
Щоб вирівняти гнучкі елементи по головній осі, є одна властивість: justify-content
Щоб вирівняти нежорсткі елементи уздовж поперечної осі є три властивості: align-content
, align-items
іalign-self
.
Далі питання задає:
Чому немає justify-items
і justify-self
властивості?
Одна відповідь може бути: Тому що вони не потрібні.
Специфікація flexbox передбачає два способи вирівнювання гнучких елементів по головній осі:
justify-content
Ключова властивість, і
auto
поля
виправдання-зміст
У justify-content
поєднується власності згинати елементи уздовж головної осі гнучкого контейнера.
Він застосовується до гнучких контейнерів, але стосується лише гнучких предметів.
Існує п'ять варіантів вирівнювання:
flex-start
~ Елементи гнучкості упаковуються до початку рядка.
flex-end
~ Елементи гнучкості упаковуються в кінці рядка.
center
~ Елементи гнучкості упаковуються до центру лінії.
space-between
~ Елементи гнучкості розташовані рівномірно, при цьому перший елемент вирівняний до одного краю контейнера, а останній - до протилежного краю. Краї, використані першими та останніми елементами, залежать від режимуflex-direction
та режиму запису ( ltr
або rtl
).
space-around
~ Те саме, що, space-between
окрім проміжків напіврозміру на обох кінцях.
Автополе
З auto
полем гнучких елементів можна відцентрувати, відставити або упакувати в підгрупи.
На відміну від того justify-content
, який застосовується до гнучких контейнерів, auto
поля відрізняються від гнучких елементів.
Вони працюють, витрачаючи весь вільний простір у вказаному напрямку.
Вирівняйте групу гнучких елементів праворуч, але перший елемент ліворуч
Сценарій з питання:
зробити групу гнучких елементів вирівняти праворуч ( justify-content: flex-end
), але перший елемент вирівняти ліворуч ( justify-self: flex-start
)
Розглянемо розділ заголовка з групою елементів навігації та логотипом. З
justify-self
логотипом можна вирівняти ліворуч, а елементи навігації залишаються вправо, і вся рівномірне налаштування ("згинається") під різні розміри екрана.
Інші корисні сценарії:
Помістіть гнучкий предмет у кут
Сценарій з питання:
- розміщення гнучких предметів у кутку
.box { align-self: flex-end; justify-self: flex-end; }
Центруйте гнучкий елемент вертикально і горизонтально
margin: auto
є альтернативою justify-content: center
іalign-items: center
.
Замість цього коду на контейнері flex:
.container {
justify-content: center;
align-items: center;
}
Ви можете використовувати це на елементі flex:
.box56 {
margin: auto;
}
Ця альтернатива корисна при центруванні гнучких елементів, які переповнюють контейнер .
Відцентруйте гнучкий елемент і відцентруйте другий гнучкий елемент між першим і краєм
Гнучка ємність вирівнює гнучкі предмети, розподіляючи вільний простір.
Отже, щоб створити рівний баланс , щоб середній предмет міг бути центрований у контейнері з одним елементом поруч, слід ввести противагу.
У наведених нижче прикладах невидимі елементи третього гнучкості (поля 61 та 68) вводяться для врівноваження "реальних" предметів (вікна 63 та 66).
Звичайно, цей метод не є нічого великого з точки зору семантики.
Крім того, ви можете використовувати псевдоелемент замість фактичного елемента DOM. Або ви можете використовувати абсолютне позиціонування. Усі три методи охоплені тут: центральні та вирівняні внизу гнучкі елементи
ПРИМІТКА. Наведені вище приклади спрацьовуватимуть - лише з точки зору справжнього центрування - тоді, коли самі зовнішні елементи мають рівну висоту / ширину. Коли гнучкі елементи різної довжини див. Наступний приклад.
Відцентруйте гнучкий елемент, коли сусідні елементи різняться за розміром
Сценарій з питання:
в ряд з трьох гнучких предметів прикріпіть середній елемент до центру контейнера (justify-content: center
) і вирівняйте сусідні елементи до країв контейнера ( justify-self: flex-start
і
justify-self: flex-end
).
Зверніть увагу , що значення space-around
і space-between
на justify-content
майно не будуть тримати середній елемент центрована по відношенню до контейнера , якщо сусідні елементи мають різну ширину ( див демонстраційних ).
Як зазначалося, якщо всі гнучкі елементи не мають однакової ширини чи висоти (залежно від flex-direction
), середній елемент не може бути по-справжньому по центру. Ця проблема є вагомим приводом для justify-self
властивості (призначена, звичайно, для вирішення завдання).
#container {
display: flex;
justify-content: space-between;
background-color: lightyellow;
}
.box {
height: 50px;
width: 75px;
background-color: springgreen;
}
.box1 {
width: 100px;
}
.box3 {
width: 200px;
}
#center {
text-align: center;
margin-bottom: 5px;
}
#center > span {
background-color: aqua;
padding: 2px;
}
<div id="center">
<span>TRUE CENTER</span>
</div>
<div id="container">
<div class="box box1"></div>
<div class="box box2"></div>
<div class="box box3"></div>
</div>
<p>The middle box will be truly centered only if adjacent boxes are equal width.</p>
Ось два способи вирішення цієї проблеми:
Рішення №1: Абсолютне позиціонування
Специфікація flexbox дозволяє абсолютно позиціонувати гнучкі елементи . Це дозволяє ідеально орієнтувати середній предмет незалежно від розміру його побратимів.
Просто пам’ятайте, що, як і всі абсолютно розташовані елементи, елементи вилучаються з документообігу . Це означає, що вони не займають місця в контейнері і можуть перекривати своїх побратимів.
У наведених нижче прикладах середній елемент зосереджений з абсолютним розміщенням, а зовнішні елементи залишаються потоковими. Але таку ж макет можна досягти і зворотним способом: відцентруйте середній елемент justify-content: center
і абсолютно розташуйте зовнішні елементи.
Рішення №2: Вкладені контейнери Flex (немає абсолютного позиціонування)
.container {
display: flex;
}
.box {
flex: 1;
display: flex;
justify-content: center;
}
.box71 > span { margin-right: auto; }
.box73 > span { margin-left: auto; }
/* non-essential */
.box {
align-items: center;
border: 1px solid #ccc;
background-color: lightgreen;
height: 40px;
}
<div class="container">
<div class="box box71"><span>71 short</span></div>
<div class="box box72"><span>72 centered</span></div>
<div class="box box73"><span>73 loooooooooooooooong</span></div>
</div>
Ось як це працює:
- Діва верхнього рівня (
.container
) - це гнучка ємність.
- Кожен дочірній div (
.box
) тепер є гнучким елементом.
- Кожен
.box
елемент задається flex: 1
для того, щоб розподілити простір контейнера порівну.
- Тепер елементи займають увесь простір в ряду і мають рівну ширину.
- Зробіть кожен елемент (вкладеним) гнучким контейнером та додайте
justify-content: center
.
- Тепер кожен
span
елемент є центрованим гнучким елементом.
- Використовуйте гнучкі
auto
поля для зміщення зовнішніх span
s вліво та вправо.
Ви також можете відмовитися justify-content
і використовуватиauto
виключно маржі.
Але justify-content
тут можна працювати, оскільки auto
пріоритет завжди має пріоритет. З специфікації:
8.1. Вирівнювання з auto
маржами
Перед вирівнюванням через justify-content
та align-self
будь-який позитивний вільний простір розподіляється на автоматичні поля в цьому вимірі.
виправдати-зміст: простір-те саме (концепція)
Повернувшись на justify-content
хвилину, ось ідея ще одного варіанту.
space-same
~ Гібрид space-between
і space-around
. Елементи гнучкості розташовані рівномірно (на зразок space-between
), за винятком того, що на обох кінцях є напіврозмірні проміжки (як space-around
), на обох кінцях є повнорозмірні простори.
Це розташування може бути досягнуто з ::before
і ::after
псевдо-елементів на гнучкому контейнері.
(кредит: @oriol для коду та @crl для мітки)
ОНОВЛЕННЯ: браузери почали впроваджувати space-evenly
, що виконує вищесказане. Детальніше дивіться у цій публікації: Рівний простір між елементами гнучкості
PLAYGROUND (включає код для всіх прикладів вище)
justify-self
працювати на гнучкий предмет? Припустимо, у вас є елементи a, b, c, d з додатковим простором для розповсюдження навколо них, а контейнер flex маєjustify-content: space-between
, тому вони закінчуються як | abcd |. Що би означало додати, наприклад,justify-self: center
або "виправдати себе": "flex-end" просто до пункту "b"? Куди б ви очікували, що це піде? (Я бачу деякі демонстрації в одній з відповідей тут, але я не бачу чіткого способу, як це працювало б взагалі.)