1 ポイント 投稿者 GN⁺ 2025-11-13 | 1件のコメント | WhatsAppで共有
  • 複雑な JavaScript日付ピッカー の代わりに、シンプルでアクセシビリティの高い入力方法を提案するガイド
  • ブラウザ標準の入力要素(date, time, datetime-local)を活用すれば、アクセシビリティ、パフォーマンス、国際化対応を自動的に得られる
  • 分離された入力フィールドマスク入力ラジオボタングループ などで複雑な UI を簡素化できる
  • React などのフレームワーク でも標準の HTML 入力要素をそのまま使え、スタイル指定には制限があるものの、ユーザーにとって馴染みのあるシステム UI を維持できる
  • すべての日付ピッカーにはアクセシビリティ上の問題があるため、シンプルな入力構造と実際のユーザーテスト が成功するフォーム設計の鍵

JavaScript日付ピッカーは本当に必要か

  • ほとんどの場合、別個の JavaScript日付ピッカー は不要
    • 複雑な UI はエラーやフォーム離脱を招く
    • カレンダーウィジェットより簡単な日付入力方法がある
  • このガイドは ユーザーフレンドリーなインターフェース のための代替案を示すことが目的

ブラウザ標準の日付・時刻入力

  • すべての最新ブラウザは 標準の date, time, datetime-local 入力タイプ をサポートしている
    • date は日付選択、time は時・分入力、datetime-local は両方を組み合わせたもの
  • 標準入力は 1 行のコードで実装でき、ブラウザが アクセシビリティ・パフォーマンス・国際化 を処理する
    • キーボード入力をサポートし、標準のカレンダー UI を提供
    • 完璧ではないが、ほとんどの JavaScript ライブラリより安定している
  • ただし、一部の アクセシビリティ上の問題 は依然として存在する

分離された入力と選択要素

  • 1 つの日付ピッカーより 年・月・日を分けた入力 のほうが使いやすさを向上できる
    • GOV.UK の date input コンポーネントの例を提示
  • 有効なデータが限定される場合は select 要素 の使用が適している
    • 入力ミスを防ぎ、操作を減らせる
    • 月を数字で表記する場合はスクリーンリーダーの誤読に注意
  • 旅行予約など固定された時間間隔(例: 15 分単位)では、相対的な日付(今日、明日)の表現が有用

マスク入力とバリデーション

  • マスク入力フィールド は、カレンダーなしで日付形式の入力を促す代替手段
    • JavaScript でクライアント側の検証と書式設定が可能
    • 例: 「2月の有効な日付を入力してください(1〜28)」というエラーメッセージ
    • Intl API で日付形式を自動フォーマット
  • ただし、JavaScript で入力値を更新すると undo/redo 機能が壊れる可能性がある
  • CSS を使って複数の入力を視覚的に 1 つのように見せて結合できる

範囲選択と限定された選択肢

  • 2 つのカレンダーを使う 範囲選択型の日付ピッカー は操作が難しく、ポインターなしでは使いにくい
    • 代わりに 2 つの入力フィールド でシンプルにできる
  • 選択可能な日付だけが必要な場合は radio 入力グループ に置き換えられる
    • 複雑な UI の代わりに、単純な段階的作業として構成できる
    • 多段階フォームを JavaScript で単一ページのインタラクションに拡張できる

自由入力と提案機能

  • 正確な日付・時刻が必要ない場合は 標準のテキスト入力 が有用
  • datalist 要素を使えば入力候補を提示できる
    • date, time 入力タイプとも一緒に動作する

よくある質問

JavaScriptフレームワークを使う場合

  • すべての主要フレームワークで 標準の HTML 要素 を使用できる
    • カスタムコンポーネントにする必要はない
    • value 属性で双方向の状態バインディングが可能

標準の日付ピッカーのスタイリング

  • input 要素は一部だけスタイル指定でき、残りはできない
    • これはユーザーに 馴染みのあるシステム UI を維持するという利点でもある
    • デザインは OS・入力方式・ブラウザによって異なる
    • 追加でデザインを統一する必要はない

JavaScript日付ピッカーを求める関係者への対応

  • 目標は フォーム送信の成功 であり、複雑な UI はエラーを増やす
    • すべての日付ピッカーにはアクセシビリティ上の問題がある
    • 標準入力の組み合わせのほうがユーザーフレンドリー
    • 検証されていない JavaScript UI は 欧州アクセシビリティ法(EAA) などの規制に抵触する可能性がある
    • シンプルさが成功の鍵

アクセシビリティテストと保証

  • WCAG などのアクセシビリティガイドライン の理解が不可欠
    • Web 標準を活用してカスタム UI のエラーを防ぐ
  • ブラウザの開発者ツールにあるアクセシビリティ機能でエラーを検出できる
    • 完璧なツールはなく、実際のユーザーテスト が唯一の検証方法
  • アクセシビリティオーバーレイの使用は強く非推奨 で、かえって問題を悪化させる可能性がある

アクセシビリティ関連の参考資料

  • Collecting dates in an accessible way — Graham Armfield
  • What makes an accessible date picker? — Russ Weakley
  • Maybe You Don’t Need a Date Picker — Adrian Roselli
  • Date Picker Dialog Example — ARIA Authoring Practices Guide
  • Designing The Perfect Date And Time Picker — Vitaly Friedman

JavaScript日付ピッカーのおすすめを求められたときの答え

  • 万能な解決策はない。どの日付ピッカーにも限界がある
  • このガイドは要件を自分で評価できるようにすることが目的
  • 可能な限り シンプルな方法で目標を達成する ことを推奨
  • 日付ピッカーが必須とは限らない

