input要素をlabel要素内に配置する必要がありますか?


606

labelおよびinputHTML要素のネストに関するベストプラクティスはありますか?

古典的な方法:

<label for="myinput">My Text</label>
<input type="text" id="myinput" />

または

<label for="myinput">My Text
   <input type="text" id="myinput" />
</label>

107
パッティングの大きな長所の一つ<input />内側<label>、あなたは省略することができるということですforid<label>My text <input /></label>あなたの例では。とてもいい!
Znarkus、2011

16
これinputは意味的にaの内部に属さないことに同意しlabelますが、今日、Bootstrap開発者が私に同意しないことに気付きまし。インラインチェックボックスなどの一部の要素は、inputが内側か外側かによってスタイルが異なります。
Blazemonger 2013

6
ところで<label for="id">、私はページに複数のフォームがありidunique id per pageトラップに陥らない限り多くのウィジェットの属性を使用できないので、これは作成するのが本当に悪い考えでした。ウィジェットにアクセスする唯一の受け入れられる方法は、による方法form + widget_nameです。
MaxZoom

5
@MaxZoom同一のフィールド名を持つページに非常に多くの異なるフォームがあり、一意のIDが思い付かない場合は、ページのデザインを少し考え直してください。明らかに私はあなたの状況を知りませんが、それは私に悪臭を
放ち

5
@kenbellows 2つの検索フォームを1つのページに配置することは、デザイナー/ビジネス(私ではありません)のアイデアです。ユーザーエクスペリエンスのベストプラクティスは時間の経過とともに変化する可能性がありますが、HTMLは目に見えるシナリオをカバーするのに十分な柔軟性(IMHO)を備えている必要があります。
MaxZoom 2016

回答:


529

w3から:ラベル自体は、関連するコントロールの前、後、または周囲に配置できます。

<label for="lastname">Last Name</label>
<input type="text" id="lastname" />

または

<input type="text" id="lastname" />
<label for="lastname">Last Name</label>

または

<label>
   <input type="text" name="lastname" />
   Last Name
</label>

3番目の手法は、テーブルがレイアウトに使用されている場合は使用できません。1つのセルにラベルがあり、別のセルに関連するフォームフィールドがあります。

どちらかが有効です。私は最初の例か2番目の例のどちらかを使用するのが好きです。それはあなたがより多くのスタイルコントロールを提供するからです。


14
回答したとおり、すべてが有効ですが、私自身の慣例では、通常、テキストボックス、テキストエリア、および選択について、superUntitledによってここに示されている最初の例で解決します。しかし、ラジオボタンとチェックボックスの場合は、通常、3番目の例を使用します。この例では、付随するテキストの前に入力し、残りのラベルとフィールドが使用しているのと同じ種類の固定幅やフローティングを使用しません。したがって、任意の1つのフォームで、これらの形式の両方を一緒に使用していることがわかります。
Funka

6
<label for="inputbox"><input id="inputbox" type="text" /></label>彼らの基準によると合格かしら。
マット

64
入力タグ内にラベルをネストできないのは残念です。ラベルを抽象的な観点から見ると、ラベルは実際には入力のプロパティであるため、意味的にははるかに合理的です。
Alex

9
リンクされたWCAGドキュメントには、「コントロールはラベルテキストを含むラベル要素内に含まれています」というオプションが含まれています。@Sorcyがコメントしてから数年でそれが追加されたかどうかはわかりませんが、ラベル入力のシナリオは現在有効と見なされています。
Alex Weitzer

6
少なくともchrome内のラベル内の入力に問題があります。ラベルにクリックイベントハンドラーをアタッチすると、ラベルがクリックされたときにハンドラーが2回起動されます。return false;ハンドラーの最後でこれを使用して取得できますが、後で実行する必要がある他のハンドラーがあり、伝播を停止することができない場合は、これが問題になります。
Wired_in

67

私は好む

<label>
  Firstname
  <input name="firstname" />
</label>

<label>
  Lastname
  <input name="lastname" />
</label>

以上

<label for="firstname">Firstname</label>
<input name="firstname" id="firstname" />

<label for="lastname">Lastname</label>
<input name="lastname" id="lastname" />

主にHTMLが読みやすくなるためです。そして、CSSはネストされた要素で非常にうまく機能するので、実際、私の最初の例はCSSでスタイルを設定する方が簡単だと思います。

しかし、それは私が思う好みの問題です。


さらにスタイルオプションが必要な場合は、spanタグを追加します。

<label>
  <span>Firstname</span>
  <input name="firstname" />
</label>

<label>
  <span>Lastname</span>
  <input name="lastname" />
</label>

私の意見ではコードはまだ良く見えます。


3
ラベル内に入力を含めることは、レイアウトにHTMLを使用することと同じです。
エミル

