li内的CSS垂直对齐文本


100

我正在连续显示从<li>标记生成的具有固定高度和宽度的框数。现在我需要在垂直中心对齐文本。CSS垂直对齐没有影响,也许我遗漏了一些东西???

我不是在寻找使用(边距,填充,行高)的技巧,因为有些文本很长并且会分成两行,所以这些技巧将不起作用。

请找到实际的代码:

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>

2
您可能需要提供更多信息。箱子的高度相同吗?您是否在li的框内对齐文本?“因为某些文本很长...两行” 可能是截图或小提琴会有所帮助。
KMC

1
我只是尝试发布屏幕截图,但由于我的帐户是新帐户,所以不允许我截图。
AK4668 2011年

Answers:


100

display: table和定义父元素,用vertical-align: middle和定义元素本身display: table-cell


4
+1用于使用显示表/表单元格。似乎没有多少人意识到他们的存在。
powerbuoy 2011年

5
这来自W3CSchool ...注意:值“内联表”,“磨合”,“表”,“表标题”,​​“表单元格”,“表列”,“表列- IE7和更早版本不支持“组”,“表行”,“表行组”和“继承”。IE8需要!DOCTYPE。IE9支持这些值。
AK4668 2011年

20
该解决方案很烂,因为它完全关闭了任何边际影响。对此的唯一解决方案是制造大量伪元素。为什么CSS很烂。
穆罕默德·乌默

什么<li>š进入单行?
polkovnikov.ph 2015年

1
如果您实际上不显示表格数据,那么这也不符合CATO可访问性。
Stevo Perisic,2015年

59

line-height垂直对齐文本的方式。这是相当标准的,我不认为这是“黑客”。只需添加line-height: 100px到您的文件中ul.catBlock li,一切都会好起来的。

在这种情况下,您可能必须将其添加到,ul.catBlock li a因为内的所有文本li也在内a。当您执行此操作时,我已经看到一些奇怪的事情发生,因此请尝试两者,看看哪个可行。


21
我最初使用的是line-height,但是当内容很长时,它将分成2行,并且假设每行100px的间隔会使它看起来更糟。还有其他办法吗?
AK4668 2011年

2
我想vertical-align: middle如果有的话,有办法display: table-cell。我从来没有用过。在这里看看:phrogz.net/css/vertical-align/index.html
Logan

很好的解决方案-我将li的“行高”设置为与我的最小高度相同,并且文本垂直对齐-至少足够接近以进行目视检查。上面的“表”解决方案当然不是语义上的,本质上是hackes。每当我们这样做时,我们都会在响应性环境中的某个地方增加显示破裂或古怪行为的机会。
CodeFinity 2015年

谢谢!在<a>元素上效果很好!多么简单的解决方案:-)只需对其进行调整即可正确调整值,并使它在垂直方向上居中完美!
Asle

45

无论此响应有多晚,遇到此问题的任何人可能都想尝试

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

浏览器对flexbox的支持要比@scottjoudry在上面发表他的回答时要好得多,但是如果您想支持更老的浏览器,则可能仍要考虑前缀或其他选项。犬:弯曲


list-style-image在Chrome中效果
不佳

1
我在bootstrap 4 nav-item上使用了它,效果很好。谢谢。
010110110101

弹性盒保存生活一如既往
Arthur Medeiros

16

出乎意料的是(或没有),该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之间添加一个空格,因此请务必将其省略。


1
太棒了,这很有道理。//我现在不能投你的答案,因为我的信誉分应该是15
AK4668

1
对于那些正在寻找直接应用于问题的技术的人-jsfiddle.net/utGVt/385
Wex 2013年

15

将来,这个问题将由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/


1
在问这个问题时,我不确定这是否是一个很好的答案,但是今天我们看到〜95%的支持,因此我当然认为这是一个可行的选择。
Wex

如果希望<li>元素包装(而不是收缩),请添加flex-wrap:wrap;。在<ul>级别
Thierry

我也要添加什么元素?
马特M:

6

除了Asaf的答案(没有提供任何代码或任何示例)之外,这里没有提供完美的答案,因此我想贡献我的力量...

序,使vertical-align: middle;工作,你需要使用display: table;你的ul元素和display: table-cell;li元素和比你可以使用vertical-align: middle;li元素。

您不需要提供任何明确的marginspaddings让你的文字垂直方向的中间。

演示版

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;
}

这无济于事,因为其垂直对齐的唯一原因是因为您用a标签上的填充迫使它向下放置
str11 2015年

@ Mr.Alien我将重申,尽管此解决方案的唯一问题是忽略了保证金规则。
托马斯

4

如此处所述:https : //css-tricks.com/centering-in-the-unknown/

经过实际测试,最可靠但最优雅的解决方案是<li />在第一个子元素中插入辅助内联元素,该子元素的高度应设置为其父对象高度的100%<li />,并vertical-align设置为中间。为此,您可以放置​​一个<span />,但是最方便的方法是使用li:after伪类。

屏幕截图: 在此处输入图片说明

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

试试这个解决方案

在大多数情况下效果最佳

您可能需要使用DIV,而不是

.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>


1
为什么这需要divHelper进行垂直对齐?我看到了它的另一话题,但我不明白为什么它不没有其他的div对齐自我..
萨沙·基里科

0

垂直对齐中间的简单解决方案...对我来说,它就像一个魅力

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;}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.