その`
- `、本当にただの「横並びリスト」だと思っていませんか?:dt/ddの複雑な関係性を紐解く
- 1対多(用語1つに定義が複数): 1つの用語に対し、複数の説明やバリエーションがある場合。
- 多対1(用語複数に定義が1つ): 複数の用語が同一の意味を持つ、または同じ説明を共有する場合。
- 多対多(用語複数に定義が複数): 複数の用語の組み合わせに対して、複数の説明が対応する場合。
- 配送方法
- 宅急便(1〜2日で到着)
- メール便(3〜5日で到着)
- 定休日
- 休業日
- 毎週火曜日・水曜日
- 商品名
- 超高性能メカニカルキーボード
- カラーバリエーション
- スペースグレイ
- ミッドナイトブルー
現場でコードレビューをしていると、`dl`, `dt`, `dd` の使い方が「ただのCSSの装飾用」として雑に扱われている場面によく遭遇します。
「左側に項目、右側に値を置きたいからとりあえず`dl`で囲んでおこう」
もしあなたがそう考えているなら、少しだけ立ち止まって考えてみてください。HTMLは本来、文書の「意味」を記述するためのもの。特に`dl`(Description List)は、用語と説明という「関係性」を定義するための非常に強力なセマンティックタグです。
今回は、実務で遭遇しがちな「1対多」や「多対1」といった複雑な関係性を、HTMLの仕様に則ってどう正しく構造化すべきか。その勘所を解説します。
—
1. 原点回帰:dtとddの「関係性」を再定義する
HTML仕様書における`dl`の定義は、「用語(term)と、その記述(description)のグループ」です。多くの人は「1つの`dt`には1つの`dd`」というイメージを持ちがちですが、HTML5以降、この関係性はより柔軟かつ厳密に規定されています。
これらを正しく構造化しないと、スクリーンリーダーなどの支援技術が正しく文脈を解釈できず、アクセシビリティを損なう原因になります。
—
2. 実践:複雑な関係を表現するコードパターン
では、現場ですぐに使える具体的なパターンを見ていきましょう。
パターンA:1つの用語に複数の定義(1対多)
例えば、「配送方法」という用語に対して、「宅急便」「メール便」といった複数の選択肢があるようなケースです。
パターンB:複数の用語に同一の定義(多対1)
「定休日」と「休業日」が同じ意味を持つ場合などです。
—
3. シニアエンジニアからのアドバイス:divでラップすべきか?
ここで中級者の皆さんが一度は悩むのが、「`dt`と`dd`を`div`で囲んでもいいのか?」という問題です。
結論から言うと、HTML5.2以降、`dl`の子要素として`div`を配置することが公式に許可されました。 これは、CSS GridやFlexboxによるレイアウトを制御したい場合に非常に便利です。
「意味的な構造は保ちつつ、レイアウトの都合でグループ化したい」という現場の切実なニーズに、仕様が追いついた形ですね。
推奨される実装例(divを用いたグループ化)
—
4. なぜ「正しく」書く必要があるのか
単に「動けばいい」という視点から一歩進みましょう。ブラウザは、`dt`と`dd`のペアを「意味的な塊」として認識します。
もしあなたが`div`だけでリストを作った場合、ブラウザにとってはただの「並んだテキスト」です。しかし、`dl`を使えば、検索エンジンやアクセシビリティツールは「これは用語と説明のペアである」と理解し、コンテキストに沿った情報提供が可能になります。
また、将来的にデザインが変わったとしても、HTMLが正しい意味論(セマンティクス)で書かれていれば、CSSを書き換えるだけでメンテナンスは完結します。これが「強いコード」の条件です。
まとめ:次回の実装で意識すること
1. 「関係性」を考える: `dt`と`dd`は、ただのレイアウトツールではない。「これは用語と説明の関係か?」を常に自問する。
2. グループ化は`div`を怖がらない: レイアウトのために構造を歪めるくらいなら、`div`で囲んでセマンティクスとレイアウトを両立させる。
3. アクセシビリティを忘れない: 複雑な構造にするほど、ツール側の読み上げ順序が重要になる。マークアップした後は、一度「キーボード操作」や「スクリーンリーダー」で意図通りに読まれるか確認する癖をつける。
HTMLを書くことは、ブラウザに「このデータはこういう意味ですよ」と語りかけるコミュニケーションです。その会話を丁寧に行うことが、結果として堅牢で保守性の高いプロダクトを生み出す近道になります。
ぜひ、次回のコンポーネント実装から意識してみてください。小さな積み重ねが、あなたのフロントエンドエンジニアとしての「格」を確実に押し上げてくれるはずです。

コメント