Как вертикально выровнять текст внутри flexbox?

Я хотел бы использовать flexbox для вертикального выравнивания некоторого контента внутри <li>, но без особого успеха.

Я проверил онлайн, и во многих уроках фактически используется div-обертка, который получает align-items:center из настроек flex на родительском элементе, но мне интересно, можно ли вырезать этот дополнительный элемент?

В этом случае я решил использовать flexbox, поскольку высота элемента списка будет динамической %.

* {
  padding: 0;
  margin: 0;
}

html,
body {
  height: 100%;
}

ul {
  height: 100%;
}

li {
  display: flex;
  justify-content: center;
  align-self: center;
  background: silver;
  width: 100%;
  height: 20%;
}
<ul>
  <li>This is the text</li>
</ul>

Ответ 1

Редактировать: Пожалуйста, используйте ответ Michael_B вместо моего.

Я бы удалил этот ответ, если бы мог, но принятые ответы не могут быть удалены.


Если вы делаете направление flex-direction вертикальным (используя column), то justify-content: center центрирует justify-content: center вертикали. Тогда вы можете просто использовать text-align: center для text-align: center по горизонтали.

li {
  display: flex;
  justify-content: center;
  flex-direction: column;
  text-align: center;
}

Вот рабочая демка в codepen.

Ответ 2

Вместо использования align-self: center используйте align-items: center.

Нет необходимости менять flex-direction или использовать text-align (как предложено в другом ответе).

Вот ваш код, с одной настройкой, чтобы все это работало:

ul {
  height: 100%;
}

li {
  display: flex;
  justify-content: center;
  /* align-self: center;    <---- REMOVE */
  align-items: center;   /* <---- NEW    */
  background: silver;
  width: 100%;
  height: 20%; 
}

Свойство align-self применяется к элементам flex. За исключением того, что li не является flex-элементом, потому что его родитель - ul - не имеет display: flex или display: inline-flex apply.

Следовательно, ul не является гибким контейнером, li не является гибким элементом, и метод align-self оказывает никакого влияния.

Свойство align-items аналогично свойство align-self, за исключением того, что оно применяется к контейнерам flex.

Поскольку li является гибким контейнером, align-items может использоваться для вертикального align-items дочерних элементов.

* {
  padding: 0;
  margin: 0;
}
html, body {
  height: 100%;
}
ul {
  height: 100%;
}
li {
  display: flex;
  justify-content: center;
  /* align-self: center; */
  align-items: center;
  background: silver;
  width: 100%;
  height: 20%;
}
<ul>
  <li>This is the text</li>
</ul>

Ответ 3

Для будущих гуглеров,

Ответ, получивший наибольшее количество голосов, и второй по значимости, также предназначен для решения этой конкретной проблемы, опубликованной OP, где контент (текст) был "алгоритмически союзником", заключенным во встроенный блочный элемент. НО, ваш случай может касаться центрирования нормального элемента вертикально внутри контейнера, что также применимо в моем случае, так что для этого все, что вам нужно, это

align-self: center;

Просто выкладываю это здесь, так как это лучший результат для вышеупомянутого запроса, а также я был довольно смущен в течение некоторого времени * Derp *

Ответ 4

Лучший шаг - просто вставить flexbox внутрь flexbox. Все, что вам нужно сделать, это дать ребенку align-items: center. Это будет вертикально выравнивать текст внутри его родителя.

// Assuming a horizontally centered row of items for the parent but it doesn't have to be
.parent {
  align-items: center;
  display: flex;
  justify-content: center;
}

.child {
  display: flex;
  align-items: center;
}

Ответ 5

* {
  padding: 0;
  margin: 0;
}
html, body {
  height: 100%;
}
ul {
  height: 100%;
}
li {
  display: flex;
  justify-content: center;
  align-items:center;
  background: silver;
  width: 100%;
  height: 20%;
}
<ul>
  <li>This is the text</li>
</ul>

Ответ 6

Вы можете изменить отображение ul и li на table и table-cell. Тогда vertical-align будет работать для вас:

ul {
    height: 20%;
    width: 100%;
    display: table;
}

li {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    background: silver;
    width: 100%; 
}

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