Flexbox: центр по горизонтали и вертикали


672

Как центрировать div горизонтально и вертикально внутри контейнера, используя flexbox. В приведенном ниже примере я хочу, чтобы каждое число находилось ниже друг друга (в строках), которые расположены по центру по горизонтали.

.flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
}
<div class="flex-container">
  <div class="row">
    <span class="flex-item">1</span>
  </div>
  <div class="row">
    <span class="flex-item">2</span>
  </div>
  <div class="row">
    <span class="flex-item">3</span>
  </div>
  <div class="row">
    <span class="flex-item">4</span>
  </div>
</div>

http://codepen.io/anon/pen/zLxBo



У вас есть CSS, row{который не влияет на строки. Если вы измените его, .row{результат будет совершенно другим.
Хамид Майели

Ответы:


753

Я думаю, что вы хотите что-то вроде следующего.

html, body {
    height: 100%;
}
body {
    margin: 0;
}
.flex-container {
    height: 100%;
    padding: 0;
    margin: 0;
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    align-items: center;
    justify-content: center;
}
.row {
    width: auto;
    border: 1px solid blue;
}
.flex-item {
    background-color: tomato;
    padding: 5px;
    width: 20px;
    height: 20px;
    margin: 10px;
    line-height: 20px;
    color: white;
    font-weight: bold;
    font-size: 2em;
    text-align: center;
}
<div class="flex-container">
    <div class="row"> 
        <div class="flex-item">1</div>
        <div class="flex-item">2</div>
        <div class="flex-item">3</div>
        <div class="flex-item">4</div>
    </div>
</div>

Смотрите демонстрацию по адресу: http://jsfiddle.net/audetwebdesign/tFscL/

Ваш .flex-item элементы должны быть на уровне блока ( divа не span), если вы хотите, чтобы высота и верхний / нижний отступы работали правильно.

Кроме того, на .row установите ширину autoвместо 100%.

Ваши .flex-containerсвойства в порядке.

Если вы хотите, .rowчтобы центр по вертикали находился в окне просмотра, присвойте высоту 100%html и body, а также обнулите bodyполя.

Обратите внимание, что .flex-container для просмотра эффекта вертикального выравнивания необходима высота, в противном случае контейнер вычисляет минимальную высоту, необходимую для вложения содержимого, которая в этом примере меньше высоты порта просмотра.

Сноска: , ,
flex-flowflex-directionflex-wrap свойства могли бы сделать этот проект проще реализовать. Я думаю, что .rowконтейнер не нужен, если вы не хотите добавить стили вокруг элементов (фоновое изображение, границы и т. Д.).

Полезный ресурс: http://demo.agektmr.com/flexbox/


5
Элементы Flex не обязательно должны быть блочного уровня, если это не требуется для содержимого, которое они содержат. Кроме того, вы добавили префикс ко всем свойствам отображения, но не добавили префикс к другим свойствам Flexbox (которые имеют другие имена в других черновиках).
Цимманон

1
@cimmanon Я согласен с вами по поводу уровня блоков, и я соответственно отредактировал свой пост. Уровень блока не требуется для выравнивания, но может потребоваться, если пользователь хочет указать высоту и так далее. Я взял на себя смелость по поводу браузерных префиксов, я просто предложил идеальный браузер для того, чтобы прийти к рабочей демонстрации. Еще раз спасибо за ваш комментарий, благодарю за отзыв.
Марк Одет

1
Если он переполнен, он обрезает верх. i.imgur.com/3dgFfQK.png Есть ли способ избежать этого?
Брайан Гейтс

1
@BrianGates Если высота окна слишком мала, как вы хотите, чтобы отображались 4 элемента: 2x2, 1x4?
Марк Одет


253

Как центрировать элементы по вертикали и горизонтали во 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. По сути, гибкие свойства не наследуются за пределами детей.

Следовательно, вам всегда нужно применять display: flexили display: inline-flexк родительскому элементу, чтобы применить свойства flex к дочернему элементу.

Для вертикального и / или горизонтального центрирования текста или другого содержимого, содержащегося в гибком элементе, сделайте элемент (вложенным) гибким контейнером и повторите правила центрирования.

.box {
    display: flex;
    justify-content: center;
    align-items: center;        /* for single line flex container */
    align-content: center;      /* for multi-line flex container */
}

Подробнее здесь: Как выровнять текст по вертикали во flexbox?

Кроме того, вы можете применить margin: autoк элементу содержимого элемента flex.

p { margin: auto; }

Узнайте о autoполях сгиба здесь: Методы выравнивания элементов Flex (см. Вставку № 56).


Центрирование нескольких строк изгибаемых элементов

Когда гибкий контейнер имеет несколько строк (из-за переноса), align-contentсвойство будет необходимо для выравнивания по оси.

Из спецификации:

8.4. Упаковочные линии Flex: align-content собственность

align-contentСвойство совмещается линии гибкого контейнера внутри гибкого контейнера , когда имеется дополнительное пространство в поперечной оси, подобно тому , как justify-contentВыравнивает отдельные элементы в главной оси. Обратите внимание, что это свойство не влияет на однострочный гибкий контейнер.

Подробнее здесь: Как flex-wrap работает с align-self, align-items и align-content?


Поддержка браузера

Flexbox поддерживается всеми основными браузерами, кроме IE <10 . В некоторых последних версиях браузеров, таких как Safari 8 и IE10, требуются префиксы поставщиков . Для быстрого добавления префиксов используйте Autoprefixer . Подробнее в этом ответе .


Центрирующее решение для старых браузеров

Для альтернативного решения для центрирования, использующего таблицу CSS и свойства позиционирования, смотрите этот ответ: https://stackoverflow.com/a/31977476/3597276


Можем ли мы сделать это горизонтально вправо, влево и вертикально по центру?
Капил

2
@kapil, настройте свойство justify-content на интервал между пробелами и пробелами ... jsfiddle.net/8o29y7pd/105
Майкл Бенджамин

3
Этот ответ должен быть на вершине. Использование Flex должно быть предпочтительным способом сделать это, так как он хорошо масштабируется на разных устройствах и экранах. Это гораздо проще, чем использовать float и управлять несколькими div-ами.
SeaWarrior404

Т.е. 11 не работает должным образом по горизонтали и по вертикали в центре
GiveJob

1
Идеальный ответ, наверное, лучший в Google!
ЯНВ

43

Добавить

.container {
    display: flex;
    justify-content: center;
    align-items: center;
}

к элементу контейнера того, что вы хотите центрировать. Документация: justify-content и align-items .


3
Спасибо за краткий ответ. Хотя все вышеприведенные слова в порядке, эти 3 строки - именно то, что я искал здесь (ну, display: inline-flexв моем случае, но это было легко отредактировать).
Джефф Уорд

27

Не забудьте использовать важные атрибуты браузера:

align-items: center; ->

-webkit-box-align: center;
-moz-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;

justify-content: центр; ->

-webkit-box-pack: center;
-moz-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;

Вы можете прочитать эти две ссылки для лучшего понимания flex: http://css-tricks.com/almanac/properties/j/justify-content/ и http://ptb2.me/flexbox/

Удачи.


1
это хороший момент, на сегодняшний день (для поддержки только самых новых браузеров) вам просто нужны последние две строки -webkit .. для сафари и последняя для всех остальных
Пит Козак

1
+1, потому что старые рабочие версии 2009 и марта 2012 года все еще имеют значительную долю пользователей (в совокупности около 8% по данным caniuse.com ).
бенбун

Flext не работает в сафари, как вы можете решить эту проблему?
user3378649

Я проверил последнюю версию Safari на Windows много дней назад, и я не очень хорошо ее помню, но я проверю и скажу вам. Просто скажите, пожалуйста, какую версию сафари вы имели в виду? а на какой ОС?
QMaster

@ user3378649 Последняя версия Safari может поддерживать Flex-box, перейдите по
QMaster

15

1 - установить CSS для родительского div в display: flex;

2 - Установите CSS для родительского div на flex-direction: column;
Обратите внимание, что это сделает весь контент в этой строке div сверху вниз. Это будет работать лучше всего, если родительский div содержит только дочерний элемент и ничего больше.

3 - Установите CSS для родительского div в justify-content: center;

Вот пример того, как будет выглядеть CSS:

.parentDivClass {
  display: flex;
  flex-direction: column;
  justify-content: center;
}



8

diplay: flex;для его контейнера и margin:auto;для его элемента работает отлично.

ПРИМЕЧАНИЕ. Вы должны настроить widthи, heightчтобы увидеть эффект.

#container{
  width: 100%; /*width needs to be setup*/
  height: 150px; /*height needs to be setup*/
  display: flex;
}

.item{
  margin: auto; /*These will make the item in center*/
  background-color: #CCC;
}
<div id="container">
   <div class="item">CENTER</div>
</div>


3

Если вам нужно центрировать текст в ссылке, это поможет:

div {
  display: flex;

  width: 200px;
  height: 80px;
  background-color: yellow;
}

a {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center; /* only important for multiple lines */

  padding: 0 20px;
  background-color: silver;
  border: 2px solid blue;
}
<div>
  <a href="#">text</a>
  <a href="#">text with two lines</a>
</div>


1
Сладкий! Иногда я чувствую, что я слишком дамп для Flexbox.) Предположим, мне нужно больше практики, часть ее логики до сих пор неясна. Спасибо, Лео!
Золтан