8
次のような場合にも、この解決策が好きです<label>Expires after <input name="exp" /> days</label>(ラベルはinput要素の前後にあります)
Philipp

私は最後の例だと思う-のためとid属性のほかに-に包まれた入力との両方に次のラベルを持つから、本当にすべて異なっていないdivliまたは何ではない、それはです!
レトロバーティゴ2015年

1
@retrovertigo-機能的に?いいえ。マークアップが減り、用語の意味的な過剰使用が減ります。入力firstnameはのラベルに従う必要があることはわかってfirstnameいますが、ブラウザには宣言が必要です。それはすべて好みの問題であり、コード内で最もよく見える(そしてデバッグが最も簡単である)と思うものです。今はネストを使用する方が好きですが、慣れるまでに少し時間がかかりました。
Xhynk 2015

3
@MPavlak-簡単に見て、w3.orgからこのガイダンスを見つけました。w3.org/WAI/tutorials/forms/labels。次に、w3.org/TR/WCAG20-TECHS/H44.htmlを確認しました。一番下(あいまいです)には、適合を主張するためにテスト基準に合格する必要があることと、for属性を使用する必要があることが具体的に示されています。実際、これをApple Voiceoverで最後にテストしたとき(10%の市場シェアのスクリーンリーダーデスクトップ、60%の市場シェアスクリーンリーダーモバイル)の暗黙のラベルは機能しなかったため、これも別の大きな要因でした。お役に立てば幸いです。
James Westgate

39

labelタグにinputタグを含める場合、 'for'属性を使用する必要はありません。

とは言っても、エンティティーを含んでいない独立していると思うので、ラベルにinputタグを含めたくありません。


