フォームのラベルを入力の横に揃えます


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>

回答:


189

考えられる解決策の1つ:

  • ラベルを付け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
一部のラベルがチェックボックスまたはラジオボタンである場合、これをどのように機能させることができますか?これらの要素のラベルは、望ましくないテキストボックスラベルと同じ固定幅になります。ラベルの幅を固定せずにこれを行う方法はありますか?
レベッカメリッツ2014年

@RebeccaMeritzマークアップに最初にチェックボックスがあり、その後にラベルがあるときですか?両方にクラスを追加して、個別にスタイルを設定できます。おそらく、それについて新しい質問をする必要があります
bfavaretto 2014年

2
これを応答させる方法は?そして、どうやってi18nに対処するのですか?つまり、テキストラベルは言語によって長さが異なるため、テキストが長い場合は、固定幅の塗りつぶしが機能しない可能性があります。
方位角

@Azimuth最近では、代わりにCSSグリッドを使用したい場合があります。
bfavaretto

1
これは固定幅をマークしています。最大ラベル幅に基づいて動的にする必要があります。
Samyak Jain

27

ここでの解決策は実行可能ですが、より最近のテクノロジーが私がより良い解決策であると考えているものに貢献しています。CSSグリッドレイアウトを使用すると、よりエレガントなソリューションを構築できます。

以下のCSSは、2列の「設定」構造を提供します。最初の列は右揃えのラベルであり、2番目の列にいくつかのコンテンツが続きます。<div>でラップすることにより、より複雑なコンテンツを2列目に表示できます。

[補足として: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
ねえ、フィドルを追加してくれませんか?
スタン

はい、スニペットを使用するように回答を更新しました。
デビッドラザフォード

問題が発生しているChromeのバージョンとプラットフォームを教えてください。
デビッドラザフォード

1
最適なソリューション!クローム73になりました正常に動作します
フィリップ・Michalski

驚くばかり!上記の列の定義をに置き換えるとgrid-template-columns: max-content 1fr;、2番目の列は残りのすべての幅を使用します。私にとってこれは、列またはコンテンツの幅を指定する必要がなく、すべてが使用可能なスペースに自動的に完全に収まるようなレイアウトの聖杯です。
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

フレックスボックスを使ってみることもできます

<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%;
}

お役に立てれば !:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.