li标签中的span标签如何垂直居中?

正常情况下li标签中的span标签可以通过设置li标签的height和line-height一致来实现span标签在li标签中的垂直居中,但是我发现当把span标签display属性设置为block,并设置尺寸以后,这个方法就无效了,使用vertical-align:middle也没用,请问为什么?代码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <style media="screen">
      li{
        height: 30px;
        line-height: 30px;
        border: 1px solid red;

      }
      span{
        display: block;
        width: 30px;
        height: 20px;
        border: 1px solid blue;

      }
    </style>
  </head>
  <body>
    <ul>
      <li><span>abcdefg</span></li>
      <li><span>abcdefg</span></li>
      <li><span>abcdefg</span></li>
    </ul>
  </body>
</html>
阅读 18.5k
4 个回答

在原有基础上添加

li{
 position:relative;
}
span{
 position:absolute;
 margin:auto;
 left:0;
 right:0;
 top:0;
 bottom:0;
}

原理是,定位元素(以竖直方向为例)的top+bottom+其自身高+竖直margin=包含块尺寸。由于只有margin未设置具体值,则自动计算为居中。
踩得自己看。
好好看看是不是居中的。
动动手指敲一下。
https://jsfiddle.net/kj5gpg1x/
再看看只写竖直方向是不是竖直方向居中!
https://jsfiddle.net/0L43aftc/

你的思路当然可以,没毛病,但是:
你的span的高度为什么设置成20px

你的line-height起作用了,行高就是30px,但是块级元素的height确定盒子高度,准确的说是span文字溢出了,不信你给span加上overflow:hidden;试试

  • height和line-height一致的方式只能作用于inline和inline-block的元素

  • vertical-align:middle只能作用于inline和table类元素

  • 题主只要把span标签的display设置为inline-block就行了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