3

margin: autoотлично работает с flexbox. Централизуется вертикально и горизонтально.

html, body {
  height: 100%;
  max-height: 100%;
}

.flex-container {
  display: flex;
    
  height: 100%;
  background-color: green;
}

.container {
  display: flex;
  margin: auto;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS</title>
</head>
<body>
  <div class="flex-container">
    <div class="container">
      <div class="row">
        <span class="flex-item">1</span>
      </div>
      <div class="row">
        <span class="flex-item">2</span>
      </div>
      <div class="row">
        <span class="flex-item">3</span>
      </div>
     <div class="row">
        <span class="flex-item">4</span>
    </div>
  </div>  
</div>
</body>
</html>


1

РЕЗУЛЬТАТ: Код

КОД

HTML:

<div class="flex-container">
  <div class="rows">

    <div class="row">
      <span class="flex-item">1</span>
    </div>
    <div class="row">
      <span class="flex-item">2</span>
    </div>
    <div class="row">
      <span class="flex-item">3</span>
    </div>
    <div class="row">
      <span class="flex-item">4</span>
    </div>

  </div>  
</div>

CSS:

html, body {
  height: 100%;  
}

.flex-container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100%;
}

.rows {
  display: flex;
  flex-direction: column;
}

где flex-containerdiv используется для центрирования вашего rowsdiv по вертикали и горизонтали , а rowsdiv используется для группировки ваших «элементов» и упорядочения их по столбцам.


0
    .flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
}

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Петр Лабунский

-7

Использование CSS +

<div class="EXTENDER">
  <div class="PADDER-CENTER">
    <div contentEditable="true">Edit this text...</div>
  </div>
</div>

посмотрите ЗДЕСЬ


1
так как это легко и широко поддерживается современными браузерами с чистым flexbox, ваша библиотека, безусловно, не нужна. Тем более, что он спросил, как это сделать, используя flex box, а не библиотеку css.
bungleofsketches
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.