【问题标题】:Vertical center an absolutely positioned input field inside its surrounding element垂直居中其周围元素内的绝对定位输入字段
【发布时间】:2015-11-03 01:32:03
【问题描述】:

我只是想在其周围的 DIV 中垂直居中输入字段,但同时页面上的所有输入字段都应彼此水平对齐(如果您愿意,应该具有相同的 left 值)。

这是问题的示例页面:

.wrapper {
  border: 1px solid #000;
  border-radius: 10px;
  margin: 10px;
  padding: 10px;
  line-height: 40px;
}
.inputClass {
  position: absolute;
  left: 25%;
  /* top: 50%; transform: translate(0, -50%); */
  /* not working as I need */
  vertical-align: middle;
}
<div class="wrapper">
  <div>
    <div>
      Some text
      <input type="text" class="inputClass" />
    </div>
    <div>
      Some more text
      <input type="text" class="inputClass" />
    </div>
  </div>
</div>

期望的结果(Firebug 的蓝色边缘):

【问题讨论】:

  • 你有想要的结果的图片吗?
  • @Paulie_D,我将其添加到问题中。

标签: html css alignment vertical-alignment


【解决方案1】:

您可以在字段集中对输入+标签进行分组,然后使用标签将输入移向中心,

试试这个:

.wrapper {
  border: 1px solid #000;
  border-radius: 10px;
  margin: 10px;
  padding: 10px;
  line-height: 40px;
}

fieldset {
  border: 0;
  /*resets UA*/
}
 /*can use label to move inputs right*/
label {
 width:40%;
 display:inline-block;
 padding-right :15px;
 text-align:right
 }
<div class="wrapper">
  <div>
    <fieldset>
      <label for='one'>Some text</label>
      <input id='one' type="text" class="inputClass" />
    </fieldset>
    <fieldset>
      <label for='two'>Some more text</label>
      <input id='two' type="text" class="inputClass" />
    </fieldset>
  </div>
</div>

【讨论】:

  • 我喜欢这样,但是字段集有什么用?我在这里看不到 fieldset 和 div 之间的区别。
  • @jaySon fieldset 是一个特定的表单相关标签,用于对表单元素进行分组,通常表单和表单相关元素具有一些特殊的属性和属性;在您的情况下,您可以使用常规 div 做同样的事情
【解决方案2】:

将文本放在label 中(无论如何这是一个好习惯)并使用内联块将元素放在一起。然后,您可以根据需要为 label 指定宽度:

.wrapper {
  border: 1px solid #000;
  border-radius: 10px;
  margin: 10px;
  padding: 10px;
  line-height: 40px;
}
.wrapper label {
  display:inline-block;
  width:25%;  
  vertical-align:middle;
}
.wrapper input {
  display:inline-block;
  vertical-align:middle;
}
<div class="wrapper">
  <div>
    <div>
      <label for="field1">Some text</label>
      <input id="field1" type="text" class="inputClass" />
    </div>
    <div>
      <label for="field2">Some more text</label>
      <input id="field2" type="text" class="inputClass" />
    </div>
  </div>
</div>

【讨论】:

  • 抱歉,必须将某人的答案标记为 THE 答案。不过,你的也一样好。
【解决方案3】:

一个很好的方法(在我看来)是使用 HTML 中的 table 标签来组织输入字段和标签。然后我会使用“valign”属性并将其设置为“TOP”,例如

<table>
  <tr>
    <td valign="TOP">
      Some text
    </td>
    <td valign="TOP">
      <input type="text" class="inputClass" />
    </td>
  </tr>
  <tr>
    <td valign="TOP">
      Some more text
    </td>
    <td valign="TOP">
      <input type="text" class="inputClass" />
    </td>
  </tr>
</table>

分配给 TD 的 valign="TOP" 将使其位于表格中单元格的顶部。这将确保它们彼此垂直和水平对齐。

【讨论】:

  • 上次检查时,不鼓励使用table 标记进行格式化。
  • 这在 HTML 程序员中是有争议的,但是,它似乎无需更改填充即可将其放置到正确的位置,这对于不同的浏览器和大小可能会出现问题。
  • 我相信有些人反对它的原因是它垂直对齐到看起来相当丑陋的单元格的中心。这就是为什么我使用 valign 属性将单元格中的所有内容设置为顶部。
  • 我宁愿说,人们反对它的原因是因为它是对标签的滥用。从 HTML 5 开始,valign 已过时(请阅读 here)。
  • 我刚刚发布了另一个不使用 table 标签的答案,尽管它需要 BootStrap。
【解决方案4】:

不使用表格标签的另一个答案:

<style>
  li {
    width: 120px;
  }
</style>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<div>
  <ul class="list-inline">
    <li>Some text</li>
    <li>
      <input type="text">
    </li>
  </ul>
  <ul class="list-inline">
    <li>Some more text</li>
    <li>
      <input type="text">
    </li>
  </ul>
</div>

这将用于 BootStrap 以便将其列在一行中。

【讨论】:

  • 不幸的是,我在整个项目中使用了一个名为“DevExtreme”的框架,这与 Bootstrap 冲突。
【解决方案5】:

一种可能的解决方案是将所有表单标签放在一个具有“col-left”类的 div 中,并将输入字段放在一个具有“col-right”类的 div 中。这两个都是垂直居中对齐的(vertical-align: middle)& 左侧的标签列具有相等的宽度设置。

请在下面找到完整的解决方案:

.wrapper {
  border: 1px solid #000;
  border-radius: 10px;
  margin: 10px;
  padding: 10px;
  line-height: 40px;
}
.col-left, .col-right {
  vertical-align: middle;
  display:inline-block;
}
.col-left {
  width: 20%;
}
<div class="wrapper">
  <div>
    <div class="col-left">Some text</div>
    <div class="col-right">
      <input type="text" class="inputClass" />
    </div>
  </div>
  <div>
    <div class="col-left">Some more text</div>
    <div class="col-right">
      <input type="text" class="inputClass" />
    </div>
  </div>
</div>

【讨论】:

    猜你喜欢
    • 2017-02-01
    • 2013-05-12
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2011-03-19
    • 1970-01-01
    • 2017-03-26
    相关资源
    最近更新 更多