Webアクセシビリティへの第一歩はHTMLセマンティクスから

## はじめに
2024年4月施行の障害者差別解消法の改正の中で、Webサイトに関する取り組み例の文言が追加され、いっそうWebアクセシビリティへの取り組みや理解が求められてるようになってきたのではないでしょうか。
しかし、アクセシビリティ考慮の範囲は膨大で、レガシー環境のエンハンスなどを行っていると（筆者自身の置かれた環境）、どこから手をつけたら良いものか、急に途方に暮れてしまいます。
そこで、フロントエンド観点のみ、かつアクセシビリティ考慮のスコープを小さくし、まずは、日々のコードレビューでよく耳にする「アクセシビリティのために**セマンティックなマークアップ**をこころがけよう」というところから取り組んでいくことにしました。以下では取り組みのために必要となる基礎知識についてまとめています。

:::note warn
障害者差別解消法の改正について、アクセシビリティの取り組みが義務化されたということではありません。アクセシビリティの取り組みは「環境の整備」に位置付けられる考えで、本記事執筆時点では努力義務です。
参考：[今回の改正における新旧対照表](https://www8.cao.go.jp/shougai/whitepaper/r05hakusho/zenbun/furoku_05.html)
※ウェブサイトの例をとった追加文言については同表の、`«改正：イ　合理的配慮と環境の整備`内の例２項目に記述されています
:::
## セマンティクスとアクセシビリティ
### セマンティクスとは
セマンティクスとは、もともと「意味」「意味論」を表す単語です。MDNより引用すると、HTMLにおけるセマンティクスとは、
> そのHTML要素には、どのような目的や役割があるのか？

ということを表し、HTMLのセマンティック要素はコンピュータに意味を提供します。

https://developer.mozilla.org/ja/docs/Glossary/Semantics
### セマンティクスとマシンリーダブル
つまり、セマンティックなマークアップがアクセシビリティにつながる理由は、

**セマンティックにマークアップすると、マシンリーダブル（機械可読）になる**

からです。
スクリーンリーダーなどの支援技術のテクノロジーにも利用可能になり、コンテンツを使える人の層が増え、アクセシビリティ向上につながります。これはWCAGの挙げている「知覚可能」「操作可能」「理解可能」「堅牢」という4つの原則のうち「堅牢」にあたります。

https://www.w3.org/WAI/WCAG22/Understanding/intro#understanding-the-four-principles-of-accessibility

:::note
**Webアクセシビリティの根幹の一つがマシンリーダビリティ（機械可読性）です。**
マシンリーダブルにすることで多様なアクセスの可能性が広がります。例えば、SEOにおいてもクローラーがウェブサイトの内容を理解できるようにするという点では同理論であり、セマンティックな実装は有効です。
このように支援技術だけにとどまらず、自身のWebサイト外のサービスやアプリケーションに転用できる可能性も広がります。
:::
支援技術では次のようにセマンティクスが伝わります。
## アクセシビリティオブジェクトモデル（AOM）
スクリーンリーダーなどの支援技術は、OSがもつアクセシビリティAPIを介してOS上のアプリケーションとやりとりをしてセマンティクスを伝えられます。
1. アプリケーションはアプリケーションのウィンドウをルートノードにして**アクセシビリティオブジェクトモデル**（AOM。アクセシビリティツリーとも呼ばれる）を生成
2. AOMをアクセシビリティAPIを通して公開
3. 支援技術がAOMを読み取り操作する
4. ユーザーに伝わる、操作できる
5. 支援技術がユーザー操作を検知
6. アクセシビリティノード上でアクションを実行する

https://masup9.github.io/aom/explainer.html#%E8%83%8C%E6%99%AF-%E6%94%AF%E6%8F%B4%E6%8A%80%E8%A1%93%E3%81%A8%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B7%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%83%84%E3%83%AA%E3%83%BC

原文（英語）

https://wicg.github.io/aom/explainer.html#the-accessibility-object-model
### AOMの生成
ブラウザが画面描画をするには、HTMLからDOM（ドキュメントオブジェクトモデル）を生成し、CSSからCSSOM（CSSオブジェクトモデル）を生成、2つのモデルを合成し、レンダリングツリーを作成、レイアウト計算、描画を行います。
AOMも同じように、DOMとCSSOMを組み合わせて作成されます。
  - DOMから名前や役割、状態などのセマンティクスを読み取る
  - CSSOMから`display:none;`などのスタイル情報を読み取り反映させる　<br> ※`display:none;`とした要素は、スクリーンリーダーからも隠される。`visibility`プロパティも同様

以下の例では、チェックボックスをカスタムコンポーネントとするため、HTMLネイティブの`input`要素を`display:none;`としています。
```html:html
<input type="checkbox" id="receive-info">
<label for="receive-info">新着情報を受け取る</label>
```
```css:css
input[type=checkbox] {
    display: none;
}
label::before {
 /* 独自のチェックボックスのスタイル*/
}
```
このときのAOMはDOMとCSSOMを合成し生成されますが、CSSOMの`input`要素が`display:none;`となるので、`input`要素が含まれていません。
![AOMの生成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620233/351170f7-70c7-4ad4-9106-78178183e210.png)
### AOMが提供する情報
AOMは以下の情報を提供し、スクリーンリーダーなどはこれら情報をもとに読み上げを行います。WAI-ARIAにはAOMのプロパティに対応した語彙があります。
#### Nameプロパティ
- オブジェクトの名前
- `button`要素のテキストや`label`要素のテキストなど、要素のテキストノードから取れる
  - 上の例で`input`要素が表示される場合、`input`要素のNameはlabelと関連づけられているので、`Name:"新着情報を受け取る"`となる
- WAI-ARIAでは直接Nameプロパティを与える`aria-label`や`aria-labelledby`属性でも指定ができる
#### Roleプロパティ
- オブジェクトの役割
- `button`要素であれば、`Role:button`となる。クリック可能であることを伝える。HTML要素にそれぞれ割り当てられている
- WAI-ARIAでは直接`role`属性で指定できる
#### Descriptionプロパティ
- オブジェクトの説明。Nameプロパティより詳細
- HTMLでは`title`属性、WAI-ARIAでは`aria-description`属性など
#### その他プロパティ
- 他にも、Expandedプロパティ（オブジェクトが展開されているか）、Checkedプロパティ（チェックされているか）、Disabledプロパティ（無効か）などの状態プロパティがある
    - WAI-ARIAでは`aria-expanded`,`aria-checked`,`aria-disabled`など
- また、Busyプロパティ（要素内が変更されている途中か）など、HTMLネイティブがもたない属性もある
    - WAI-ARIAでは`aria-busy`など
### AOM適用の優先順位
セマンティクスの優先順位は、 **WAI-ARIA >（CSS + HTML）** となり、WAI-ARIAが最も優先されます。

:::note warn
- WAI-ARIAが優先されるのは基本的にはどのブラウザでも同じだが、CSSによるRoleの変更はブラウザによることがある
- WAI-ARIAは、`role`属性と`aria-*`属性を個々に指定できるが、`p`要素が`checked`属性をとれないように、ある程度組み合わせが定めらている
- HTMLとWAI-ARIAについても許可された組み合わせがあり、[ARIA in HTML日本語訳](https://momdo.github.io/html-aria/)にまとまっている<br>※元ページ（英語版）：[ARIA in HTML](https://www.w3.org/TR/html-aria/)
:::
## WAI-ARIAはHTMLセマンティクスの補完
これまで見てきたように、WAI-ARIAは支援技術にアクセスできる有効な手段ですが、以下の理由からHTML要素の使用が可能であればHTML要素を使うことを基本とし、使用できない場合の補完としてWAI-ARIAを使用するようにしましょう。
- 前項「AOM適用の優先順位」の注意事項にあるように、WAI-ARIAには使用のルールがあり、間違えて使用するとユーザーの混乱を招く可能性がある
- WAI-ARIAでは`button`要素や`a`要素などのインタラクションの補完はできない。HTMLの要素が使用できないのであれば、JavaScriptなどから機能を追加しなければならず、コーディングコストがかかる
- ブラウザによってはWAI-ARIAを理解できない、一部の機能がサポートされていないが、HTMLのセマンティクスならサポートしている場合がある
## おわりに
アクセシビリティ取り組みのアプローチはプロジェクトの環境に依存するところが大きいため様々ですが、適切なマークアップを行うだけでマシンリーダビリティの多くは担保されます。ベースができていれば、次の目標にもスムーズにつなげられます。（「スクリーンリーダー対応を目標にする」、「キーボード操作など要素のインタラクションをテストして足りない機能を追加する」など）

「WCAGの基準AAに準拠させよう」とすると範囲が膨大となって挫折したり、いきなり「WAI-ARIAを学んで記述しよう」とすると、学習コストがかかり、かえってアプローチとしては遠回りになる可能性があります。まずは、小さいスコープで改善観点をシンプルにし、できるところから取り組んでいきましょう。
### その他参考
- 書籍：「Webアプリケーションアクセシビリティ――今日から始める現場からの改善」伊原力也，小林大輔，桝田草一，山本伶　著（出版：技術評論社）
- [内閣府ホームページ：リーフレット「令和６年４月１日から合理的配慮の提供が義務化されます！」](https://www8.cao.go.jp/shougai/suishin/sabekai_leaflet-r05.html)
- [MDN：Accessibility tree (アクセシビリティツリー)](https://developer.mozilla.org/ja/docs/Glossary/Accessibility_tree)
- [MDN：ARIA の状態とプロパティ](https://developer.mozilla.org/ja/docs/Web/Accessibility/ARIA/Attributes)