すべてのinputに可視ラベルがあれば

フロントエンドカンファレンス北海道2025 LT
株式会社SmartHR maiha(@mt_dew2)

  • 入力要素のラベルに関する話をします。

入力要素とは

  • ユーザーに情報を入力させるUIコンポーネントのこと。
  • HTML要素では input, select, textarea, button
input要素各種、select,textarea,buttonを並べた画像

ラベルとは?

  • 「何を入力するか」を視覚的に示すもの
  • input, select, textareaでは、ラベルをlabelでマークアップする
    • ラベルと同じ内容がアクセシブルネームとして機械にも提供される

<label for="name">氏名</label>
<input type="text" id="name" name="name"/>

なぜ正しくラベルを設定することが大事なの?

  • ユーザーが入力に迷うことを防ぐ:ユーザビリティ
  • スクリーンリーダーなどにも情報を伝える:アクセシビリティ
  • 誤入力・意図しない情報の入力・送信を防ぐ:セキュリティ

私が見た!ラベルがないがちなUI

第1位:selectをつかったプルダウンメニュー

  • 表示内容・順序の切り替え、ページの移動などフォーム以外でも使われる
    が、selectは入力要素なのでラベルが必要
SmartHRの文書配付機能のスクリーンショット。すべての依頼と書かれたSelectが配置されている。
ラベルをつけて改善
文書配付のスクリーンショット。Selectにはラベルがついている。

