
2026/05/23 22:03
『オン・ザ・DL』(2021 年)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
HTML の
<dl> 要素は、名詞と値の組からなる構造化されたリストを作成するためのセマンティックなツールであり、語彙辞典やゲームキャラクターのステータスブロックのようなデータ量の多いインターフェースに極めて効果的です。この要素は 3 つのコアコンポーネントに依存しています:リストを定義する <dl>、用語を表す <dt>、そしてそれらの用語を詳細説明する 1 つまたは複数の <dd> 要素(各用語に対して複数の詳細を許容)。開発者はこの要素を <div> など他の適切なセクション要素で包んでスタイル化することが一般的ですが、この構造のもっとも主な利点はアクセシビリティです。これにより、スクリーンリーダーが複雑なデータを論理的にナビゲートでき、項目数を数え、関連性の低いブロックをスキップできるようになります。- は以前の HTML バージョンでは「定義リスト」として登場しましたが、HTML5 の仕様では、堅固な構造的前提を持たずに多様な UI パターンをサポートするようにこれらの要素が改良されました。能力値や攻撃詳細のような複雑なデータ構造を表現する versatility がある一方で、ブラウザとスクリーンリーダーのサポート状況が異なるため、採用には注意が必要です。正確な実装規則については、公式仕様または MDN を参照することをお勧めします。結局のところ、セマンティックな
<dl> タグを使用することで生テキストをアクセシブルな体験へと変換し、単純なデータと異なるデバイス間で意味のある相互作用の間に架け橋を作るのです。本文
HTML の「説明文書リスト()」を活用する理由と使い方
HTML の
<dl> 要素は、過小評価されています。名と値の対(Key-Value Pairs)を表すために使用され、非常に汎用性の高い UI パターンです。宿泊施設の設備一覧や家賃明細、技術用語集など、実世界でよく目にするレイアウトはこのパターンに該当します。
説明文書リストの構造
<dl>(説明文書リスト)、<dt>(定義用語)、<dd>(定義詳細)という 3 つの要素が役割を持ちます。
ベースとなる構造
まずは
<dl> 要素でラップします。これがリスト全体を意味付けるコンテナとなります。
<dl></dl>
「名」と「値」の追加
- 名を表すには
(Description Term)を使用します。<dt> - 値を表すには
(Description Detail)を使用します。<dd>
基本的な例:
<dl> <dt>Title</dt> <dd>Designing with Web Standards</dd> </dl>
複数の名と値の追加
リストに項目を追加するには、単に
<dt> と <dd> を挿入するだけです。
<dl> <dt>Title</dt> <dd>Designing with Web Standards</dd> <dt>Publisher</dt> <dd>New Riders Pub; 3rd edition (October 19, 2009)</dd> </dl>
一つの「名」に複数の「値」を設定する場合
ある項目(例:著者)に複数の人が関連する場合は、一つの
の下に複数の <dt>
を配置することで対応可能です。<dd>
<dl> <dt>Title</dt> <dd>Designing with Web Standards</dd> <dt>Author</dt> <dd>Jeffrey Zeldman</dd> <dd>Ethan Marcotte</dd> <!-- 複数の著者を表現 --> <dt>Publisher</dt> <dd>New Riders Pub; 3rd edition (October 19, 2009)</dd> </dl>
グループ化(ラッピング)する場合
スタイル調整の目的で、
<dt> と関連する <dd> の群をグループ化したい場合は、仕様上 <div> でラップすることが許可されています。
- 注意:
および<dt>
のグループをラップする要素として使用できるのは、この<dd>
が唯一の選択肢 です。<div>
<dl> <div> <dt>Title</dt> <dd>Designing with Web Standards</dd> </div> <div> <dt>Author</dt> <dd>Jeffrey Zeldman</dd> <dd>Ethan Marcotte</dd> </div> <div> <dt>Publisher</dt> <dd>New Riders Pub; 3rd edition (October 19, 2009)</dd> </div> </dl>
なぜ semantic なアプローチが必要なのか?
以前はネストした
<div> を使用して実装するケースが多く見られました。しかし、単なる構造(クラス名での分類)ではなく、**意味(Semantics)**を持たせるべきでしょうか?
判断基準として自問すべきことは、**「このパターンを認識できる場合に得られる利点は何か」**です。特にウェブアクセシビリティの観点から、スクリーンリーダーユーザーがどのようなメリットを得られるか考える必要があります。
スクリーンリーダーによる具体的な利点
ブラウザがこのパターン(
<dl>)を認識できれば、以下の利点が生まれます。
- 構造の伝達: リスト内に名と値の対がいくつのグループあるかをユーザーに伝えることができます。
- 位置の確認: ユーザーが進んでいる場所(現在どの項目にいるか)を示すことができます。
- スキップ機能: ユーザーがそのリストに関心がない場合、一つ一つのブロックとして扱い、効率的に読み飛ばす(スキップする)ことを可能にします。
これにより、ネストした
<div> で単なるテキストノードとして扱うよりも、リストとしての利用性が大幅に向上します。ブラウザがこの意味構造を認識できるのであれば、语义付与のための強力な候補となるはずです。
補足: 現在の状況では
要素へのサポートがすべての環境で完全ではありません。そのため、スクリーンリーダーのフォールバック行動について考慮し、必要に応じて<dl>などの代替案を検討するケースもあります。<ul>
実例:ダンジョンズ&ドラゴンズの「ステイブロック」
最も代表的な活用事例としては、「ダンジョンズ&ドラゴンズのキャラクターシミュレーション(ステイブロック)」が挙げられます。能力値や属性、武器の詳細など、まさに**「すべて名と値の対」**で構成されています。
以下に、このシートをマークアップした実際のコード例を示します。少なくとも 5 つの異なる説明文書リストパターンが存在します。
<div> <h1>Kobold</h1> <small>Small humanoid (kobold), lawful evil</small> <!-- ステータス情報の一覧 --> <dl> <div> <dt>Armor Class</dt> <dd>12</dd> </div> <div> <dt>Hit Points</dt> <dd>5 (2d6 - 2)</dd> </div> <div> <dt>Speed</dt> <dd>30 ft.</dd> </div> </dl> <!-- 能力値(STR, DEX など)のグループ --> <dl aria-label="Ability Scores"> <div> <dt>STR</dt> <dd>7 (-2)</dd> </div> <div> <dt>DEX</dt> <dd>15 (+2)</dd> </div> <div> <dt>CON</dt> <dd>9 (-1)</dd> </div> <div> <dt>INT</dt> <dd>8 (-1)</dd> </div> <div> <dt>WIS</dt> <dd>7 (-2)</dd> </div> <div> <dt>CHA</dt> <dd>8 (–1)</dd> </div> </dl> <!-- 専門性のグループ --> <dl aria-label="Proficiencies"> <div> <dt>Senses</dt> <dd>Darkvision 60 ft.</dd> <dd>Passive Perception 8</dd> </div> <div> <dt>Languages</dt> <dd>Common</dd> <dd>Draconic</dd> </div> <div> <dt>Challenge</dt> <dd>1/8 (25 XP)</dd> </div> </dl> <!-- 特性のグループ --> <dl aria-label="Traits"> <div> <dt>Sunlight Sensitivity</dt> <dd> While in sunlight, the kobold has disadvantage on attack rolls, as well as on Wisdom (Perception) checks that rely on sight. </dd> </div> <div> <dt>Pack Tactics</dt> <dd> The kobold has advantage on an attack roll against a creature if at least one of the kobold's allies is within 5 ft. of the creature and the ally isn't incapacitated. </dd> </div> </dl> <h2 id="actions">Actions</h2> <!-- アクションのグループ --> <dl aria-labelledby="actions"> <div> <dt>Dagger</dt> <dd> <i>Melee Weapon Attack:</i> +4 to hit, reach 5 ft., one target. <i>Hit:</i> (1d4 + 2) piercing damage. </dd> </div> <div> <dt>Sling</dt> <dd> <i>Ranged Weapon Attack:</i> +4 to hit, reach 30/120 ft., one target. <i>Hit</i>: (1d4 + 2) bludgeoning damage. </dd> </div> </dl> </div>
この例が示すのは、説明文書リストパターンの驚くべき汎用性です。能力値のリストや攻撃項目の外見は異なっていますが、どちらも同じ
<dl> パターンで表現可能です。
まとめ
名と値の対(あるいは場合によってはグループ)の一覧は、ウェブにおける非常に一般的なパターンです。HTML を使用すると、以下の 3 つの要素を組み合わせてマークアップできます:
(説明文書リスト):名と値の対全体のリストをラップするコンテナ。<dl>
(説明用語):名(キー)を表す要素。<dt>
(説明詳細):値(バリュー)を表す要素。<dd>
このようなパターンに语义を付与することは、開発者ですら予期しない方法で、ユーザーのデバイスにおいて有用で利用可能な体験を提供する上で不可欠です。
補足情報
- 用語の変遷: HTML5 以前は「定義リスト」と呼ばれていましたが、現在は
(説明文書リスト)などの名前に変更されています。これは当初は用語と定義のみを意図した要素だったためですが、現在はより広範な名値ペアに対応しています。<dl>- 詳細参照: より深い仕様や禁止事項については、MDN の
ドキュメントをご確認ください。<dl>