CSS:「div」内の「ラベル」と「入力」を垂直方向に揃える方法は?


91

次のコードを検討してください。

HTML:

<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

CSS:

div {
    height: 50px;
    border: 1px solid blue;
}

置くための最も簡単な方法は何だろうlabelinputの中間にdiv(縦)?


1
私の知る限り、肝心なのは「できない」ということであり、それを回避する最も怠惰な方法は、単純なものを使用してそのに<table>適用valign='middle'すること<td>です。
BeemerGuy 2010

回答:


95

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

この方法の利点は、の高さをdiv変更したり、テキストフィールドの高さを変更したり、フォントサイズを変更したりできることです。これにより、すべてが常に中央に留まります。

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


1
エレガントに見えます:)この方法がブラウザとどのように互換性があるか知っている人はいますか?
Zaven Nahapetyan 2010

1
IEの場合、IE8以降でのみ機能すると思います。他のWebブラウザの場合は問題ありません。
マーク・フランソワ

1
私はについて知りませんでしたdisplay: table-cell。特定のブラウザでサポートされていますか?
BeemerGuy 2010

6
@Misha入力/ラベルが絶対的に配置されているという事実を指定する必要があります。それは質問の状況を完全に変えます。私はマークに+1を与えています。素晴らしい答え。
jessegavin 2010

2
jensonが作成しようとしていた(そして明確に表現する必要があった)ポイントは、make divを使用display: table-cellすると、同じ行での後続のdivレンダリングなど、予期しない方法で動作することだと確信しています。
taswyn 2013年

73

より現代的なアプローチは、cssフレックスボックスを使用することです。

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

より複雑な例...フレックスフローに複数の要素がある場合は、align-selfを使用して、指定した位置合わせとは異なる方法で単一の要素を位置合わせできます...

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

* {
  margin: 10px
}

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

また、水平方向と垂直方向の中央に配置するのも非常に簡単です。

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


ラベルに画像とテキストが含まれている場合にこれが機能することを願っています。小さなアイコンの後にテキストが続きますが、テキストが動かない。
ケビンシャルンホルスト

ラベルとテキストが別々の要素である場合、またはラベルをフレックスボックスにする場合にも機能します...
Holger Will

display:flex互換性が低く、Chrome 29+

14

これはクロスブラウザで機能し、アクセシビリティが向上し、マークアップが少なくなります。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>

3
これは明らかに2行のラベルでは機能しません。そして、ラベルが常に1行であることが確実な場合は、他の何百万もの選択肢があります。
lashae 2013

16
質問は1行のラベルに関するもので、それに応じて答えました。ここでのあなたのポイントや意図についてはよくわかりませんが、xが非常に明白な場合は、100万の例を作成する必要があります。少なくとも、あなたが私の答えの下でうっとりして、あなたの百万の勝利の力を感じることができるように。ブラボー。
アルバート2013

2
これは、単一行ラベルの最良の回答です。仕様によると、「for属性が指定されていないが、label要素にラベル付け可能なフォーム関連要素の子孫がある場合、ツリー順で最初のそのような子孫は、label要素のラベル付きコントロールです。」したがって、これは、最大の単純化のためにforおよびid属性を省略できる唯一のアプローチです。
議会

8

この質問が2年以上前に行われたことは承知していますが、最近の視聴者のために、Marc-Françoisのソリューションに比べていくつかの利点がある代替ソリューションを次に示します。

div {
    height: 50px;
    border: 1px solid blue;
    line-height: 50px;
}

ここではline-height、divの高さと同じ値を追加するだけです。inline-blockたとえば、divの表示プロパティを適切と思われるように変更できるという利点があり、その内容は垂直方向の中央に残ります。受け入れられているソリューションでは、divをテーブルセルとして扱う必要があります。これは完全に機能するはずです、クロスブラウザ。

他の唯一の利点は、CSSルールが2つではなく1つだけであるということです:)

乾杯!


6

使用padding上のdiv上部と下部)とvertical-align:middlelabelinput

http://jsfiddle.net/VLFeV/1/の


それはjsfiddleでは機能しません。の高さを変更したところ、div中身がまったく動かなかった。私は何かが足りないのですか?
BeemerGuy 2010

私の意見では、レイアウトのピクセル高は固定されるべきではありません…レイアウトはコンテンツの周りを流動的に流れる必要があります。しかし、私はブラウザがズームインおよびズームアウトするときにテキストサイズを拡大縮小した日と時間から来ています。最近のブラウザは実際にはページ全体を拡大縮小するため、ピクセルの高さを設定する方が少し効果的です。ただし、ピクセルの高さを設定しないようにするまったく新しい理由があります。たとえば、レスポンシブレイアウト手法などです。これが私の好ましい方法である理由です。
サードエンダー2012年

3

ラベルをラップし、定義された高さの別のdivに入力します。これは、8より前のIEバージョンでは機能しない場合があります。

position:absolute; 
top:0; bottom:0; left:0; right:0;
margin:auto;

0

display: table-cell次のコードのようにプロパティを使用できます。

div {
     height: 100%;
     display: table-cell; 
     vertical-align: middle;
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.