54

我有一个简单table的 with 1 TDwith vertical-align:middle;。这TD包含一个Image

table
{
  border:solid 1px red;
  width:300px;
}

td
{
  height:100px;
  vertical-align:middle;
  width:100%;
  border:solid 1px green;
}
img
{
  height:43px;width:43px;
}

span
{
  vertical-align:middle;
}
<!DOCTYPE html>
<html>
  <head>
    <meta charset=utf-8/>
    <title>JS Bin</title>
  </head>
  <body>
    <table>
      <tr>
        <td>
          <img src='http://static.jsbin.com/images/favicon.png'/>
        </td>
      </tr>
    </table>
  </body>
</html>

一切正常,IMG垂直对齐。

但是如果我在该图像之后添加另一个元素(span例如 a ):

table
{
  border:solid 1px red;
  width:300px;
}

td
{
  height:100px;
  vertical-align:middle;
  width:100%;
  border:solid 1px green;
}
img
{
  height:43px;width:43px;
}

span
{
  vertical-align:middle;
}
<!DOCTYPE html>
<html>
  <head>
    <meta charset=utf-8/>
    <title>JS Bin</title>
  </head>
  <body>
    <table>
      <tr>
        <td>
          <img src='http://static.jsbin.com/images/favicon.png'/>
          <span>aaa</span>
        </td>
      </tr>
    </table>
  </body>
</html>

问题

TD的垂直对齐不应该垂直对齐它的所有孩子吗?

我怎样才能使span居中

注意

我不想添加另一个TD,也不想使用float填充/边距。IE8+。

编辑:

期望的结果:

在此处输入图像描述

4

11 回答 11

77

问题
TD的垂直对齐不应该垂直对齐它的所有孩子吗?

没有
当您应用于vertical-aligntd,它仅应用于td,并且不会被其任何子代继承。

如果我有一个只有跨度的 TD - 它会垂直对齐。如果我的 TD 里面只有 IMG - 它也会对齐。

这是因为工作的vertical-align方式tdtd计算单元格 ie 的总高度,并将整个单元格垂直对齐。

如果有单img,则 的高度与 的高度td相同,img所以看来vertical-alignforimg也是middle。但实际上, thetdimgas垂直对齐到中间vertical-align : baseline

有单个span.

但如果我两者都有 - 它没有。这是为什么 ?

因为现在,heightof是两者td的组合+ 。所以,实际上,在中间垂直对齐,但不是and 。heightimgspantdimgspan

我怎样才能使跨度也居中?

您需要应用此 CSS :

td > * {
    vertical-align : middle;
}

这会将 CSS 应用到所有孩子。

检查JSFiddle以获得更好的图片。

希望,这回答了你的问题。

于 2013-09-24T10:43:03.887 回答
7

你可以只使用vertical-align: middle;你的跨度

img
{
  height:43px;width:43px;
  display: inline;
  vertical-align: middle;
}

span
{
  vertical-align:middle;
  display: inline;
  
}

你的jsbin


根据评论


你可能会认为如果 td 是给定的,vertical-align: middle;那么它应该对齐其中的所有内容,但是有一个图像和一个浏览器理解图像的跨度是什么?: 这个是 inline 还是 inline-block,所以需要设置 display: inline 还是 inline-block;然后你可能会看到它只为图像应用显示属性。演示

编辑

img 标签:来源:显示内联与内联块

它们是“块”元素,因为它们具有宽度和高度。

确实,它们都是——或者更准确地说,它们是“内联块”元素。这意味着它们像文本一样内联流动,但也像块元素一样具有宽度和高度。

还要检查这个:

替换元素

替换元素是其外观和尺寸由外部资源定义的任何元素。示例包括图像(标签)、插件(标签)和表单元素(、、、和标签)。所有其他元素类型都可以称为不可替换元素。

被替换的元素可以具有固有尺寸——由元素本身定义的宽度和高度值,而不是由其在文档中的周围环境定义。例如,如果图像元素的宽度设置为自动,则将使用链接图像文件的宽度。固有维度还定义了一个固有比率,用于确定元素的计算维度,应该只指定一个维度。例如,如果仅为图像元素指定宽度(例如 100 像素),而实际图像为 200 像素宽和 100 像素高,则元素的高度将按相同的量缩放至 50 像素。

