Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[4.1.2]「HTMLの要素や属性を正しい役割で使用する」のタイトル・内容の見直し #417

Merged
merged 11 commits into from
Oct 12, 2023
81 changes: 51 additions & 30 deletions src/4/1/2.md
Original file line number Diff line number Diff line change
@@ -1,69 +1,90 @@
---
layout: single
title: HTMLの要素や属性を正しい役割で使用する
title: カスタムコントロールにAccessible Nameとroleが適切に設定されている
number: 4.1.2
level: A
tags: sc
permalink: "{{ number | scNumberToPath }}/"
---

# 4.1.2 HTMLの要素や属性を正しい役割で使用する
# 4.1.2 カスタムコントロールにAccessible Nameとroleが適切に設定されている
itsminadesu marked this conversation as resolved.
Show resolved Hide resolved

{% include "partials/level.njk" %}

## 概要

リンクやボタンなどユーザーが操作可能な項目を作成するときに、本来リンクやボタンに使わない要素や属性を使用して記述すると、ブラウザやスクリーンリーダーなどで正しく操作できなくなる可能性がある。そのため、ユーザーが操作可能な項目は、正しい要素や属性を用いて記述する。
カスタムコントロールを実装する場合、支援技術などのユーザーエージェントがそのコンポーネントを正確に解釈して実行できるよう、`Accessible Name` と `role` を設定する。スクリーンリーダーなどの支援技術で動作確認をし、支援技術でも遜色なく機能を操作でき、状態の変化を認識できることを確認する。

<details>
<summary>カスタムコントロールとは</summary>

カスタムコントロールとは、その言語が提供していない「独自のユーザーインタフェースコンポーネント」のことを指す。例えばタブ、 `<input type="checkbox">` を使わないチェックボックスなど。カスタムコントロールは、開発者が機能をスクリプトで実装する必要がある。

