CSS вертикальный текст выравнивания внутри li - PullRequest
85 голосов
/ 17 декабря 2011

Я отображаю количество блоков в строке с фиксированной высотой и шириной, сгенерированных из тегов

. Теперь мне нужно выровнять текст по центру по вертикали. CSS вертикальное выравнивание не имеет никакого значения, может быть, я что-то упустил ???

Я не ищу трюки с использованием (margin, padding, line-height), они не будут работать, потому что некоторые тексты длинные и разбиваются на две строки.

Пожалуйста, найдите фактический код:

код CSS

ul.catBlock{
  width:960px; 
  height: 270px; 
  border:1px solid #ccc; 
}

ul.catBlock li{
  list-style: none; 
  float:left; 
  display:block; 
  text-align: center; 
  width:160px; 
  height: 100px;
}

ul.catBlock li a{ 
  display: block;  
  padding: 30px 10px 5px 10px; 
  height:60px;
}

HTML код

<ul class="catBlock">
 <li><a href="#">IP Phone</a></li>
 <li><a href="#">Dual SIM Switch Server</a></li>
 <li><a href="#">IP PBX</a></li>
</ul>

Ответы [ 9 ]

93 голосов
/ 20 декабря 2011

Определите родителя с помощью display: table, а сам элемент с помощью vertical-align: middle и display: table-cell.

52 голосов
/ 17 декабря 2011

line-height - это способ выравнивания текста по вертикали. Это довольно стандартно, и я не считаю это "взломать". Просто добавьте line-height: 100px к вашему ul.catBlock li, и все будет хорошо.

В этом случае вам, возможно, придется добавить его к ul.catBlock li a, поскольку весь текст внутри li также находится внутри a. Я видел некоторые странные вещи, когда вы делаете это, поэтому попробуйте оба и посмотрите, какой из них работает.

15 голосов
/ 20 декабря 2011

Удивительно (или нет), инструмент vertical-align на самом деле лучше всего подходит для этой работы. Лучше всего, Javascript не требуется.

В следующем примере я размещаю класс outer в середине тела, а класс inner - в середине класса outer.

Предварительный просмотр: http://jsfiddle.net/tLkSV/513/

HTML:

<div id="container">
    <span></span><div class="outer">
        <span></span><div class="inner">

        </div>
    </div>
</div>

CSS:

html, body {
    height: 100%;
    margin: 0;
    padding: 0; }
#container {
    text-align: center;
    height: 100%; }
span { 
    height: 100%;
    vertical-align: middle;
    display: inline-block; }
.outer {
    width: 100px;
    height: 200px;
    padding: 0;
    border: 1px solid #000;
    vertical-align: middle;
    display: inline-block; }
.inner {
    background: red;
    width: 30px;
    height: 20px;    
    vertical-align: middle;
    display: inline-block; }

Вертикальное выравнивание работает путем выравнивания центров элементов, которые находятся рядом друг с другом. Применение вертикального выравнивания к одному элементу абсолютно ничего не делает. Если вы добавите второй элемент, который не имеет ширины, но имеет высоту контейнера, ваш единственный элемент будет перемещаться вертикально в центр с этим элементом без ширины, таким образом, вертикально центрируя его. Единственным требованием является то, что вы устанавливаете оба элемента как inline (или inline-block) и устанавливаете для их атрибута vertical-align значение vertical-align: middle.

Примечание. В приведенном ниже коде вы можете заметить, что мой тег <span> и тег <div> соприкасаются. Поскольку оба они являются встроенными элементами, пробел на самом деле добавит пробел между элементом no-width и вашим div, поэтому не забудьте его пропустить.

13 голосов
/ 08 июля 2014

В будущем эта проблема будет решена с помощью flexbox. В настоящее время поддержка браузера не работает, но она поддерживается в той или иной форме во всех современных браузерах.

Поддержка браузера: http://caniuse.com/flexbox

