CSS:如何在"div"中垂直对齐"label"和"input"?

Mis*_*hko 80 html css vertical-alignment

请考虑以下代码:

HTML:

<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>
Run Code Online (Sandbox Code Playgroud)

CSS:

div {
    height: 50px;
    border: 1px solid blue;
}
Run Code Online (Sandbox Code Playgroud)

什么是把最简单的方法labelinput在的中间div(垂直)?

Mar*_*ois 91

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

这种方法的优点是你可以改变div文本字段的高度,改变文本字段的高度并改变字体大小,一切都将保持在中间.

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

  • @Misha你应该指明你的输入/标签绝对定位的事实.这完全改变了问题的情况.我给Marc一个+1.很好的答案. (6认同)
  • 我相当肯定jenson试图制作(并且应该明确表达)的是使用`display:table-cell`使得div的行为方式与预期的不同,例如后续的div渲染行到/ etc. (2认同)

Hol*_*ill 58

更现代的方法是使用css flex-box.

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

一个更复杂的例子......如果你在flex流程中有多个元素,你可以使用align-self将不同的单个元素对齐到指定的对齐...

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

* {
  margin: 10px
}

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

它也非常容易水平和垂直居中:

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


alb*_*ert 11

这适用于跨浏览器,提供更多可访问性并且标记更少.放弃了div.包裹标签

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>
Run Code Online (Sandbox Code Playgroud)

  • 问题是关于单行标签,我也做了相应的回答.在这里不确定你的观点或意图,但如果x是如此明显,你应该去做一百万个例子.至少所以你可以在我的回答中幸灾乐祸,感受到百万胜利的力量.喝彩. (12认同)
  • 这显然不适用于双线标签.如果你确定标签总是单行,那么还有数以百万计的其他选择. (3认同)
  • 这是单线标签的最佳答案.规范说:"如果没有指定for属性,但label元素有一个可谓的表单关联元素后代,那么树顺序中的第一个这样的后代是标签元素的标记控件." 因此,这是唯一可以省略`for`和`id`属性以获得最大简单性的方法. (2认同)

Mus*_*mal 8

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

div {
    height: 50px;
    border: 1px solid blue;
    line-height: 50px;
}
Run Code Online (Sandbox Code Playgroud)

这里我们只添加一个line-height等于div高度的数字.现在,您可以根据需要更改div的显示属性,其优点是inline-block,它的内容将保持垂直居中.接受的解决方案要求您将div视为表格单元格.这应该完美,跨浏览器.

唯一的另一个好处是它只是一个CSS规则而不是两个:)

干杯!


Gab*_*oli 6

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

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