まとめ1: 入力要素とラベル

  • 原則: 入力要素にはラベルが必要(3.3.2: ラベル又は説明

  • labelなどで、適切なマークアップをすれば、アクセシブルネームとしても提供される

ラベルがあるけどアクセシブルネームが漏れてしまうケース😭

アクセシブルネーム漏れあるある: 分割されたinput 💔

電話番号や郵便番号など、複数のinputに分かれているケースでlabelは複数のinputと紐づけられない。

電話番号の入力欄。3つのinputがある郵便番号の入力欄。2つのinputがある。
  • 見た目上は「何を入力すべきか」をラベルで伝えている
  • 機械に伝えるにはアクセシブルネームが必要
    • 複数のinputを1つのlabelと紐づけできない😭

解決方法: 各inputにaria-labelを設定する

3つに分割された電話番号の入力欄。1つ目のinputにカーソルがあたっていて、devtoolsのポップアップでアクセシビリティ情報が表示されている。Nameには「電話番号 市外局番」と入っている。

💡見た目上のラベルと同じ文言をアクセシブルネームに含める必要がある(2.5.3: ラベルを含む名前

まとめ(2): ラベルとアクセシブルネーム

  • ラベルは1個でも、アクセシブルネームはinputごとに必要
  • アクセシブルネームにはラベルテキストを含めよう(2.5.3: ラベルを含む名前
  • 分割inputには気をつけよう😭
    • アクセシブルネームが漏れやすい
    • アクセシブルネームを検討するコストがかかる

本編!: 最近ラベル・アクセシブルネームに悩んだ入力UI

ここからは、ラベル・アクセシブルネームの付け方に悩んだものを紹介します!

といきたいのですが、LTの時間に収まらなかったので、あとでスライドをみて自分だったらどんなラベルやアクセシブルネームをつけるか考えてみてください♪
飛ばす

悩んだやつ1: 期間の入力

入社年月日というラベルがある、期間の入力欄。〜をセパレータとしてふたつのinputがならんでいる
  • 「入社年月日 開始日」「入社年月日 終了日」などのアクセシブルネームをつける
  • 「開始日」「終了日」のラベルはつける?つけない?
  • 「〜」で期間を表すのは日本だけなので翻訳時に注意が必要

悩んだやつ2: 条件の入力(範囲)

歳以上歳未満とかかれた年齢の入力欄。歳の前にinputがある。
  • 「年齢 下限値」「年齢 上限値」などのアクセシブルネームをつける
  • 下限値・上限値のラベルは表示する?不可視にする?
  • aria-labelledbyを使って、ラベル+input+歳以上の3つを紐づけると「年齢◯歳以上」のように良い感じに読み上げられるかも(参考: Labelling Controls
  • 「以上」「未満」などの表現は、他の言語への直訳に注意

悩んだやつ3: 条件の入力(条件文)

条件1という項目に3つの入力欄がある。入力はすべてコンボボックスで、2つ目と3つ目の入力の間に「の経験が」というテキストがある
  • 条件の大分類を選んだあと、小分類の項目と、その有無を選択させるUI
  • 1つ目と2つ目はCombobox | コンポーネント | SmartHR Design Systemで、3つ目はSelectを使用
  • 各入力要素に、あなたならどんなアクセシブルネームをつけますか?
  • 可視のラベル、つけられそうですか?

最後のまとめ

  • フォーム要素には入力の目的を説明するラベルをつけよう!
  • labelを使おう!
  • 分割には気を付けて〜!

「すべてのinputに可視ラベルがあれば」アクセシブルネームに悩まなくていいんだけど

ご清聴ありがとうございました!!

アクセシビリティエンジニア募集中です!!!!

  • アクセシビリティ分野での取り組みにおいて、強い思いのある方
  • 自ら提案し、チャレンジすることが好きな方
  • 多様なステークホルダーと協働できる方
  • アクセシビリティを「やさしさ」と捉えず、仕組みとして多くの人へ提供したい方

アクセシビリティエンジニア(シニア) / 株式会社SmartHR

リンク集

まず今日のキーワードの紹介です。 1つ目は、入力要素。ユーザーに入力をさせるためのUIコンポーネントのことです。 HTML要素でいうとinput、select、textarea,buttonなどのことです。

そして2つめはラベルです。 ラベルは「入力要素に何を入力するか」を視覚的に示す役割をします。 そして、inputなどの入力要素ではlabel要素を使ってマークアップすることで 同じ情報をスクリーンリーダーを始めとした支援技術に伝えることができます。

はい ではなぜラベルが大事なのか?という話をします 今日ここにいるみなさんはご存知だと思いますが。 まず1つ目、ユーザーが迷わず入力できること。ユーザビリティに関わる部分。まあアクセシビリティにも関わりますね 2つめ スクリーンリーダーなどの使用時にも情報が正しく伝わる。アクセシビリティ 3つめ、こちら意外と普段意識しないかもしれませんが、もしラベルが適切に設定されていないためにユーザーが本来送信しなくてよい・すべきでない情報を送信するというのは情報セキュリティのリスクといえます。というわけで、そういった観点でもラベルって重要なんですね。

はいここで、私が見た!ラベルがないがちなUIの第一位を発表します。ジャジャン

第一位はSelect要素です。特にSelectを利用したプルダウンメニューでよく省略されることがあります。 原因としては、これ単純にドロップダウンメニューみたいな使い方がされてしまうんですね。まあ確かに似てはいるのですが。 このケースではほとんどこの選択した情報はサーバーに送信されたりしないんですね。表示切替とかに使われたりします。 なんですが、Selectは入力要素なので、ラベルがないと「ラベルのない"入力要素"」となってしまいますので 原則としてはNGです。 まあそして実際、これ何を選択するのSelectなのか、プルダウンの中身 選択肢を見るまでは特定しにくいですよね。

では1つ目のまとめです。入力要素には原則としてラベルが必要です。これはWCAGだと3.3.2で、ユーザーに入力の期待値がわかるようにしろーというのがあります。 また、label要素を使えば、同じ内容がaccessible nameとしても提供される。とても便利なので絶対label要素使いましょうね。

はい。ラベルないがちなUIの紹介は第一位のみで、次の話題にいきます。次ラベルがないけどアクセシブルネームが漏れるケースの紹介です。

ではアクセシブルネーム漏れちゃうあるあるとして、分割された入力欄の話をします。

inputを分割しなければ、このような悩みは発生しないのですが どうしても分割が必要な場合は、aria-labelなどを使ってそれぞれのinputにaccessible nameを付与する必要があります。このとき見た目上のラベルがaccessible nameにも含まれるように設定してください。 これはWCAGの2.5.3で含めてね♪となっています。

では本日のまとめ2です アクセシブルネームは各input事に必要なので、分割inpuのときは気をつけてください。あとラベルに入っているテキストを含めてくださいというのは、こちらもWCAGの達成基準にありますので、後ほど見てみてください。 分割のinputを使わなければ、この悩みは不要になります。。

そして、ちょっと番外編で最近SmartHRでよく見るUIを3つ紹介します。1つめが期間の入力です。波ダッシュで区切って期間の開始と終了を入力することを表しています。 ラベルは「入社年月日」となっていて、2つのinputには個別のラベルはついていません。この場合はaria-labelで開始日・終了日などのアクセシブルネームを提供します。

こちらは範囲条件の入力UIです。 入力欄歳以上 入力欄歳未満という入力です。この場合はinputに「下限値」「上限値」などのAccessible Nameをつけることができます。 また、この入力ででてくる「以上・未満」などの言葉は、英語など他の言語では挿入すべき位置が数字の前だったり後だったりして、いろいろ考慮が必要になることにも注意してください。

そして最後に、文章型の条件入力です。 このUIの場合、条件1というテキストが全体のラベルの役割をしていそうですが、各入力欄にはどんなアクセシブルネームをつけるのがよいでしょうか? このスクリーンショットの場合だと1つ目が条件の分類みたいなものなので「分類」、2つ目がマーケティング部とはいっているので「部署」3つ目が「あり」なので多分「有無」が固有の名前(アクセシブルネーム)かなーと思います。 これは今このスクショに値が入っているので、推測から個別のアクセシブルネームを考えてみましたが 値が空だったら、多分検討が難しかったと思います。 また可視ラベルをつけるのは、これは非常に難しいですね。今のUIのままラベルを入力欄の上部につける みたいにすると、視覚的にゴチャゴチャしすぎて見えにくかったり入力に集中できなくなってしまう可能性があると思います。