【问题标题】:Vertically align label with input将标签与输入垂直对齐
【发布时间】:2016-10-08 04:48:09
【问题描述】:

我目前正在将旧的 HTML 表单转换为不使用表格。标签需要固定宽度,这是我使用此站点的答案实现的。当前代码如下:

HTML

<div id="form">
    <label for="field1">Name&nbsp;</label>
    <input type="text" id="field1" value="default name" />
</div>

CSS

label {
    float: left;
    width: 50px;
    white-space: nowrap;
}
input {
    display: block;
    overflow: hidden;
    width: *;
}
#field1 {
    width: 150px;
}

目前,标签在顶部垂直对齐。如何将标签和字段垂直对齐到中心?

编辑:我得到了很多答案,基本上通过指定数量的像素将我的标签填充到正确的位置。我不想这样做,因为它基本上是硬编码,而不是真正的垂直对齐到中间。

根据我在这里收到的一些建议,我已经清理了一些代码。请参阅上面的编辑代码。

我在label 中尝试过vertical-align: middle;,但它不起作用。请注意,用户的平台将是 IE。

【问题讨论】:

  • 整个页面需要垂直居中对齐吗?
  • 尝试改变标签的行高
  • @Mani 没有。只是标签字段对的每一行。我找到了有效的答案,但在标签中包含固定宽度后就没有了
  • 你可以试试padding: 4px;的fieldHeading
  • 填充基本上是硬编码一个绝对值,所以没有。

标签: html css vertical-alignment


【解决方案1】:

如果我做对了,您希望 labelinput 垂直居中对齐 W.R.T 彼此而不是页面。为此,有几种方法。

Flexbox 方式

如果您想使用 CSS 世界中的新东西并为未来做好准备,请使用 flexbox。示例 -

.fieldHeading {
  width: 50px;
}
.fieldSpan {
  overflow: hidden;
}
#field1 {
  width: 150px;
}
/*flexbox approach.
* height and background added for clarity.
*/

#form {
  height: 100px;
  background: #bada55;
  display: flex;
  align-items: center;
}
<div id="form">
  <label for="field1" class="fieldHeading">Name&nbsp;</label>
  <span class="fieldSpan"><input type="text" id="field1" value="default name" /></span>
</div>

vertical-align 方式

当您将labelinput 放在一行上作为inline-block 元素时,这很有效。示例 -

.fieldHeading {
  width: 50px;
  vertical-align:middle;
}
.fieldSpan {
  overflow: hidden;
  vertical-align:middle;
}
#field1 {
  width: 150px;
}
<div id="form">
  <label for="field1" class="fieldHeading">Name&nbsp;</label>
  <span class="fieldSpan"><input type="text" id="field1" value="default name" /></span>
</div>

height & line-height 二人组

这也很有效,但如果你的标签很大并且有可能换成多行,它会看起来很糟糕。示例 -

.fieldHeading {
  width: 50px;
}
.fieldSpan {
  overflow: hidden;
}
#field1 {
  width: 150px;
}

/*line-height and height be same for parent
* background added for clarity.
*/
#form {
  line-height: 40px;
  height: 40px;
  background: #bada55;
}
<div id="form">
  <label for="field1" class="fieldHeading">Name&nbsp;</label>
  <span class="fieldSpan"><input type="text" id="field1" value="default name" /></span>
</div>

我希望这些不仅可以帮助您解决这个问题,还可以帮助您解决所有其他垂直对齐问题。

【讨论】:

  • 谢谢!已经提到了您的垂直对齐方法,尽管所有提到的变体都不适合我。但是,您的 flexbox 方法可以。我建议您在顶部突出显示该解决方案。 +1 用于实施真正的中心对齐、面向未来的有效解决方案!
【解决方案2】:

您可以使用line-heightmargin-bottom,直到获得满意的结果。

示例

#form label {
    line-height:1.4;
    margin-bottom:2px;
}

这会将选择器应用于表单下的所有标签。如果你想具体一点,可以使用 .fieldHeading 这样的特定 css 类来代替 #form label

【讨论】:

  • 如何使用这些属性?
【解决方案3】:

你需要这样吗?

<div id="form">
    <div class="valign">
        <label for="field1" class="fieldHeading">Name&nbsp;</label>
        <span class="fieldSpan"><input type="text" id="field1" value="default name" /></span>
    </div>
</div>

<style>
.fieldHeading {
    float: left;
    width: 50px;
}
.fieldSpan {
    display: block;
    overflow: hidden;
    width: *;
}
#field1 {
    width: 150px;   
}

#form {display: table;height:100%;}

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

</style>

【讨论】:

  • display:table 的好习惯,考虑到使用&lt;table&gt; 不是吗?如果可以接受,为什么?
  • @thegreatjedi - 使用display: table 进行布局没有任何问题。
【解决方案4】:

我认为,解决方案 margin-bottom,使用任何你想要的 px

.fieldHeading {
    float: left;
    width: 50px;
    margin-bottom: 3px;
}

【讨论】:

    【解决方案5】:

    用途:

    .fieldHeading {
      display: inline-block;
      width: 50px;
      vertical-align: middle;
    }
    #field1 { width: 150px; }
    

    设 span 为内联类型。

    你并不真的需要跨度来包围你的输入元素。

    【讨论】:

    • 编辑了我的代码以反映您的建议。然而,您的回答并没有达到我想要做的事情
    • 我知道你已经找到了答案,但还是请看看这个:jsFiddle
    • 旧版浏览器也不支持 flexbox。见browser compatibility。将此纳入您的注意事项。我没有足够的声誉,否则会回复那个答案! :)
    • 注意,谢谢。我们已经控制了用户在这个系统中使用的浏览器和版本,所以只要它适合我就可以了。
    猜你喜欢
    • 2012-01-23
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多