Как вертикально выровнять текст внутри 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. Если у вас есть дополнительные вопросы или нужна помощь с настройкой стилей, не стесняйтесь спрашивать!
Как задать cellpadding и cellspacing с помощью CSS?
Как расположить div внизу своего контейнера?
Перенос строки в HTML с использованием '\n'
Как отключить перенос строк в HTML?
Установить фиксированную ширину столбца таблицы независимо от количества текста в ячейках?