Проблема
Flexbox робить центрування дуже легким.
Просто приклавши align-items: center
та justify-content: center
до гнучких контейнерів, ваш елемент (і) згину буде розташований по центру вертикально та горизонтально.
Однак при цьому методі існує проблема, коли гнучка деталь більша, ніж гнучка ємність.
Як зазначається в питанні, коли гнучкий предмет переповнює контейнер, верх стає недоступним.
Для горизонтального переповнення лівий розділ стає недоступним (або правий розділ, мовами RTL).
Ось приклад з контейнером LTR, який містить justify-content: center
три гнучкі елементи:
Дивіться нижню частину цієї відповіді для пояснення такої поведінки.
Рішення №1
Щоб вирішити цю проблему , замість цього використовуйте автоматичні поля поля flexboxjustify-content
.
З auto
полями, що переливається гнучким елементом, можна по центру вертикально та горизонтально, не втрачаючи доступу до будь-якої його частини.
Тож замість цього коду на контейнері flex:
#flex-container {
align-items: center;
justify-content: center;
}
Використовуйте цей код на елементі flex:
.flex-item {
margin: auto;
}
Переглянута демонстрація
Рішення №2 (ще не реалізовано в більшості браузерів)
Додайте safe
значення до правила вирівнювання ключових слів, наприклад:
justify-content: safe center
або
align-self: safe center
З специфікації модуля вирівнювання коробки CSS :
4.4. Вирівнювання переповнення: safe
та unsafe
ключові слова та обмеження безпеки прокрутки
Коли [гнучка деталь] більша, ніж [гнучка ємність], вона переповниться. Деякі режими вирівнювання, якщо їх буде застосовано в цій ситуації, можуть спричинити втрату даних: наприклад, якщо вміст бічної панелі в центрі, при переповненні вони можуть надіслати частину своїх полів повз початковий край огляду, на який неможливо прокрутити .
Для управління цією ситуацією можна чітко вказати режим вирівнювання переповнення . Unsafe
вирівнювання вшановує заданий режим вирівнювання у ситуаціях переповнення, навіть якщо це спричиняє втрату даних, тоді як safe
вирівнювання змінює режим вирівнювання у ситуаціях переповнення, намагаючись уникнути втрати даних.
Поведінка за замовчуванням полягає в тому, щоб містити об'єкт вирівнювання в області прокрутки, хоча на момент написання ця функція безпеки ще не реалізована.
safe
Якщо розмір [flex item] переповнює [flex контейнер], замість [flex item] вирівнюється так, як якщо б режим вирівнювання був [ flex-start
].
unsafe
Незалежно від відносних розмірів [гнучкої деталі] та [гнучких контейнерів], задане значення вирівнювання враховується.
Примітка: Модуль вирівнювання коробки призначений для використання в декількох моделях компонування коробки, а не просто гнучкий. Отже, у викладі специфікації вище, терміни в дужках насправді говорять про "вирівнювання предмета", "контейнер вирівнювання" та " start
". Я використовував специфічні терміни, щоб зосередити увагу на цій конкретній проблемі.
Пояснення щодо обмеження прокрутки з MDN:
Міркування про гнучкі елементи
Властивості вирівнювання Flexbox роблять "справжнє" центрування, на відміну від інших методів центрування у CSS. Це означає, що гнучкі елементи залишаться в центрі, навіть якщо вони переповнюють гнучку ємність.
Іноді це може бути проблематично, якщо вони переповнюють верхній край сторінки або лівий край [...], оскільки ви не можете прокрутити до цієї області, навіть якщо там вміст!
У майбутньому випуску властивості вирівнювання будуть розширені, щоб мати можливість і "безпечного".
Наразі, якщо це викликає занепокоєння, ви можете замість цього використовувати поле для досягнення центрування, оскільки вони відповідатимуть "безпечним" способом і зупинятимуть центрування, якщо вони переповняться.
Замість використання align-
властивостей просто покладіть auto
поля на гнучкі елементи, які ви хочете відцентрувати.
Замість justify-
властивостей поставте автоматичні поля на зовнішніх краях першого та останнього гнучких елементів у контейнері flex.
У auto
полях будуть «прогинаються» і представлять , незайняте простір, центрування гнучких елементів , коли є пережиток простору, і перехід на нормальне вирівнювання , коли немає.
Однак, якщо ви намагаєтеся замінити justify-content
центром на основі маржі в багаторядковому флексі, вам, мабуть, не пощастило, оскільки вам потрібно поставити поля на перший і останній елемент flex у кожному рядку. Якщо ви не зможете заздалегідь передбачити, які елементи будуть знаходитись у рядку, ви не можете надійно використовувати центрування на основі поля на головній осі для заміни justify-content
властивості.