Webでは[WAI-ARIA](https://www.w3.org/TR/wai-aria/)を用いて実装することが多い。
</details>

<details>
<summary>Accessible Nameとは</summary>

Accessible Nameとは、ユーザーインターフェイスの名前である。機械的に識別可能な名前であり、表示されるラベルテキストと一致することが多いが、代替テキストのように支援技術向けにのみ実装されていることもある。WCAGではnameと記載されているが、HTMLのname属性とは関係がなく、誤解を生みやすいため、[Accessible Name and Description Computation 1.1](https://www.w3.org/TR/accname-1.1/)で定義されている用語の名称で表記している。

参考:

Check warning on line 31 in src/4/1/2.md

View workflow job for this annotation

GitHub Actions / lint

文末が"。"で終わっていません。
Copy link
Contributor Author

@tokimari tokimari Oct 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lintで「warning  文末が"。"で終わっていません。  @openameba/ameba/ja-no-mixed-period」というwarningが出ている様子

31:3 warning 文末が"。"で終わっていません。 @openameba/ameba/ja-no-mixed-period
40:3 warning 文末が"。"で終わっていません。 @openameba/ameba/ja-no-mixed-period

textlintのtextlint-rule-ja-no-mixed-periodルールでwarningでちゃう・・
設定ファイル.textlintrcを以下のように編集することで、「参考:」で始まる行を許容できるっぽいんですが、ウーン・・

{
  "rules": {
    "ja-no-mixed-period": {
      "periodMark": "",
      "exceptions": ["参考:"]
    }
  }
}

表記を変えれば良いけどいい案がパッと浮かばないなう

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

例えばですけど。

参考:

「詳細は以下の参考資料で確認できる。」みたいな文章的な言い回しにするか、
「### 参考資料」みたいな感じで見出しにしちゃうとかだとどうですかね?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

h3見出しにしました:pray:
実装後のプレビューのスクリーンショット。「参考資料」が見出しのように表示されている

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

スクリーンショット 2023-10-10 17 34 09

そういえばですが英字?だと左側の文字かけてそうな気がw

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あーそれ気になってたんですよねw
summary要素に適用されたスタイルのスクリーンショット。`text-indent: -1em;`が付与されている

summary要素にtext-indentプロパティが設定されてて、これかなーと思うので別で修正しますね:pray:

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#420 にて:pray:

- [名前 (name) | 達成基準 4.1.2: 名前 (name)・役割 (role)・値 (value) を理解する](https://waic.jp/translations/WCAG21/Understanding/name-role-value.html#dfn-name)
- [Accessible Name | Accessible Name and Description Computation 1.1](https://www.w3.org/TR/accname-1.1/#dfn-accessible-name)
</details>

<details>
<summary>roleとは</summary>
roleとは、ユーザーインターフェイスの機能を表すものである。たとえば画像やハイパーリンク、チェックボックス、ラジオボタンなど。

参考:

Check warning on line 40 in src/4/1/2.md

View workflow job for this annotation

GitHub Actions / lint

文末が"。"で終わっていません。
- [役割 (role) | 達成基準 4.1.2: 名前 (name)・役割 (role)・値 (value) を理解する](https://waic.jp/translations/WCAG21/Understanding/name-role-value.html#dfn-role)
</details>

## 具体例

### 見出しに見出しタグh1~h6要素を使っている
### SegmentedControl
itsminadesu marked this conversation as resolved.
Show resolved Hide resolved

Amebaでは[SegmentedControl](https://ameba-spindle.web.app/?path=/docs/segmentedcontrol)というカスタムコントロールのコンポーネントを利用している。これはページ内で機能やモードを切り替える際に用いる。基本的にはブラウザ標準のラジオボタンと同様の機能をもっており、単一の項目のみを選択できる。ブラウザ標準のラジオボタンとの違いはキー操作体系にある。上下左右キーでの**移動だけで**選択されるラジオボタンと違い、上下左右キーでの**移動に加え**Enter, Spaceキーを押下しないと選択されない。そのため、「キーボードフォーカス中ではあってもActiveではない」という、ラジオボタンとは異なる状態が存在する。

デモページ:[SegmentedControl ⋅ Storybook](https://ameba-spindle.web.app/?path=/docs/segmentedcontrol)

<figure>
<div class="FigureMulti">
<img src="/img/4/1/2/4.1.2_ng_1.svg" alt="バナー作成の手順が見出しレベル1でマークアップされ、その他の見出しはpタグでクラスhd2もしくはhd3とマークアップされている。">
<img src="/img/4/1/2/4.1.2_ng_2.svg" alt="見出し一覧のラベルと見出しレベル1のバナー作成の手順が表示されている。">
</div>
<img src="/img/4/1/2/segmented_control.png" alt="">
itsminadesu marked this conversation as resolved.
Show resolved Hide resolved
<figcaption>
{% label "bad" %}
見出しタグを適切に使用していない場合。CSSでスタイリングしているため、仕上がりは見出しのように見えていたが、見出しタグを使っていないために、見出し一覧機能を使うと見出しとして表示されない。
{% endlabel %}
Amebaで定義されているSegmentedControlコンポーネントのイメージ。タブのように横並びの3つのボタングループがあり、そのうちの1つが選択されていることがわかる表示になっている。
</figcaption>
</figure>

<figure>
<img src="/img/4/1/2/segmented_control_focused.png" alt="">
<figcaption>
<div class="FigureMulti">
<img src="/img/4/1/2/4.1.2_ok_1.svg" alt="バナー作成の手順が見出しレベル1。手順①バナー構成を確認、手順②入稿規定を確認、手順③素材を集めるは見出しレベル2でマークアップされている。">
<img src="/img/4/1/2/4.1.2_ok_2.svg" alt="見出し一覧のラベルとバナー作成の手順、手順①バナー構成を確認、手順②入稿規定を確認、手順③素材を集めるが見出しの階層となって表示されている。">
</div>
{% label "good" %}
見出しタグを正しく使用している場合。支援技術で、見出しを一覧化して表示する機能を使っても、全ての見出しを表示できるため、必要な情報を選んで読みやすい。
{% endlabel %}
SegmentedControlコンポーネントのボタンの一つにキーボードでフォーカスしている様子。3つあるボタンの内、選択されていのは中央で、フォーカスが当たっているのは一番左のボタンである。SegmentedControlでは、フォーカスが当たっているが選択されていない(Activeではない)状態がある。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
SegmentedControlコンポーネントのボタンの一つにキーボードでフォーカスしている様子。3つあるボタンの内、選択されていのは中央で、フォーカスが当たっているのは一番左のボタンである。SegmentedControlでは、フォーカスが当たっているが選択されていない(Activeではない)状態がある。
SegmentedControlコンポーネントのボタンの一つにキーボードでフォーカスしている様子。3つあるボタンの内、選択されているのは中央で、フォーカスが当たっているのは一番左のボタンである。SegmentedControlでは、フォーカスが当たっているが選択されていない(Activeではない)状態がある。

細かいところで🙏

Copy link
Contributor Author

@tokimari tokimari Oct 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:sugutypo:

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

863594f にて 😄

</figcaption>
</figure>

## テスト・チェック方法

1. コードレビュー
### Web

1. AccessibilityTree(ユーザー補助ツリー)のRole(役割)、Name欄に値が適切に反映されていることを確認する
<figure>
<img src="/img/4/1/2/web_test1.png" alt="">
<figcaption>
例:SegmentedControlコンポーネントをChromeのインスペクター上のアクセシビリティタブを開き確認している様子のスクリーンショット。「ユーザー補助ツリー」「ARIA属性」「計算済みプロパティ」の項目があり、「計算済みプロパティ」には「Name: "中"」「役割: radio」「無効なユーザー入力: false」「フォーカス可能: true」「オン: true」と表示されている。Accessible Nameは「中」、Roleは「radio」、選択状態がtrueの要素を検証中であることがわかる。
</figcaption>
</figure>
1. Lighthouseや[axe DevTools](https://chrome.google.com/webstore/detail/axe-devtools-web-accessib/lhdoppojpmngadmnindnejefpokejbdd)などのアクセシビリティ検証ツールで、不適切なAccessible Nameやrole、WAI-ARIA属性の付け方をしていないかを確認する
1. スクリーンリーダーなどの支援技術を用いて操作し、クリックやタップでの操作時と遜色なく操作でき、Active状態・フォーカス状態が認識できることを確認する

## 実装方法

### 悪い実装例

ボタンの項目なのに、spanタグを使って実装している。

```html
<span class="button">登録する</span>
```
TODO

### 良い実装例

buttonタグを使って実装している。

```html
<button type="button">登録する</button>
```
TODO

## 参考文献

Expand Down
Binary file added src/img/4/1/2/.DS_Store
Binary file not shown.
205 changes: 0 additions & 205 deletions src/img/4/1/2/4.1.2_ng_1.svg

This file was deleted.

14 changes: 0 additions & 14 deletions src/img/4/1/2/4.1.2_ng_2.svg

This file was deleted.

75 changes: 0 additions & 75 deletions src/img/4/1/2/4.1.2_ok_1.svg

This file was deleted.

20 changes: 0 additions & 20 deletions src/img/4/1/2/4.1.2_ok_2.svg

This file was deleted.

Binary file added src/img/4/1/2/segmented_control.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/img/4/1/2/segmented_control_focused.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/img/4/1/2/web_test1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.