Розглянемо головну вісь і поперечну вісь гнучких контейнерів:
Джерело: W3C
Щоб вирівняти гнучкі елементи по головній осі, є одна властивість:
Для вирівнювання гнучких елементів по поперечній осі є три властивості:
На зображенні вище головна вісь горизонтальна, а поперечна вісь - вертикальна. Це типові вказівки flex-контейнера.
Однак ці вказівки можна легко змінити із flex-direction
властивістю.
/* main axis is horizontal, cross axis is vertical */
flex-direction: row;
flex-direction: row-reverse;
/* main axis is vertical, cross axis is horizontal */
flex-direction: column;
flex-direction: column-reverse;
(Поперечна вісь завжди перпендикулярна до головної осі.)
Моя думка в описі того, як працюють осі, полягає в тому, що в жодному напрямку не здається нічого особливого. Основна вісь, поперечна вісь, вони обидві за рівнем важливості і flex-direction
полегшують перемикання вперед і назад.
То чому поперечна вісь отримує два додаткові властивості вирівнювання?
Чому align-content
і align-items
об'єднані в одну властивість для головної осі?
Чому головна вісь не отримує justify-self
властивості?
Сценарії, де ці властивості були б корисні:
розміщення гнучких предметів у куті гнучких контейнерів
#box3 { align-self: flex-end; justify-self: flex-end; }
зробити групу гнучких елементів вирівняти праворуч (
justify-content: flex-end
), але перший елемент вирівняти ліворуч (justify-self: flex-start
)Розглянемо розділ заголовка з групою елементів навігації та логотипом. З
justify-self
логотипом можна вирівняти ліворуч, а елементи навігації залишаються вправо, і вся рівномірне налаштування ("згинається") під різні розміри екрана.в ряд з трьох гнучких елементів прикріпіть середній елемент до центру контейнера (
justify-content: center
) і вирівняйте сусідні елементи до країв контейнера (justify-self: flex-start
іjustify-self: flex-end
).Зверніть увагу , що значення
space-around
іspace-between
наjustify-content
майно не буде тримати середній елемент в центрі навколо контейнера , якщо сусідні елементи мають різну ширину.
На момент написання статті, немає жодної згадки justify-self
або justify-items
в Flexbox специфікації .
Однак у модулі вирівнювання коробки CSS , який є незавершеною пропозицією W3C встановити загальний набір властивостей вирівнювання для використання у всіх моделях коробки, є таке:
Джерело: W3C
Ви помітите, що justify-self
і justify-items
вас розглядають ... але не для flexbox .
Я закінчу ще раз, повторивши головне питання:
Чому немає властивостей "justify-items" та "justify-self"?
justify-content: flex-start
, тому предмети переповнені на початку, як | abcd |. Що б ви очікували від цього, якщо ви поставите там justify-self: [anything]
пункт "b"?)
justify-self
працювати на флекс-елемент? Я б сказав, не так інакше, ніж auto
надбавки вже працюють на гнучких предметах. У вашому другому прикладі, justify-self: flex-end
пункт d перемістить його в крайній край. Це саме по собі було б чудовою особливістю, яку auto
можна зробити вже на полях. Я поставив відповідь з демонстрацією.
justify-content
і justify-self
вказано, щоб випадки з конфліктами (як сценарії, про які я запитував) чітко і чітко визначені. Як я зазначив у своїй відповіді тут, йдеться{justify|align}-self
про вирівнювання елементів у більшому полі, розміром якого є незалежне від {justify|align}-self
значення, - а в головній осі немає такого поля, для якого вирівнюватиметься гнучкий елемент.
justify-self
та justify-content
чи взаємодіяли б у випадках, коли вони конфліктують (як сценарії, які я виклав). Автоматичні націнки просто взагалі не взаємодіють justify-content
- вони вкрадають увесь пробірний простір, перш ніж justify-content
отримують можливість його використовувати. Отже, автоматичні поля не є дуже хорошим аналогом того, як це буде працювати.
justify-self
працювати на гнучкий предмет? Припустимо, у вас є елементи a, b, c, d з додатковим простором для розповсюдження навколо них, а контейнер flex маєjustify-content: space-between
, тому вони закінчуються як | abcd |. Що би означало додати, наприклад,justify-self: center
або "виправдати себе": "flex-end" просто до пункту "b"? Куди б ви очікували, що це піде? (Я бачу деякі демонстрації в одній з відповідей тут, але я не бачу чіткого способу, як це працювало б взагалі.)