画像の説明もバッチリ!アクセシビリティを向上させる属性スコープ


属性スコープの種類

HTML 属性には、主に 2 種類のスコープがあります。

  1. 要素スコープ
    属性の効果は、属性が属する要素だけに限定されます。これが最も一般的なスコープです。
  2. スコープ付き属性
    属性の効果は、特定の範囲の要素に及びます。この範囲は、属性名によって異なります。

スコープ付き属性の例

以下の表は、HTML でよく使用されるスコープ付き属性とその効果を示しています。

属性名説明範囲
rowspanセルが占める行数同じ列のセル
colspanセルが占める列数同じ行のセル
headers見出しセルが関連付けられるデータセル指定された ID を持つ要素
scope見出しセルが適用される範囲row, col, rowgroup, colgroup のいずれか

スコープ付き属性を使用する利点は次のとおりです。

  • アクセシビリティ
    スクリーンリーダーなどの支援技術は、スコープ付き属性を使用して、表やフォームなどの構造をよりよく理解することができます。
  • メンテナンス性
    コードを変更する際に、影響を受ける要素を特定しやすくなります。
  • コードの明確性
    属性の効果が明確になり、コードを読みやすく、理解しやすくなります。

次の例は、rowspan 属性と colspan 属性を使用して、表の見出しセルをスパンする方法を示しています。

<table>
  <tr>
    <th rowspan="2">名前</th>
    <th>年齢</th>
    <th>職業</th>
  </tr>
  <tr>
    <td>田中</td>
    <td>35</td>
    <td>エンジニア</td>
  </tr>
  <tr>
    <td>佐藤</td>
    <td>28</td>
    <td>デザイナー</td>
  </tr>
</table>

この例では、最初の th 要素には rowspan="2" 属性が設定されています。つまり、このセルは 2 行にまたがって表示され、2 番目の行の最初のセルと結合されます。

HTML 属性のスコープは、構造化されたデータをより明確かつ効率的に表現するための強力なツールです。要素スコープとスコープ付き属性の両方を理解することで、よりアクセス可能でメンテナンスしやすい HTML コードを作成することができます。



例 1:表の見出しセルをスパンする

この例では、rowspancolspan 属性を使用して、表の見出しセルをスパンする方法を示します。

<table>
  <tr>
    <th colspan="2">商品</th>
    <th>価格</th>
  </tr>
  <tr>
    <th>名前</th>
    <th>説明</th>
    <th></th>
  </tr>
  <tr>
    <td>Tシャツ</td>
    <td>綿 100%の柔らかい Tシャツ</td>
    <td>$19.99</td>
  </tr>
  <tr>
    <td>ジーンズ</td>
    <td>耐久性のあるデニム素材のジーンズ</td>
    <td>$39.99</td>
  </tr>
</table>

このコードでは、次のことが行われます。

  • 2 番目の th 要素には rowspan="2" 属性が設定されています。つまり、このセルは 2 行にまたがって表示され、2 番目の行と 3 番目の行の最初のセルと結合されます。
  • 最初の th 要素には colspan="2" 属性が設定されています。つまり、このセルは 2 列にまたがって表示され、2 番目の列全体を占有します。

例 2:フォームの入力項目をグループ化

この例では、scope 属性を使用して、フォームの入力項目を論理的にグループ化する方法を示します。

<form>
  <fieldset>
    <legend>連絡先情報</legend>
    <label for="name">氏名:</label>
    <input type="text" id="name" name="name" required>
    <br>
    <label for="email">メールアドレス:</label>
    <input type="email" id="email" name="email" required>
    <br>
  </fieldset>

  <fieldset>
    <legend>配送先住所</legend>
    <label for="address">住所:</label>
    <input type="text" id="address" name="address" required>
    <br>
    <label for="city">市区町村:</label>
    <input type="text" id="city" name="city" required>
    <br>
    <label for="state">都道府県:</label>
    <input type="text" id="state" name="state" required>
    <br>
    <label for="zip">郵便番号:</label>
    <input type="text" id="zip" name="zip" required>
    <br>
  </fieldset>
</form>
  • 各入力項目には、scope 属性が "group" に設定されます。つまり、これらのラベルは、同じ fieldset 内の入力項目にのみ適用されます。
  • <fieldset> 要素には、<legend> 要素を使用してセクションのタイトルが設定されます。
  • 2 つの <fieldset> 要素を使用して、フォームを論理的に 2 つのセクションに分割します。

例 3:アクセシビリティを向上させる

この例では、aria-describedby 属性を使用して、スクリーンリーダーなどの支援技術に情報を提供する方法を示します。

<img src="image.jpg" alt="商品画像" aria-describedby="image-description">
<p id="image-description">この画像は、赤い T シャツを身に着た若い女性を示しています。</p>
  • <p> 要素には、id 属性が "image-description" に設定され、画像の説明を提供します。
  • <img> 要素には、aria-describedby 属性が設定され、image-description ID を参照します。

この例では、スクリーンリーダーは画像の説明を読み上げ、ユーザーが画像の内容をよりよく理解できるようにします。



ID と参照:

  • 欠点:
    • 長い ID 名になりやすい
    • メンテナンスが大変になる可能性がある
    • セマンティックでない
  • 利点:
    • シンプルで分かりやすい
    • 汎用性が高い

例:

<label for="email">メールアドレス:</label>
<input type="email" id="email" name="email">

CSS セレクタ:

  • 欠点:
    • CSS コードが増える
    • 複雑なセレクタは分かりにくくなる可能性がある
  • 利点:
    • 属性に依存しないため、柔軟性が高い
    • セマンティックなクラス名や属性を使用できる
    • メンテナンスしやすい
#email-label {
  display: block;
  margin-bottom: 5px;
}

#email {
  width: 100%;
  padding: 5px;
  border: 1px solid #ccc;
}

ARIA 属性:

  • 欠点:
    • HTML コードが増える
    • すべての支援技術でサポートされているわけではない
  • 利点:
    • アクセシビリティを向上させる
    • スクリーンリーダーなどの支援技術に情報を提供できる
<img src="image.jpg" alt="商品画像" aria-describedby="image-description">
<p id="image-description">この画像は、赤い T シャツを身に着た若い女性を示しています。</p>

JavaScript:

  • 欠点:
    • コードが複雑になる
    • デバッグが難しい
    • アクセシビリティが低下する可能性がある
  • 利点:
    • ダイナミックな処理が可能
    • 複雑な関係性を表現できる
const emailLabel = document.getElementById('email-label');
const emailInput = document.getElementById('email');

emailLabel.addEventListener('click', () => {
  emailInput.focus();
});

最適な方法の選択

最適な方法は、状況によって異なります。以下の要素を考慮する必要があります。

  • メンテナンス性: コードを将来変更しやすいようにする必要があります。
  • アクセシビリティ: すべてのユーザーがコンテンツにアクセスできるようにする必要があります。
  • セマンティック: コードが意味を明確に伝えていることを確認する必要があります。
  • 汎用性: さまざまな状況で使用できる方法を選択する必要があります。
  • シンプルさ: コードがシンプルで分かりやすい方が、メンテナンスしやすくなります。