8
forにはidを使用する必要があります。これにより、レイアウトを階層的に構造化することが非常に難しくなります:-(
lethalman

39

動作の違い:ラベルと入力の間のスペースをクリック

のスペースをクリックするラベルと入力のと、ラベルに入力が含まれている場合にのみ入力がアクティブになります。

この場合、スペースはラベルの別の文字であるため、これは理にかなっています。

<p>Inside:</p>

<label>
  <input type="checkbox" />
  |&lt;----- Label. Click between me and the checkbox.
</label>

<p>Outside:</p>

<input type="checkbox" id="check" />
<label for="check">|&lt;----- Label. Click between me and the checkbox.</label>

ラベルとボックスの間をクリックできるということは、次のことを意味します。

  • クリックしやすい
  • 物事の始まりと終わりがはっきりしない

ブートストラップチェックボックスV3.3の例では、入力の内部を使用します。http://getbootstrap.com/css/#formsは、それらに従うことが賢明であるかもしれません。しかし、彼らはv4.0 https://getbootstrap.com/docs/4.0/components/forms/#checkboxes-and-radiosで考えを変えたので、私はもう何が賢明かわかりません:

チェックボックスとラジオの使用は、HTMLベースのフォーム検証をサポートし、簡潔でアクセス可能なラベルを提供するように構築されています。したがって、<input><label>は、<input>内のとは対照的に兄弟要素<label>です。これは少しより多くのあなたがIDを指定する必要がありますように冗長と属性が関係するためである<input><label>

この点を詳しく説明するUXの質問:https : //ux.stackexchange.com/questions/23552/should-the-space-between-the-checkbox-and-label-be-clickable


これは仕様の違いではありません。トグルは、すべての対応ブラウザでどちらの場合にも機能します。
hexalys 2014

@hexalysレポートをありがとう。答えを更新しました。どちらの場合も、対応ブラウザでトグルするかしないかを指定しますか?あなたが関連する標準的なパッセージにリンクできたら素晴らしいでしょう。
Ciro Santilli郝海东冠状病六四事件法轮功

1
はい。あなたのスペースは実際にはテキストスペースではないので、あなたの例が誤解を招くのに気づかなかったが。それはですmarginチェックボックスの。あなたの例のFirefoxの動作は奇妙で、バグのようです。A labelには、クリック可能なインラインコンテンツの周囲にスペースまたはパディングが含まれます。ただし、ラベルのコンテンツモデルがインライン/ フレージングコンテンツであることを考えると、すべてのブラウザーでdisplay: blockラベルの内側がblockクリック可能になるようにラベルが作成されていない限り、入力のマージンはクリックできません。
hexalys 2014

1
回答のブートストラップリンクは、v3.3のドキュメントに移動することに注意してください。v4.0ドキュメントは、彼らが気が変わったことを示しているようです:「チェックボックスとラジオの使用は、HTMLベースのフォーム検証をサポートし、簡潔でアクセス可能なラベルを提供するために構築されています。 <label>内の<input>ではなく兄弟要素です。idを指定し、属性が<input>と<label>を関連付ける必要があるため、これは少し冗長になります。
Michael Krebs

2
この行動の違いは私にとって大きな違いです。要素が兄弟である場合、いずれかの要素にマージンがあると、入力要素をトリガーするクリック可能な表面積が減少します。ラベル内で入力をネストすると、クリック可能な最大領域が保持され、マウスやタッチの正確な動きに苦労しているユーザーにとっても最大のアクセシビリティが提供されます。Bootstrap 4では、Bootstrap CSSを調整したりオーバーライドしたりしなくても、ネストは機能し、同じように表示されます。
18年

17

個人的には、2番目の例のように、ラベルを外側に置いておきます。そのため、FOR属性が存在します。フォームの見栄えをよくするために、幅などのスタイルをラベルに適用することが多いのはその理由です(以下の略記)。

<style>
label {
  width: 120px;
  margin-right: 10px;
}
</style>

<label for="myinput">My Text</label>
<input type="text" id="myinput" /><br />
<label for="myinput2">My Text2</label>
<input type="text" id="myinput2" />

テーブルとフォーム内のすべてのジャンクを回避できるようにします。


3
<br />入力の分離に使用するのではなく、CSSにプレゼンテーションを任せるべきではありませんか?
Znarkus、2011

1
@Znarkus-はい、通常、それらをOL / LIでラップして、そのようなフォーマットを処理します。これは簡単な速記の例にすぎません。
オウム

1
@オウム:意味的には意味がありません、imo。そして、それらをラップする必要がある場合は、なぜラベルでそれらをラップしないのですか?
Znarkus、2011

1
@Parrotsその理由で、ページ上のすべてがul / liの中に入るはずだと思います。そして、<label> <span>My text</span> <input /> </label>あなたはあなたが(永遠に)必要とするであろうすべてのスタイリングオプションを持っています。
Znarkus、2011

1
「for」を使用すると、IDの使用が強制されます。これは、階層型レイアウトには適していません。
致死者

15

W3の推奨事項については、http://www.w3.org/TR/html401/interact/forms.html#h-17.9を参照してください

彼らはそれがどちらの方法でも行うことができると言います。これらは、2つのメソッドを明示的(要素のIDで「for」を使用)と暗黙的(ラベルに要素を埋め込む)として記述します。

明示的:

for属性は、ラベルを別のコントロールに明示的に関連付けます。for属性の値は、関連付けられたコントロール要素のid属性の値と同じである必要があります。

暗黙:

ラベルを別のコントロールに暗黙的に関連付けるには、コントロール要素がLABEL要素のコンテンツ内にある必要があります。この場合、LABELに含めることができる制御エレメントは1つだけです。


私は、暗黙がIEで機能していないことを発見しました...。アイデア?
carinlynchin

11

どちらも正しいですが、ラベル内に入力を配置すると、CSSでスタイル設定するときに柔軟性が大幅に低下します。

1つ目は、aに<label>含めることができる要素が制限されていることです。たとえば、が内にない場合は、とラベルテキストの<div>間にのみを配置できます。<input><input><label>

2つ目は、内側のラベルテキストをスパンでラップするなどのスタイル設定を簡単にする回避策がありますが、一部のスタイルは親要素から継承されるため、スタイル設定が複雑になる可能性があります。


はるかに柔軟性が低いですか?詳しく説明できますか?他の人が述べたように、内側のラベルテキストをスパンで単純にラップすることができますが、それで柔軟性が大幅に低下するのではないでしょうか。
MPavlak 2016年

7

注目すべき 'gotcha'は、明示的な "for"属性を持つ<label>要素内に複数のinput要素を含めてはならないことを示しています。例:

<label for="child-input-1">
  <input type="radio" id="child-input-1"/>
  <span> Associate the following text with the selected radio button: </span>
  <input type="text" id="child-input-2"/>
</label>

これは、カスタムテキスト値がラジオボタンやチェックボックスに次ぐフォーム機能では魅力的ですが、ラベル要素のクリックフォーカス機能は、 'for'属性で明示的に定義されたIDを持つ要素にすぐにフォーカスをスローします、ユーザーが含まれているテキストフィールドをクリックして値を入力することをほぼ不可能にします。

個人的に、私は入力子を持つラベル要素を避けようとします。ラベル要素がラベル自体よりも多くを包含することは、意味的に不適切であると思われます。特定の美的感覚を実現するために入力をラベルにネストする場合は、代わりにCSSを使用する必要があります。


4
これは「落とし穴」ではありません。これは明示的に仕様の一部です。ラベルには最大1つのコントロールを含めることができます。また、ここでは暗黙的スタイルと明示的スタイルを混在させています-ラベル内にコントロールを配置する場合、必要はありませんfor...を使用する場合for、ラベル内にコントロールを置くことはあまり意味がありません。 。
cHao

確かに、この仕様はよく理解されていないようです。Drupal 6のフォームAPIでこの問題に遭遇しました。これにより、上記とは異なるシナリオを作成するマークアップが生成されました。同僚がいて、私は1〜2分頭を悩ませていたので、将来の混乱の可能性を回避するために、この問題をここに放映したいと思いました。
アーロン

ラベル->入力シナリオでは「for」は必要ありません。ラベルごとに1つの入力があり、名前やIDを知る必要がないという利点があります。CSSスタイルを設定してオブジェクトをカプセル化したままにしたり、内部の他の要素をクリックしたときにフォーカスが発生するようにしたりできます。クリーンな方法の例については、zipstory.com / signupを参照してください。
Jason Sebring、2012年

ありがとうございました; これは、私が持っていた別の関連する質問、つまり、ラベル内に複数の入力がある可能性があるかどうかに答えました。(コンテキスト:複数のラジオボタンオプション、1行に1つ、各ラジオボタンエントリにはテキストタイプの入力が1、2、3、またはそれ以上あり、その行のラジオボタンを選択した結果を持つ行をクリックする意図がある場合、選択されておらず、その行の入力/入力の編集が可能です。)これにより、フォーム内の非入力テキストに複数のラベルを付けることができるようになりますが、私の考えが問題なかったかどうかについての質問に答えました。(そうではありませんでした。)
クリストスヘイワード

6

ほとんどの人が言ったように、実際には両方の方法が機能しますが、私は最初の方法だけがすべきだと思います。意味的に厳密であるため、ラベルは入力を「含まない」。私の意見では、マークアップ構造の包含関係(親/子)は、ビジュアル出力の包含関係を反映する必要があります。つまり、マークアップで別の要素を囲む要素は、ブラウザでその要素の周りに描画する必要があります。これによると、ラベルは親ではなく入力の兄弟である必要があります。したがって、オプション番号2は恣意的で混乱を招きます。Zen of Pythonを読んだことのある人ならだれでもおそらく同意するでしょう(Flatは入れ子よりも優れており、SparseはDensityよりも優れています。それを行うための明白な方法は1つ、できれば1つだけあるはずです...)。

W3Cや主要なブラウザーベンダー(「正しい方法で実行する」ではなく「どちらを実行したい場合でも」を許可すること)がそのような決定を下したため、今日のWebはめちゃくちゃになり、開発者は混乱に対処する必要がありますそしてとても多様なレガシーコード。


5

通常、最初の2つのオプションを使用します。ラベルに埋め込まれたラジオの選択肢とCSSに次のようなものが含まれているときに、3番目のオプションが使用されたときのシナリオを見ました

label input {
    vertical-align: bottom;
}

無線機の適切な垂直配置を確保するため。



2

<label>IDを生成する必要がないので、要素を自分の内部でラップすることを非常に好みます。

私はJavaScript開発者であり、ReactまたはAngularを使用して、自分や他の人が再利用できるコンポーネントを生成しています。その場合、ページ内でIDを複製するのが簡単になり、奇妙な動作につながります。


1

考慮する必要がある1つのことは、チェックボックスとラジオ入力とJavaScriptの相互作用です。

以下の構造を使用:

<label>
  <input onclick="controlCheckbox()" type="checkbox" checked="checkboxState" />
  <span>Label text</span>
</label>

ユーザーが「ラベルテキスト」をクリックすると、controlCheckbox()関数が1回起動されます。

しかし、入力タグがクリックされると、一部の古いブラウザではcontrolCheckbox()関数が2回起動される場合があります。これは、入力タグとラベルタグの両方がチェックボックスに添付されたonclickイベントをトリガーするためです。

次に、checkboxStateにいくつかのバグがある可能性があります。

最近、IE11でこの問題に遭遇しました。最近のブラウザでこの構造に問題があるかどうかはわかりません。


-1

input内部に配置する主な利点label、人間のタイピング効率とコンピュータのバイトストレージです。

@ZnarkusはOPへの彼のコメントで言った、

パッティングの大きな長所の一つ<input />内側<label>、あなたは省略することができるということですforid<label>My text <input /></label>あなたの例では。とてもいい!

注:@Znarknusコードには、コメントに明記されていない別の効率が含まれていました。type="text"省略することもできinput、デフォルトでテキストボックスがレンダリングされます。

キーストロークとバイトの並べて比較[1]。

31キーストローク、31バイト

<label>My Text<input /></label>

58キーストローク、58バイト

<label for="myinput">My Text</label><input id="myinput" />

それ以外の場合、スニペットは視覚的に同等であり、同じレベルのユーザーアクセシビリティを提供します。ユーザーはラベルをクリックまたはタップして、カーソルをテキストボックスに置くことができます。

[1] Windowsのメモ帳で作成されたテキストファイル(.txt)、Windowsファイルエクスプローラーのプロパティからのバイト数

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