被替换的元素也可以有元素强加的视觉格式要求,不受 CSS 控制;例如,为表单元素呈现的用户界面控件。

在行内格式化上下文中,您还可以将替换元素视为一个作为单个大字符用于包装和布局的元素。可以为替换的内联元素指定宽度和高度,在这种情况下,放置元素的行框的高度足够高以容纳替换的元素,包括任何指定的框属性。

于 2013-09-22T06:52:56.633 回答
4

在所有情况下,vertical-align: middle;on thetd都会执行预期的操作。也就是说,将 对齐td到该行的中心,并将 的全部内容对齐td到垂直中间(默认情况下),在顶部和底部留出相等的空间。

这是W3 规范所说的 vertical-align: middle

单元格的中心与其跨越的行的中心对齐。

在此处输入图像描述

行高计算:

'table-row' 元素框的高度是在用户代理拥有该行中的所有单元格可用时计算的:它是该行计算的“高度”的最大值,该行中每个单元格的计算“高度”,以及单元格所需的最小高度 (MIN)。

在 CSS 2.1 中,单元格框的高度是内容所需的最小高度。表格单元格的“高度”属性可以影响行的高度(见上文),但不会增加单元格框的高度。

小于行高的单元格框会收到额外的顶部或底部填充。

由于上述原因,thetr和 the的高度td变为 100px,但单元格框仅占用内容所需的高度量(imgheight = 43px)。现在,由于单元格框小于行高,因此添加了额外的填充,如上图框 5 所示,从而使内容也对齐到中间。


TD只有图像:

当只有一个img时,内容高度等于 的高度img。所以它被定位到中间。

在此处输入图像描述

从上图中可以看出,这不需要 a vertical-align: middleon theimg明确的,因为td它的内容与中间对齐。


TD 只有内联数据:

td只有一个spanspan加上一个 inlinediv时,内容的高度等于line-heighttext 的默认值(或任何指定的line-height)。在这种情况下,td它也会正确对齐。

在此处输入图像描述

当文本内容超出第一行时(参考demo),可以看到td自动将first-line(青色背景标记)向上推,保证整个内容对齐到中间(不只是单行) )。


TD 有一个图像和一个跨度:

当我们将一个img和一个span(内联文本)放在 中td时,内容高度等于第二行和后续行的img加号的高度。line-height

在这种情况下,有两种可能的情况,如下所述:

案例 1 - img 标签没有 vertical-align 指定

在这种情况下,与(默认)img对齐。baseline然后td将整个内容对齐到中间。这意味着在内容的顶部和底部td留下大约28.5px (= (100-43)/2) 的间隙。同样,vertical-alignontd完成了这项工作,它将内容放在中间(也就是说,在顶部和底部留出相等的间隙)。但是由于img高度更高,文本被向下推。

在此处输入图像描述

如果我们将img高度降低到小于行高(比如 10px),我们可以看到即使使用img+span它也会与中间对齐。


案例 2 - img 标签有 vertical-align: middle

在这种情况下,也vertical-aligntd案例 1 一样。但是,这种情况下的文本靠近中间,因为img也与middle行对齐。

在此处输入图像描述

