世界を動かす技術を、日本語で。

HTMLリスト

概要

  • HTMLでの リスト の種類と使い分けについて解説
  • コントロールリスト順序付きリスト説明リスト など多様なリスト形式を紹介
  • <select>+<option><input>+<datalist> の実用例を提示
  • リスト選択時の 注意点アクセシビリティ の観点もカバー
  • 実際のHTMLコード例とともに 応用的な使い方 を解説

あなたの知らないHTMLリストの世界

  • HTMLには 5種類 のリストが存在
    • 順序付きリスト(<ol>
    • 順序なしリスト(<ul>
    • 説明リスト(<dl>
    • メニューリスト(<menu>
    • コントロールリスト(<select>+<option><input>+<datalist>
  • MDNやW3Schoolsの入門ではなく、 実践的・応用的な視点 から解説
  • リストの スタイリング 方法ではなく、 適切な使い分け に焦点

どのリストを使うべきかの判断基準

  • ユーザー入力用のコントロール なら
    • <select>+<option> (固定リスト)
    • <input>+<datalist> (候補リスト)
  • 順番が意味を持つ場合<ol> (順序付きリスト)
  • キーと値のペア なら <dl> (説明リスト)
  • UIの操作用コントロール なら <menu> (メニューリスト)
  • 上記以外<ul> (順序なしリスト)

コントロールリストの使い方

  • <select>+<option>

    • ユーザーが リストから1つまたは複数選択 する場合に利用

    • multiple属性 で複数選択も可能

    • optgroup で選択肢をグループ分け

    • disabled属性 で選択不可グループの設定も可能

    • <hr> で視覚的な区切りも追加可能(CSS不要)

    • 例:言語選択リスト

      • <select name="languages"> <option value="">Select a Language</option> <option value="en">English</option> <option value="fr">French</option> ... </select>
  • <input>+<datalist>

    • ユーザーに 候補を提示しつつ自由入力 を許可
    • datalistにidを付与 し、inputのlist属性に指定
    • optionのvalue属性 利用時は注意
      • valueが入力値になり、ラベルと異なる表示になるため混乱の原因
    • 数値や週などの特殊な型 にも対応
    • <input type="range"> と組み合わせて ラベル付き目盛 も実現可能
    • ブラウザ間の表示差 に注意(Chrome系はCSSで柔軟、Firefoxは追加対応要)

順序付きリスト(<ol>)の活用

  • 順番が意味を持つ情報 の集合に利用

    • アルゴリズム
    • イベントの時系列
    • 手順やレシピ
    • アルファベットなど連続性のあるリスト
  • 視覚的な番号付け の有無ではなく、 順序の重要性 で判断

  • 順序が変わると 意味が変わる情報 は必ず<ol>を使用

    • 例:バナナブレッドのレシピ
      • <ol> <li>オーブンを予熱し、型に油を塗る</li> <li>材料を混ぜる</li> <li>型に生地を流し込む</li> <li>焼き上げる</li> </ol>

まとめと実践ポイント

  • HTMLリストの使い分け は構造・意味を重視
  • アクセシビリティユーザー体験 を考慮した選択
  • ネイティブ要素 の利用でブラウザ互換性や保守性向上
  • ラベル・値の混同ブラウザ差異 に注意
  • リストの本質 は「情報のまとまり」と「意味の伝達」

このガイドを参考に、 最適なリスト形式 を選択し、より 意味のあるHTML構造 を実現してください。

Hackerたちの意見

フロントエンドリードを何年もやってたのに、知らなかった役立つ情報がいっぱいあった!これ、仕事で絶対使うようにするよ。

ちょっと楽しい読み物だった。例をテストしてみたら、datalistがモバイルサファリではうまく動かないみたいだね(かなり大きな市場だから、互換性の問題があるなら使う価値はほぼないって言えるかも)。

初めての仕事をしていた頃、datalistはFirefoxでは動かなかったんだ。それが原因で、Firefoxはサポートされているブラウザのリストから外れちゃった。Chrome以外のブラウザをサポートするのは、ずっと問題だったよ。

うまく動くけど、iOSのGBoardではダメなんだよね。

AndroidのFirefoxでも動かないね。

入力とdatalistは、HTMLで言うところのWindowsのコンボボックスみたいなもので、昔は最悪のUI要素って言われてたんだよね。(これ、使いやすさに関する記事でミーム状態になってたから、あんまりおすすめじゃないかも。)

これが本当のHTMLマジックって感じだね:一、二、三

一、二、三、修正したよ。

「選択肢がたくさんあるけど、[理由]でユーザーにその一部を選ばせたくない場合はどうする?」オプトグループにdisabled属性を追加しよう。モバイルサファリでは壊れてるみたいで、実際には無効になってないから、無効なアイテムも選べちゃう。

壊れてるわけじゃないけど、最新のサファリで動くはずなのに変だね。https://caniuse.com/mdn-html_elements_optgroup_disabled これはサファリのバグかもしれない。

良い情報だけど、datalistにはあまり期待しない方がいいよ。実際に役立つにはフックが足りなさすぎるから、ちょっとしたプロトタイプ以外には使えない。

一度datalistを使ってコンボボックスを作ろうとしたけど、うまくいかなかったな。

Hacker Newsで議論の続きを見る