Как вертикально выровнять текст внутри элемента?
Я хотел бы использовать flex box для вертикального выравнивания некоторого содержимого внутри <li> но не имея большого успеха.
Я проверил онлайн, и многие из учебников на самом деле используют оболочку div, которая получает align-items:center из настроек flex на родителе, но мне интересно, можно ли вырезать этот дополнительный элемент?
Я решил использовать flex box в этом случае, поскольку высота элемента списка будет динамическим %.
* {
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> 5 ответов:
Edit: пожалуйста, используйте Michael_B это, а не мое. Я бы удалил этот ответ, если бы мог, но принятые ответы не могут быть удалены.
если вы
flex-directionвертикальный (с помощьюcolumn), тоjustify-content: centerцентры по вертикали. Тогда вы можете просто использоватьtext-align: centerв центр по горизонтали, а также.li { display: flex; justify-content: center; flex-direction: column; text-align: center; }вот он в действии:http://codepen.io/anon/pen/Fkhgo
вместо
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%; }The
align-selfсвойство применяется к гибкий график работы пунктов. Кроме вашегоliне является гибким элементом, потому что его родитель–ul– нетdisplay: flexилиdisplay: inline-flexприменить.таким образом,
ul- это не контейнер, тоliэто не гибкий элемент, аalign-selfне имеет никакого эффекта.The
align-itemsсвойство похоже наalign-self, за исключением того, что это относится к flex контейнеры.С
li- это контейнер,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>
технически, вот как
align-itemsиalign-selfработа...The
align-itemsсвойство (на контейнере) устанавливает значение по умолчаниюalign-self(по пунктам). Таким образом,align-items: centerозначает, что все элементы flex будут установлены вalign-self: center.но вы можете переопределить это значение по умолчанию, регулируя
align-selfпо отдельным пунктам.например, вы можете хотеть равные столбцы высоты, поэтому контейнер имеет значение
align-items: stretch. Однако один элемент должен быть закреплен сверху, поэтому он установлен вalign-self: flex-start.
как текст является гибким элементом?
некоторые люди могут задаваться вопросом, Как запустить текст...
<li>This is the text</li>является дочерним элементом элемента
li.причина в том, что текст, который явно не обернут элементом встроенного уровня, алгоритмически обернут инлайн-бокс. Это делает его анонимный строчный элемент и ребенок родителя.
из спецификации CSS:
9.2.2.1 анонимные инлайн коробки
любой текст, который непосредственно содержится внутри блока элемента контейнера должен рассматриваться как анонимный встроенный элемент.
спецификация flexbox обеспечивает для подобного поведение.
каждый потоковый дочерний элемент контейнера flex становится элементом flex, и каждый непрерывная последовательность текста, который находится непосредственно внутри гибкого трубопровода контейнер завернут в анонимный гибкий элемент.
следовательно, текст в
li- это гибкий элемент.
для будущих гуглеры,
самый проголосованный ответ и второй самый большой тоже для решения данная проблема опубликовано OP, где контент(текст) был "алгоритмическим союзником", обернутым внутри встроенного блочного элемента. Но, ваше дело может быть о центрирование нормального элемента по вертикали внутри контейнера, который также применяется в моем случае, так что все что вам нужно-это
align-self: center;просто положу это здесь, так как это верхний результат для вышеупомянутого запроса, а также я был довольно смущен в течение довольно долгого времени * баттхерт*
* { 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>
вы можете изменить
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%; }
Comments