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

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を使ってコンボボックスを作ろうとしたけど、うまくいかなかったな。

オートコンプリートの提案にdatalistを使ったら、すごくうまくいったよ。

HTMLリンターって、そんなことを区別するのに役立つの?この種のセマンティックタグの選択を強制できるリンターがあるのか、ちょっと気になるな。

私が知っている最も近いものは、https://github.com/kristoff-it/superhtml#diagnostics だね。SuperHTMLは、文法だけじゃなくて、要素のネストや属性値も検証してくれる。他の言語サーバーは、検証コードでHTMLの完全な仕様を実装しているものはないよ。

なのに、ネイティブのセレクトと検索を組み合わせたものがないんだよね。これはすごく一般的なリストなのに。datalistは基本的に使えないよ、選択肢が全然わからないから。

これはすごく良かったし、内容も充実してた。でも残念ながら、新しいクラスの開発者たちはHTMLを学ばずに、いきなりReactに飛びついちゃったんだ。今はLLMのおかげで、HTMLを学ぶこともないだろうし、シンプルなHTMLで済むところをReactコンポーネントに手を伸ばしちゃうんだよね。

それは全然大丈夫だと思う。最初にXMLを使わなきゃいけなくなったとき、XMLの仕様を学んで手動で出力してたんだ。シリアライズライブラリなんてまだ存在しなかったしね。それから、XMLをインターチェンジフォーマットとして使うジュニアたちが育ってきたけど、彼らはそれを完全に学ぶことなく成長してきた。でも、それで問題はなかったし、何も悪いことは起こらなかったよ。AJAXも、最初は新しいホットな技術だったけど、今ではその意味すら知らない人が多くて、ほとんどの人がその用語すら認識してない。AJAXは死んだわけじゃなくて、あまりにも一般的になったから、もうその言葉が必要なくなったんだ。

正直、HTMLは面倒くさい。例えば、コントロールの一部をスタイルするために擬似クラスを使うんだけど、ブラウザによってセレクタが違ったりすることもある!それで、ちゃんと動くかどうかをブラウザ間でテストしなきゃいけないし。Reactは単に簡単なだけじゃなくて、信頼性も高い。Reactといくつかのdivで何か作れば、どのブラウザでも同じように動くってわかってるから。

今日は学んだことだけど、なんでもっとフレームワークがこれを活用しないのか不思議だな。

大脳は多くのdivでトリックを学ばない。

はぁ、Safariを応援してたのに、デスクトップもモバイルもやっと使えるレベルになったと思ったら、iOSのSafariでリストが動かないなんて。