結論

  • 実際のユーザーテストとフィードバック収集 が不可欠
  • このガイドは継続中であり、フィードバックを歓迎する

1件のコメント

 
GN⁺ 2025-11-13
Hacker Newsのコメント
  • 数年前、地域の病院の患者向けモバイルアプリを作ったことがある。ユーザーには高齢者が多かったが、OS標準の日付選択UIがあまりに使いづらいという不満が殺到した。
    「生年を設定できない」「自分の誕生日まで戻るのに前月の矢印を720回押さなければならなかった」といった声が実際にあった。
    当時のiOSとAndroidでは、どちらも年が単なる見出しのように見えて、クリック可能な要素だと認識されていなかった。
    美的感覚を優先したFlat DesignがUXを壊していると感じた。Don NormanのようなUX専門家ではなく、デザイナー主導でOSのUIが決まる現実が問題だと思う。
    結局、テキストボックス-ドロップダウン-テキストボックス(日-月-年)形式に変えたところ、不満は消えた。
    • 英国政府の Gov.ukデザインチームの調査 でも同じ結論に達している。
      3つのテキストボックス(日、月、年)が最もよい体験を提供するという。
      実装のための パターンガイド もある
    • 自分も最初にあの入力欄を使ったとき、100回以上タップしてから「これはおかしい」と思って検索した記憶がある。本当にUXの悪夢だった
    • 「年がクリックできるって??」と反射的に言いたくなるほど直感的ではなかった
    • 自分もあのカレンダーで年を移動する方法がわからず、かなり長いこと迷ったことがある
    • そもそも、なぜ生年月日の入力にわざわざカレンダーピッカーを使ったのか気になる
  • 旅行予約のように日程が決まっている場合は、「今日」「明日」のような相対的な日付表現が便利なこともある。
    しかし真夜中近くにフライトを予約するとき、「今日」が自分のタイムゾーン基準なのか、サーバー基準なのか、GMTなのかで混乱する。
    • 「今日」「明日」のような相対日付は、アイデアとしては良さそうに見えるが、実装は地獄だ。
      タイムゾーン、サマータイム、月末(1月31日 → 翌月?)、深夜0時直後など、例外が多すぎる。
      こういう機能を入れる前には本当に慎重になるべきだ
    • モントリオールの公共交通機関は以前、28時間制の時計を使っていた。深夜0時以降のバスが27:30のように表示されていて、とても混乱した
    • コンピュータが「今日」を深夜0時基準で定義するのが嫌いだ。
      深夜12時を過ぎて働いていると、「明日」という表現が現実感覚とずれてしまう。
      実際には「今朝以降」を意味しているのに、システムは翌日として認識する
    • とはいえ、「今日」でも「11月12日」でも、タイムゾーンが違えば同じ問題が起きる
  • 20年以上datepickerを扱ってきた経験からすると、単に input type="text" にフォーマットのヒントを付けるのが最善だ。
    ブラウザ、アクセシビリティ、ロケールの問題で苦しまずに済む。
    カスタムコンポーネントはまさに地獄の門だ。格好をつけようとして、10個のウサギ穴にはまり込むだけだ。
    • 誕生日のように既知の日付ならそれでよいが、航空券検索のように「4月上旬の金曜日あたり」を探すならカレンダーが必要だ。
      日付を視覚的に探索する必要があるから
    • どんなフォーマットヒントを入れても、「3-9-1980」が3月9日なのか9月3日なのか、ユーザーにとって信頼できない
    • これは悪い助言だ。ISO 8601は過去の日付には問題ないが、将来の予約国境をまたぐ予定には向いていない。
      日付の問題は本当に複雑なので、ユースケースごとのアプローチが必要だ
    • それでも、モバイルで年を選べないカレンダーよりはずっとましだと思う
  • 国際化を語りながら西洋式の日付形式しかサポートしないのはおかしい。
    ネパールの病院システムを作るなら、ネパール暦とグレゴリオ暦の両方をサポートしなければならない。ネパール暦は非常に複雑だ。
    エチオピアは13か月のカレンダーを使っていて、最後の月は5〜6日しかない。
    まともな国際化対応 date pickerの参考資料があれば知りたい
  • 日付入力の文脈によって、どのピッカーを使うべきかが決まる。
    たとえば夕食の予約では週末の空き状況を見るためにカレンダーが便利だが、誕生日入力なら数字で素早く入力するほうが効率的だ
  • クレジットカード情報を入力するときのように、数字入力の流れが重要な場合、
    「月名を選ぶ → ドロップダウン → 年を選ぶ」のような手順はリズムを壊す
    数字だけを入力する方式のほうがずっと自然だ。モバイルではキーボードが何度も開閉してさらに不便になる
  • キーボードで直接入力できるdate pickerを見ると新鮮に感じる。
    標準UIではなくカスタムピッカーを強制するのはおかしい。
    特にAndroidでiOS風のホイール回転式時間選択UIをWebで真似したものは最悪だ
  • デンマーク人としては、「Pikaday」という名前が笑える。「pik」はデンマーク語で男性器の俗語だからだ
    • 「じゃあポケモンはデンマークでも人気なんですか?」という冗談が出るほどだった
  • Date、Time、DateTimeピッカーだけでは足りない。
    月単位、週単位、カスタム期間選択ピッカーも必要だ。ネイティブのフォーム要素は制約が大きすぎる。
    • <input type="week"><input type="month"> について、Firefoxの対応以外に不足している点があるのか気になる
    • ギリシャ神話の神クロノスの力を借りたAI時間ピッカーがあればいいのにと思う
  • ちなみに、この議論の文脈は Pikadayに関する記事 にある。
    • 昔、Pikadayというdatepickerライブラリを使ったことがあった気がする