Як центрувати елементи вертикально та горизонтально у Flexbox
Нижче наведено два загальних рішення щодо центрування.
Один для вертикально вирівняних гнучких елементів ( flex-direction: column
), а другий для горизонтально вирівняних гнучких елементів ( flex-direction: row
).
В обох випадках висота відцентрованих дівок може бути змінною, невизначеною, невідомою, будь-якою. Висота центрированих дівок не має значення.
Ось HTML для обох:
<div id="container"><!-- flex container -->
<div class="box" id="bluebox"><!-- flex item -->
<p>DIV #1</p>
</div>
<div class="box" id="redbox"><!-- flex item -->
<p>DIV #2</p>
</div>
</div>
CSS (крім декоративних стилів)
Коли гнучкі елементи укладаються вертикально:
#container {
display: flex; /* establish flex container */
flex-direction: column; /* make main axis vertical */
justify-content: center; /* center items vertically, in this case */
align-items: center; /* center items horizontally, in this case */
height: 300px;
}
.box {
width: 300px;
margin: 5px;
text-align: center; /* will center text in <p>, which is not a flex item */
}
DEMO
Коли гнучкі елементи укладаються горизонтально:
Відкоригуйте flex-direction
правило з наведеного вище коду.
#container {
display: flex;
flex-direction: row; /* make main axis horizontal (default setting) */
justify-content: center; /* center items horizontally, in this case */
align-items: center; /* center items vertically, in this case */
height: 300px;
}
DEMO
Центрування вмісту елементів гнучких елементів
Область контексту гнучкого форматування обмежена відносинами батько-дитина. Нащадки гнучких контейнерів, що перебувають поза дітьми, не беруть участі у макеті flex та ігнорують властивості flex. По суті, властивості згинання не успадковуються поза дітьми.
Отже, вам завжди потрібно буде застосувати display: flex
або display: inline-flex
батьківський елемент, щоб застосувати властивості flex до дитини.
Для того, щоб вертикально та / або горизонтально центрувати текст або інший вміст, що міститься в елементі flex, зробіть елемент (вкладеним) гнучким контейнером та повторіть правила центрування.
.box {
display: flex;
justify-content: center;
align-items: center; /* for single line flex container */
align-content: center; /* for multi-line flex container */
}
Детальніше тут: Як вертикально вирівняти текст всередині флекси?
Крім того, ви можете застосувати margin: auto
до елемента вмісту елемента flex.
p { margin: auto; }
Дізнайтеся про auto
поля згину тут: Методи вирівнювання гнучких елементів (див. Поле № 56).
Центрування декількох ліній гнучких предметів
Якщо в гнучкому контейнері є кілька ліній (за рахунок обгортання), align-content
властивість буде необхідною для вирівнювання по осі.
З специфікації:
8.4. Упаковка Flex Lines: align-content
властивість
align-content
Властивість поєднується лінії гнучкого контейнера всередині гнучкого контейнера , коли є додатковий простір в поперечної осі, подібно до того , як justify-content
вирівнює окремі елементи в головній осі.
Зауважте, ця властивість не впливає на однолінійний гнучкий контейнер.
Докладніше тут: Як працює flex-обгортка з align-self, items-items та align-content?
Підтримка браузера
Flexbox підтримується всіма основними браузерами, крім IE <10 . Деякі останні версії браузера, такі як Safari 8 та IE10, вимагають префіксів постачальника . Для швидкого способу додавання префіксів використовуйте Autoprefixer . Детальніше у цій відповіді .
Рішення для центрування для старих браузерів
Альтернативне рішення центрування з використанням таблиці CSS та властивостей позиціонування див. У цій відповіді: https://stackoverflow.com/a/31977476/3597276