.vertically_aligned {

    /* older webkit */
    display: -webkit-box;
    -webkit-box-align: center;
    -webkit-justify-content: center;

    /* older firefox */
    display: -moz-box;
    -moz-box-align: center;
    -moz-box-pack: center;

    /* IE10*/
    display: -ms-flexbox;
    -ms-flex-align: center;
    -ms-flex-pack: center;

    /* newer webkit */
    display: -webkit-flex;
    -webkit-align-items: center;
    -webkit-box-pack: center;

    /* Standard Form - IE 11+, FF 22+, Chrome 29+, Opera 17+ */
    display: flex;
    align-items: center;
    justify-content: center;
}

Фон на Flexbox: http://css -tricks.com / snippets / css / a-guide-to-flexbox /

10 голосов
/ 11 декабря 2017

Несмотря на то, что этот ответ может быть опоздал на много лет, любой, кто сталкивается с этим, может просто захотеть попробовать

li {
    display: flex;
    flex-direction: row;
    align-items: center;
}

Поддержка браузером flexbox намного лучше, чем когда @scottjoudry опубликовал свой ответ выше, но вы все равно можете рассмотреть возможность добавления префиксов или других опций, если вы пытаетесь поддерживать гораздо более старые браузеры. caniuse: flex

5 голосов
/ 22 июня 2013

Здесь нет идеальных ответов, кроме ответа Асафа, в котором нет ни кода, ни примера, поэтому я хотел бы внести свой ...

Для того чтобы vertical-align: middle; работал, вам нужно использовать display: table; для элемента ul и display: table-cell; для li элементов, а затем vertical-align: middle; для li элементов.

Вам не нужно предоставлять какие-либо явные margins, paddings, чтобы сделать текст вертикально средним.

Демо

ul.catBlock{
    display: table;
    width:960px; 
    height: 270px; 
    border:1px solid #ccc; 
}

ul.catBlock li {
    list-style: none;
    display: table-cell; 
    text-align: center; 
    width:160px; 
    vertical-align: middle;
}

ul.catBlock li a { 
    display: block;
}
4 голосов
/ 30 сентября 2014

Как объясняется здесь: https://css -tricks.com / centering in the the unknown / .

Как было проверено в реальной практике, наиболее надежное, но элегантное решение - вставить вспомогательный встроенный элемент в элемент <li /> в качестве 1-го дочернего элемента, высота которого должна быть установлена ​​на 100% (от высоты его родителя, <li />), а его vertical-align установлено на середину. Для этого вы можете поставить <span />, но наиболее удобный способ - использовать li:after псевдокласс.

Скриншот: enter image description here

ul.menu-horizontal {
    list-style-type: none;
    margin: 0;
    padding: 0;
    display: inline-block;
    vertical-align: middle;
}

ul.menu-horizontal:after {
    content: '';
    clear: both;
    float: none;
    display: block;
}

ul.menu-horizontal li {
    padding: 5px 10px;
    box-sizing: border-box;
    height: 100%;
    cursor: pointer;
    display: inline-block;
    vertical-align: middle;
    float: left;
}

/* The magic happens here! */
ul.menu-horizontal li:before {
    content: '';
    display: inline;
    height: 100%;
    vertical-align: middle;
}
1 голос
/ 15 августа 2015

Попробуйте это решение

Лучше всего работает в большинстве случаев

, возможно, вам придется использовать div вместо li

.DivParent {
    height: 100px;
    border: 1px solid lime;
    white-space: nowrap;
}
.verticallyAlignedDiv {
    display: inline-block;
    vertical-align: middle;
    white-space: normal;
}
.DivHelper {
    display: inline-block;
    vertical-align: middle;
    height:100%;
}
<div class="DivParent">
    <div class="verticallyAlignedDiv">
        <p>Isnt it good!</p>
     
    </div><div class="DivHelper"></div>
</div>
0 голосов
/ 10 апреля 2018

Простое решение для вертикального выравнивания по середине ... для меня это работает как шарм

ul{display:table; text-align:center; margin:0 auto;}
li{display:inline-block; text-align:center;}
li.items_inside_li{display:inline-block; vertical-align:middle;}
...