在输入旁边的表格中对齐标签


136

我有一个非常基本和已知的表单场景,需要正确对齐输入旁边的标签。但是我不知道该怎么做。

我的目标是使标签在右侧输入旁边对齐。这是期望结果的图片示例。

在此处输入图片说明

为了方便起见,我做了一个小提琴,以澄清我现在所拥有的-http://jsfiddle.net/WX58z/

片段:

<div class="block">
    <label>Simple label</label>
    <input type="text" />
</div>
<div class="block">
    <label>Label with more text</label>
    <input type="text" />
</div>
<div class="block">
    <label>Short</label>
    <input type="text" />
</div>

Answers:


189

一种可能的解决方案:

  • 给标签display: inline-block;
  • 给他们一个固定的宽度
  • 文字向右对齐

那是:

label {
  display: inline-block;
  width: 140px;
  text-align: right;
}​
<div class="block">
    <label>Simple label</label>
    <input type="text" />
</div>
<div class="block">
    <label>Label with more text</label>
    <input type="text" />
</div>
<div class="block">
    <label>Short</label>
    <input type="text" />
</div>

JSFiddle


4
如果某些标签是复选框或单选按钮,该如何工作?这些元素的标签最终具有与文本框标签相同的固定宽度,这是不希望的。有没有办法在标签上没有固定宽度的情况下进行此操作?
丽贝卡·梅里兹

@RebeccaMeritz您的意思是,标记首先具有复选框,其后具有标签吗?您可以为两者都添加一个类,并分别设置其样式。也许您应该问一个新的问题
bfavaretto 2014年

2
如何使这种响应?以及如何应对i18n?我的意思是文本标签在不同的语言中具有不同的长度,因此我担心如果文本较长,设置固定宽度填充将不起作用。
方位角

@Azimuth如今,您可能想使用CSS网格。
bfavaretto

1
这是标记固定宽度,它应该是动态的,基于最大标签宽度。
Samyak Jain

27

虽然此处的解决方案可行,但我认为更先进的技术已成为更好的解决方案。CSS网格布局使我们能够构建更优雅的解决方案。

下面的CSS提供了2列的“设置”结构,其中第一列应为右对齐标签,第二列中应包含一些内容。通过将其包装在<div>中,可以在第二列中显示更复杂的内容。

[作为旁注:我使用CSS在每个标签后添加':',因为这是样式元素-我的偏爱。]

/* CSS */

div.settings {
    display:grid;
    grid-template-columns: max-content max-content;
    grid-gap:5px;
}
div.settings label       { text-align:right; }
div.settings label:after { content: ":"; }
<!-- HTML -->

<div class="settings">
    <label>Label #1</label>
    <input type="text" />

    <label>Long Label #2</label>
    <span>Display content</span>

    <label>Label #3</label>
    <input type="text" />
</div>


1
嘿,你可以加一个小提琴吗?
斯坦(Stan)

是的,我已经更新了答案以使用摘要。
大卫·卢瑟福

您在哪个Chrome版本和平台上遇到问题?
戴维·卢瑟福

1
最佳解决方案!现在优秀作品在Chrome 73
菲利普·米哈尔斯基

太棒了!如果将上面的列定义替换为grid-template-columns: max-content 1fr;,则第二列将使用所有剩余宽度。对我来说,这是此类布局的圣杯,其中不必指定列或内容的宽度,并且所有内容都自动完美地适合于可用空间。
jeff-h

12

之前回答了这样的问题,您可以在这里查看结果:

创建表单以使字段和文本彼此相邻-这样做的语义方法是什么?

因此,要将相同的规则应用于小提琴,可以用来display:inline-block并排显示标签和输入组,如下所示:

的CSS

input {
    margin-top: 5px;
    margin-bottom: 5px;
    display:inline-block;
    *display: inline;     /* for IE7*/
    zoom:1;              /* for IE7*/
    vertical-align:middle;
    margin-left:20px
}

label {
    display:inline-block;
    *display: inline;     /* for IE7*/
    zoom:1;              /* for IE7*/
    float: left;
    padding-top: 5px;
    text-align: right;
    width: 140px;
}

更新的小提琴


这是一个非常好的解决方案,除了必须对标签的宽度进行硬编码。如果新标签太长-布局将中断。似乎应该有一个更强大的解决方案?
mattstuehler

8

我使用类似的东西:

<div class="form-element">
  <label for="foo">Long Label</label>
  <input type="text" name="foo" id="foo" />
</div>

样式:

.form-element label {
    display: inline-block;
    width: 150px;
}

4

您也可以尝试使用flex-box

<head><style>
body {
    color:white;
    font-family:arial;
    font-size:1.2em;
}
form {
    margin:0 auto;
    padding:20px;
    background:#444;
}
.input-group {
    margin-top:10px;
    width:60%;
    display:flex;
    justify-content:space-between;
    flex-wrap:wrap;
}
label, input {
    flex-basis:100px;
}
</style></head>
<body>

<form>
    <div class="wrapper">
        <div class="input-group">
            <label for="user_name">name:</label>
            <input type="text" id="user_name">
        </div>
        <div class="input-group">
            <label for="user_pass">Password:</label>
            <input type="password" id="user_pass">
        </div>
    </div>
</form>

</body>
</html>

那很漂亮,但根本不是他要的。参见op
phorgan1中

3

我知道这是一个旧线程,但是更简单的解决方案是将输入嵌入到标签中,如下所示:

<label>Label one: <input id="input1" type="text"></label>


我正在寻找一种解决方案(包括标签内的输入内容),但要使用对齐的文本
Natim

0

这是所有表单标签的通用标签宽度。没有固定宽度。

调用带有所有标签的setLabelWidth计算器。此功能将在UI上加载所有标签并找出最大标签宽度。将以下函数的返回值应用于所有标签。

     this.setLabelWidth = function (labels) {
            var d = labels.join('<br>'),
                dummyelm = jQuery("#lblWidthCalcHolder"),
                width;
            dummyelm.empty().html(d);
            width = Math.ceil(dummyelm[0].getBoundingClientRect().width);
            width = width > 0 ? width + 5: width;
            //this.resetLabels(); //to reset labels.
            var element = angular.element("#lblWidthCalcHolder")[0];
            element.style.visibility = "hidden";
            //Removing all the lables from the element as width is calculated and the element is hidden
            element.innerHTML = "";
            return {
                width: width,
                validWidth: width !== 0
            };

        };

0

您可以执行以下操作:

HTML:

<div class='div'>
<label>Something</label>
<input type='text' class='input'/>
<div>

CSS:

.div{
      margin-bottom: 10px;
      display: grid;
      grid-template-columns: 1fr 4fr;
}

.input{
       width: 50%;
}

希望这可以帮助 !:)

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.