Как вертикально выровнять текст внутри flexbox?
Я хотел бы использовать flexbox для вертикального выравнивания содержимого внутри тега <li>, но не добиваюсь успеха.
Я проверил множество онлайн-руководств, и многие из них используют обертку (wrapper) в виде 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>
Как я могу выровнять текст по центру внутри элемента <li> без использования дополнительной обертки?
5 ответ(ов)
Лучший подход - это просто вложить флексконтейнер внутрь другого флексконтейнера. Все, что вам нужно сделать, это задать дочернему элементу стиль align-items: center. Это позволит вертикально выровнять текст внутри родительского элемента.
// Предполагая, что родительский элемент выровнен по горизонтали, но это не обязательно
.parent {
align-items: center;
display: flex;
justify-content: center;
}
.child {
display: flex;
align-items: center;
}
Таким образом, текст внутри .child будет выровнен по центру относительно родительского контейнера .parent.
Наиболее голосованный ответ предназначен для решения конкретной проблемы, упомянутой автором вопроса, где содержимое (текст) оборачивалось внутри элемента inline-block. В некоторых случаях речь может идти о вертикальном центрировании обычного элемента внутри контейнера, что также применимо в моем случае. Для этого вам достаточно использовать:
align-self: center;
Используя свойство display: flex, вы можете управлять вертикальным выравниванием HTML-элементов. В приведенном примере кода создается контейнер с классом .box, в котором элементы располагаются по центру как по вертикали, так и по горизонтали.
.box {
height: 100px;
display: flex;
align-items: center; /* Вертикальное выравнивание */
justify-content: center; /* Горизонтальное выравнивание */
border: 2px solid black;
}
.box div {
width: 100px;
height: 20px;
border: 1px solid;
}
<div class="box">
<div>Hello</div>
<p>World</p>
</div>
В этом примере контейнер .box имеет высоту 100 пикселей и использует flexbox, чтобы выровнять элементы внутри него. Свойство align-items: center; позволяет вертикально центрировать содержимое, а justify-content: center; центрирует его горизонтально. Результат — текст "Hello" и "World" будет расположен по центру контейнера как по вертикали, так и по горизонтали.
align-self не выравнивает элементы внутри li. Вместо этого он выравнивает сам элемент li как целое.
Если вы хотите выровнять текст внутри li, вам следует использовать align-items. В вашем случае стоит использовать display: flex на элементе li, чтобы элементы внутри него (в данном случае текст) выравнивались по центру.
Вот пример кода, который работает:
* {
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>
Таким образом, задавая display: flex для li, вы гарантируете, что текст будет выровнен по центру.
Ваш текущий CSS-код выглядит корректно и должен работать, как вы ожидаете. Он создает полный экранный список, в котором каждый элемент списка (<li>) занимает 20% высоты родительского элемента (<ul>). Также элементы центрируются как по горизонтали, так и по вертикали.
Вот как это будет выглядеть в действии:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Пример</title>
<style>
* {
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%;
}
</style>
</head>
<body>
<ul>
<li>This is the text</li>
<li>Другой элемент</li>
<li>Еще один элемент</li>
<li>Последний элемент</li>
</ul>
</body>
</html>
В этом примере я добавил несколько элементов <li>, чтобы продемонстрировать, как список будет выглядеть с несколькими элементами. Каждое из них занимает 20% высоты, а центрирование текста выполняется с помощью Flexbox. Если у вас есть дополнительные вопросы или нужна помощь с настройкой стилей, не стесняйтесь спрашивать!
Заполнение оставшейся высоты или ширины в flex-контейнере
Отображение: Flex теряет правый отступ при переполнении?
Как адаптировать ширину flex-элемента к содержимому?
Как задать минимальный отступ между элементами flexbox?
Установить фиксированную ширину столбца таблицы независимо от количества текста в ячейках?