CSS:如何在“ div”内垂直对齐“标签”和“输入”?


91

考虑以下代码

HTML:

<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

CSS:

div {
    height: 50px;
    border: 1px solid blue;
}

label和放在(垂直)input中间的最简单方法是div什么?


1
据我所知,最底线是“您不能”,而绕过它的最懒惰的方法是使用简单的方法<table>并将valign='middle'其应用于<td>s。
BeemerGuy 2010年

Answers:


95

div {
    display: table-cell;
    vertical-align: middle;
    height: 50px;
    border: 1px solid red;
}
<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

此方法的优点是您可以更改的高度div,更改文本字段的高度并更改字体大小,并且所有内容始终位于中间。

http://jsfiddle.net/53ALd/6/


1
看起来很优雅:)有人知道该方法与浏览器的兼容性吗?
Zaven Nahapetyan 2010年

1
对于IE,我认为它仅适用于IE8或更高版本。对于其他Web浏览器,也可以。
马克-弗朗索瓦·

1
我不知道display: table-cell。某些浏览器支持吗?
BeemerGuy 2010年

6
@Misha您应该已指定输入/标签绝对放置的事实。这完全改变了问题的情况。我给马克+1。好答案。
jessegavin 2010年

2
我可以肯定的是,詹森试图(并应该明确指出)要指出的一点是,使用make display: table-celldiv的行为方式与预期不一样,例如后续的div在同一行/等上渲染。
taswyn 2013年

73

一种更现代的方法是使用CSS flex-box。

div {
  height: 50px;
  background: grey;
  display: flex;
  align-items: center
}
<div>
  <label for='name'>Name:</label>
  <input type='text' id='name' />
</div>

一个更复杂的示例...如果flex流中有多个元素,则可以使用align-self来将单个元素与指定的align不同地对齐...

div {
  display: flex;
  align-items: center
}

* {
  margin: 10px
}

label {
  align-self: flex-start
}
<div>
  <img src="https://de.gravatar.com/userimage/95932142/195b7f5651ad2d4662c3c0e0dccd003b.png?size=50" />
  <label>Text</label>
  <input placeholder="Text" type="text" />
</div>

它也很容易在水平和垂直方向上居中:

div {
  position:absolute;
  top:0;left:0;right:0;bottom:0;
  background: grey;
  display: flex;
  align-items: center;
  justify-content:center
}
<div>
  <label for='name'>Name:</label>
  <input type='text' id='name' />
</div>


我希望在标签中包裹有图像和文字时可以使用。我有一个小图标,后跟文本,但文本没有变化。
凯文·沙恩霍斯特

如果标签和文本是单独的元素,或者您也使标签成为flexbox,那么它就可以工作...
Holger Will

display:flex具有较少的兼容性,可在chrome 29+上使用

14

这可以跨浏览器工作,提供更多的可访问性,并且标记更少。抛弃股利。包装标签

label{
     display: block; 
     height: 35px; 
     line-height: 35px; 
     border: 1px solid #000; 
}

input{margin-top:15px; height:20px}

<label for="name">Name: <input type="text" id="name" /></label>

3
这显然不适用于两行标签。并且,如果您确定标签始终是单行,那么还有数百万其他的选择。
Lashae

16
问题是关于单行标签,我也作了回答。不确定您在这里的观点或意图,但是如果x很明显,您应该去做一百万个例子。至少让您可以幸灾乐祸,并感受到您数百万次胜利的力量。太棒了
艾伯特

2
这是单行标签的最佳答案。该规范说:“如果未指定for属性,但是label元素具有可标签的与表单相关的元素后代,则树顺序中的第一个此类后代就是label元素的标签控件。” 因此,这是唯一可以省略forandid属性以最大程度简化的方法。
议会

8

我知道这个问题是两年多以前提出的,但是对于任何最近的观众来说,这是一个替代解决方案,它比Marc-François的解决方案具有一些优势:

div {
    height: 50px;
    border: 1px solid blue;
    line-height: 50px;
}

在这里,我们仅添加line-height等于div高度的值。好处是您现在可以根据需要将div的display属性更改为inline-block为例如,并且其内容将保持垂直居中。接受的解决方案要求您将div视为表单元格。跨浏览器应该可以正常工作。

唯一的其他优点是,它只是一个CSS规则,而不是两个:)

干杯!


6

使用paddingdiv顶部和底部),并vertical-align:middlelabelinput

http://jsfiddle.net/VLFeV/1/的示例


这在jsfiddle上不起作用。我更改了的高度,div并且里面的内容完全没有移动。我想念什么吗?
BeemerGuy 2010年

我认为,布局不应具有固定的像素高度…布局应在内容周围流畅地流动。但是,我来自一天和一天的时间,浏览器在放大和缩小时会缩放文本大小。最近的浏览器实际上可以缩放整个页面,因此设置像素高度效果更好。但是,有全新的原因避免设置像素高度……例如,响应式布局技术。这就是为什么这是我的首选方法。
第三者

3

包装标签,然后在另一个div中输入已定义的高度。在低于8的IE版本中,这可能不起作用。

position:absolute; 
top:0; bottom:0; left:0; right:0;
margin:auto;

0

您可以display: table-cell像下面的代码中那样使用property:

div {
     height: 100%;
     display: table-cell; 
     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.