【问题标题】:vertical align is not applied?垂直对齐未应用?
【发布时间】:2013-09-15 14:58:30
【问题描述】:

我有一个Div,其中有display:table

JSBIN

<div class='wrapper'>
   <input type="checkbox" class="b"  />
   <span class="c" >aaa bbb ccc</span>
  </div>

还有这个css:

.wrapper
{
  display: table; 
  border:solid 1px red;
  height:40px;
  width:200px;
}

.b
{
 border:solid 1px green;
 display: table-cell;
 vertical-align: middle; 
}

.c
{
  display: table-cell;
  vertical-align: middle; 
}

如您所见 - .b.c 都有 display: table-cell; vertical-align: middle;

问题

为什么checkbox 不垂直对齐而span 是?

注意

我知道我可以使用填充等手动对齐复选框。但我正在寻找表格单元格和垂直对齐的解决方案(应该可以)

【问题讨论】:

  • 尝试将height: 40px 添加到.b 甚至height: 100%
  • 它不起作用,因为复选框是一个被替换的元素,并且给一个复选框 display: table-cell 将不起作用。将其包裹在span 中并完成它。 jsbin.com/IdOFUmi/18/edit?html,css,output
  • @thirtydot 你说得好,复选框是一个被替换的元素,但是为什么我的答案在我继承高度时会起作用?
  • @MarcAudet:将height 设置为inherit100%40px(基本上与父级相同)这三个对我都有效。 (不是你对三十点的问题的答案。只是提一下)
  • @MarcAudet:当您为复选框提供固定高度时,大多数浏览器都会发生这种情况。保持简单:jsbin.com/IdOFUmi/25/edit?html,css,output

标签: html css vertical-alignment


【解决方案1】:

您需要继承从表格到表格单元格的高度:

.wrapper
{
  display: table; 
  border:solid 1px red;
  height:40px;
  width:200px;
}
.b
{ 
  border:solid 1px green;
  display: table-cell;
  vertical-align: middle; 
  height: inherit;
}
.c
{
  display: table-cell;
  vertical-align: middle; 
  height: inherit;
}

http://jsbin.com/IdOFUmi/23/edit查看演示

原因是input 元素的行为与其他内联元素不太一样。出于某种原因,为表格单元格设置高度可以解决问题。

我能提供的最佳解释是基于我对 CSS 表格模型的阅读 以及缺失表格元素的生成:

http://www.w3.org/TR/CSS2/tables.html#anonymous-boxes

在这种情况下,input 元素作为替换元素,不能是表格单元格。因此,CSS 引擎会在内部生成一个匿名表格单元包装器。

但是,匿名表格单元格似乎无法识别父表格的高度。

如果元素上指定了高度,则匿名表格单元格应用它。

这种解释的最好证据是以下 CSS 也给出了相同的结果:

.b
{ 
  border:solid 1px green;
  /* display: table-cell; OMIT THIS */
  vertical-align: middle; 
  height: inherit;
}

如果没有显式的 display: table-cell 属性,将绘制匿名元素,并且需要 height 属性才能使垂直对齐起作用。

【讨论】:

  • inherit 一直存在,所以应该可以。但是,display: table{-cell} 仅适用于 IE8+
【解决方案2】:

试试这个:

.wrapper
{
  display: table-cell;
  border:solid 1px red;
  height:40px;
  width:200px;
  vertical-align: middle; 
}

.b
{  
  border:solid 1px green;
}

div span
{
  border:solid 1px gray;
}

工作:http://jsbin.com/IdOFUmi/11/edit

您实际上希望 .wrapper 的行为与 table-cell 一样,在这种情况下,可以将其子项放在中心。

【讨论】:

  • 我认为包装器应该像表格一样,而 2 个 div(内部 div)应该像 TD 和 TD 一样
  • @RoyiNamir input 没有内部孩子,所以根本不可能成为表格单元格..
  • @RoyiNamir 我已经在 IE10 、 FF 和 Chrome 中检查过它 - 它工作正常 ;)
  • 一旦我从父元素继承了表格高度,我就能够让input 元素垂直居中。您对 input 元素没有孩子的评论是正确的,但我不确定这如何解释我的解决方案为何有效。
  • @MarcAudet 但我的更紧凑 ;)
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 2019-07-02
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多