labelとinputが結びついている状態と、切れている状態を並べた図

小さなチェックボックスを押そうとして、何度か外してしまう。横の文字を押してみても、何も起きない。

フォームで、そんな経験はありませんか。

文字の方も押せるようにするのが、HTMLのlabelです。入力欄と項目名を結びつけることで、操作できる範囲が広がります。

labelが効かないときは、まずforidが完全に一致しているか、同じidを使い回していないかを確認してください。 ただし、クリックして反応しない原因には、HTML以外のものもあります。

書き方だけでなく、「なぜ結びつける必要があるのか」から見ていきます。

labelがあると、小さな四角を狙わなくてよくなる

「利用規約に同意する」という文字の横に、小さなチェックボックスがあるとします。

文字とチェックボックスが結びついていれば、四角だけでなく、文字を押してもチェックを切り替えられます。スマートフォンで指を使うときにも、押せる場所が広い方が操作しやすくなります。

小さな四角ではなく、「利用規約に同意する」の文字を押してみてください。

① 文字との関連付けなし

利用規約に同意する

チェックなし

② labelで文字と関連付け

チェックなし

①も四角自体を押せば切り替わります。②は文字も押せるので、押す場所を狙いやすくなります。練習用の見本で、実際の規約への同意や情報の送信は行いません。

そしてlabelには、もう一つ大切な役割があります。その欄に何を入力するのかを、画面の読み上げ機能にも伝えることです。

画面を見ていると、「お名前」という文字のすぐ下に入力欄があれば、名前を書く場所だと分かります。でも、文字を近くに置くだけでは、HTML上の結びつきまでは作られません。

スクリーンリーダーという、画面の情報を音声などで伝えるソフトを使う人にも、入力欄に移動したときに項目名が伝わるようにする。そのためにlabelを使います。W3Cのフォーム解説

「見れば分かる」を、見た目の位置関係だけに任せずに済むわけです。

基本は、forとidを同じにする

たとえば、お名前の入力欄なら、こう書きます。

<label for="your-name">お名前</label>
<input id="your-name" name="your-name" type="text">

確認するのは、次の組み合わせです。

  • labelのfor="your-name"
  • inputのid="your-name"

この二つを一致させると、「お名前」という文字が、どの入力欄の説明なのか決まります。

ここで間違えやすいのが、name属性との区別です。

属性この例での役割
forラベルを結びつける相手のidを指定する
idページ内の要素を識別する
nameフォームの値を送るときの項目名になる

上の例では同じ文字列にしていますが、labelのforが探している相手は、nameではなくidです。

入力欄をlabelで囲む書き方もあります。

<label>
  お名前
  <input name="your-name" type="text">
</label>

この形なら、結びつけるためのforとidは省略できます。これから覚えるなら、まずはforとidを明示する書き方にすると、コードを読んだときにも対応する相手を追いやすいと思います。

効かないときは、文字の違いとidの使い回しを見る

forとidが、一文字でも違っていないか

次の例は、似ていますが一致していません。

<label for="user-name">お名前</label>
<input id="username" type="text">

user-nameusername。ハイフンが一つ違います。

user-nameUser-nameのように、大文字と小文字が違う場合も別の値です。「だいたい同じ」では結びつきません。

見比べて分かりにくければ、片方の値をコピーしてもう片方に合わせると、入力し直すより間違いを減らせます。

コピーした入力欄に、同じidが残っていないか

住所欄をコピーして、お届け先の欄を作る。そんなときに気をつけたいのがidの重複です。

<label for="address">ご住所</label>
<input id="address" type="text">

<label for="address">お届け先</label>
<input id="address" type="text">

これでは、どちらのラベルも同じaddressを指定しています。HTMLの規則では、この例のように同じidの入力欄が並ぶと、先に現れる方が関連付けの対象になります。HTML標準のlabelの定義

「お届け先」を押したのに、上の「ご住所」にカーソルが移る。そういう動きにつながります。

修正するときは、入力欄のidと、それに対応するforをセットで変えます。

<label for="home-address">ご住所</label>
<input id="home-address" type="text">

<label for="shipping-address">お届け先</label>
<input id="shipping-address" type="text">

パソコン用とスマートフォン用のフォームを別々に作っている場合も、表示中のものだけでなく、同じページ内に重複がないか確認してください。

一致しているのに反応しない場合もある

forとidをそろえても動かないなら、指定している相手を見てみます。

<label for="email">メールアドレス</label>
<div id="email">
  <input type="email">
</div>

この例でidが付いているのは、入力欄を囲むdivです。labelは、その中のinputまで自動的に探して結びつけてくれるわけではありません。

idを入力欄へ移します。

<label for="email">メールアドレス</label>
<div>
  <input id="email" type="email">
</div>

一方、関連付けが正しくても、入力欄がdisabledで無効になっていたり、JavaScriptがクリック時の動作を止めていたりすると、期待した反応が出ないことがあります。

そのため、ラベルを押すのは手軽な動作確認ですが、反応しないだけで「forとidが間違っている」とは断定できません。

逆に、JavaScriptで入力欄へカーソルを移しているだけなら、クリックが動いてもlabelの関連付けがあるとは限りません。動きとHTMLの両方を見ることが大切です。

placeholderが消えても、何の欄か分かるか

入力欄の中に薄く表示する文字を、placeholderと呼びます。

<input type="text" placeholder="お名前">

すっきり見えますが、入力すると「お名前」の文字は消えます。

たとえば、名前、フリガナ、会社名を続けて入力し、途中で別の作業をしたとします。戻ってきたときに項目名が残っていないと、何を書く欄だったか確認しにくくなります。

labelとplaceholderは、役割を分けると分かりやすくなります。

<label for="full-name">お名前</label>
<input
  id="full-name"
  name="full-name"
  type="text"
  placeholder="例:山田 太郎"
>

labelには「何を書く欄か」。placeholderには、必要なら「どんな書き方をするか」の例を入れる。この形なら、入力を始めても項目名は残ります。必ず読んでほしい注意事項も、消える文字だけに任せず、欄の近くに表示しておきたいところです。

なお、aria-labelで読み上げ用の名前を付ける方法もあります。ただし、その文字は画面には表示されず、labelのように押せる範囲も広がりません。用途が見た目から分かる検索欄などで使う選択肢であり、表示できる項目名を一律に省くためのものではありません。W3Cのaria-labelの解説

最後に、入力する人のつもりで触ってみる

修正したら、コードを閉じてフォームを操作してみます。

「お名前」の文字を押すと、対応する欄にカーソルが入るか。チェックボックスは、横の説明文を押しても切り替えられるか。入力を始めたあとも、何の欄か分かるか。

チェックボックスなら、四角を押す場合と、文字を押す場合を比べてみてください。labelがあることで何が変わるのかを、自分の手で確かめられます。

見た目が整っていると、フォームは完成したように感じます。でも、実際に入力する人にとっては、押しやすさや迷わず書けることも大切です。

こうした細かい確認も、実務では必要になります。何が求められるかはコーダーが実務で重宝されるスキルはHTML/CSSだけではないに書きました。求人での呼ばれ方の違いはコーダーとマークアップエンジニアの違い|仕事内容と求人の見分け方にまとめています。

まずは、自分のフォームの「お名前」という文字を一度押してみる。そこからなら、難しい準備なしに確認を始められます。

ティエラ

40歳を目前に、未経験からプログラミングの学習を始めました。今はフルリモート・フルフレックスのコーダーとして働いています。遠回りした失敗も含めて、正直に記録しています。