table {
  border: solid 1px red;
}
td {
  height: 100px;
  width: 200px;
  vertical-align: middle;
  border: solid 1px green;
}
img {
  height: 43px;
  width: 43px;
  border: solid 1px green;
}
.one td + td img {
  vertical-align: middle;
}
.three td + td img {
  height: 10px;
  width: 10px;
}
.four img {
  vertical-align: middle;
}
.five img + img{
  height: 50px;
  width: 50px;
}
td:first-line {
  background-color: cyan;
}
div {
  display: inline;
}
<table>
  <tr class='one'>
    <td>
      <img src='http://static.jsbin.com/images/favicon.png' />
    </td>
    <td>
      <img src='http://static.jsbin.com/images/favicon.png' />
    </td>
  </tr>
  <tr class='two'>
    <td>
      <div>aaa</div>
      <span>aaa</span>
    </td>
    <td>
      <div>aaa</div>
      <span>aaa aaaaaaa aaaaaaaa aaaaaaaa</span>
    </td>
  </tr>
  <tr class='three'>
    <td>
      Case 1
      <img src='http://static.jsbin.com/images/favicon.png' />
      <span>Image + Span</span> 
    </td>
    <td>
      Case 1
      <img src='http://static.jsbin.com/images/favicon.png' />
      <span>Image + Span</span> 
    </td>
  </tr>
  <tr class='four'>
    <td>
      Case 2
      <img src='http://static.jsbin.com/images/favicon.png' />
      <span>Image + Span</span> 
    </td>
    <td>
      <img src='http://static.jsbin.com/images/favicon.png' />
      <span>Image + Span + more text.......</span> 
    </td>
  </tr>
  <tr class='five'>
    <td>
      Case 3
      <img src='http://static.jsbin.com/images/favicon.png' />
      <img src='http://static.jsbin.com/images/favicon.png' />
      <span>Image + Span text...</span> 
    </td>
    <td>
      <img src='http://static.jsbin.com/images/favicon.png' />
      <span>Image + Span + more text.......</span> 
    </td>
  </tr>  
</table>

于 2013-09-25T08:58:00.380 回答
4

这是一个JS小提琴解决方案

小提琴

这是CSS

  table
{
  border:solid 1px red;
  width:300px;
}

td
{
  height:100px;
  vertical-align:middle;
  width:100%;
  border:solid 1px green;
}
img
{
  display: inline;
height: 43px;
width: 43px;
  position: relative !important;
float: left;
}

span
{
  height: auto !important;
width: 80%;
float: right;
position: relative;
vertical-align: middle !important;
text-align: left;
}
于 2013-09-24T11:59:47.970 回答
3

只需添加vertical-align:middle;到您的 img 样式?

演示

于 2013-09-24T07:48:33.703 回答
2
<style>
table
{
  border:solid 1px red;
  width:300px;
}

td
{
  height:100px;  
  width:100%;
  border:solid 1px green;
  vertical-align:middle;
  line-height:100px;
}
img
{
  height:43px;width:43px;
  vertical-align:middle;
}
</style>
于 2013-09-24T19:03:57.700 回答
0

你是这个意思吗?http://jsfiddle.net/JFVNq/

原因是跨度被视为内联,因此您需要使它们阻塞。

跨度的 CSS:

td.vert span
{
    vertical-align: middle;
    display: block;
}
于 2013-09-22T06:43:55.420 回答
0

演示

只需添加此类:

td *{
  vertical-align:middle
}

编辑:

问题是为什么当你在td文本中添加图片时,图片的底部而不是 td 的中间。

这是我的回答:

当你设置td vertical-alignmiddle不应该设置所有内容vertical-alignmiddle,它们仍然是baseline。当你在文本中添加图片时,行高会上升到图像的高度,而文本是这个高度的底部,所以你需要设置vertical-alignmiddle来解决这个问题。

在这里你可以看到我说的:DEMO

对不起我的英语不好

于 2013-09-24T07:31:29.560 回答
0

这个CSS 属性不适用于任何其他类型的元素。当新手开发人员将垂直对齐应用于普通块元素(如标准)时,大多数浏览器将值设置为继承给该元素的所有内联子元素。

您只需要添加vertical-align: middle<img>类中。

你的 CSS 应该是这样的......

table
{
  border:solid 1px red;
  width:300px;
}

td
{
  height:100px;
  vertical-align:middle;
  width:100%;
  border:solid 1px green;
}
img
{
  height:43px;width:43px;
  vertical-align: middle;
}

您可以查看Sample Fiddle...

于 2013-09-24T13:46:34.777 回答
0

我想我们都快到了,但是

td img,
td span {
display:inline-block;
vertical-align:middle;
}

似乎工作。

代码笔示例

还是我错过了什么?

于 2013-09-24T11:24:51.737 回答
-1

只需将您的垂直对齐:中间从跨度移动到图像。

图像将在文本上对齐;比相反的效果更好;)

img
{
  height:43px;width:43px;
  vertical-align:middle;
}

http://jsfiddle.net/ZnpNF/1/

于 2013-09-24T11:03:31.560 回答