【2-1.キーボード操作改善＋スクリーンリーダー編】ここから始めようWebアクセシビリティ

## 関連記事
1. [【0.気持ち整理編】](https://qiita.com/shamokit/items/2d490f281a3bd168fdd6)
1. [【1.導入編】](https://qiita.com/shamokit/items/e8c4c2f13cc604f4fb2c)
1. [【2.キーボード操作】](https://qiita.com/shamokit/items/7a4c32979afdab74dcee)
1. いまここ 【2-1.キーボード操作改善＋スクリーンリーダー編】

## 振り返りと概要
前回の記事ではあえてキーボードで操作できない悪い例を紹介しました。
今回の記事ではそれを修正してキーボードで操作できるかを確認した後、スクリーンリーダーの使い方などを簡単に説明していきます。

## キーボードで操作できるように修正する
[前回作った非アクセシブルなページ](https://shamokit.com/examples/a11y/bad)

- リンク
- ボタン
- アコーディオン
- タブ

それぞれに問題がありました。
さっそく修正していきましょう。

### リンク
`href`属性にリンク先のパスを指定しましょう。

:::note warn
このリンクはスクリーンリーダーでの読み上げで改善すべきポイントがまだ残っています。
:::


### ボタン
`button`タグに変更しましょう。
忘れがちですが、`type`属性を指定するようにしましょう。

デフォルトは`type="submit"`です。
これが原因でsubmitされてしまうことがあります。
ただのボタンなら`type="button"`を指定するのを忘れないようにしましょう。

:::note warn
このボタンはスクリーンリーダーでの読み上げで改善すべきポイントがまだ残っています。
:::

### アコーディオン
簡単に変更したいなら`details`タグに変更しましょう。
デフォルトで開きたい場合は`details`タグに`open`属性を指定します。

:::note info
`details`タグでアニメーションをつけたい場合はテクる必要がありちょっとめんどくさいです。
[ICS MEDIAさんの記事](https://ics.media/entry/220901/)にわかりやすくまとまっているのでこの記事では説明しません。
:::

`details`タグを使用しない場合は`button`タグで実装することになります。
[詳しい実装方法はこちら](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-expanded#combobox)

:::note warn
このアコーディオンの「buttonでの実装」についてはスクリーンリーダーでの読み上げで改善すべきポイントがまだ残っています。
:::

### タブ
タブは実装が少し多いです。

- タブを`button`タグに変更する
- アクティブなタブの`tabindex`を`0`、それ以外の`tabindex`を`-1`にする
- タブにフォーカスした状態で左右をキーを押すと隣のタブに移動する
- 最初のタブで左キーを押すと最後のタブ、最後のタブで右キーを押すと最初のタブ、のようにフォーカスがループする
- タブにフォーカスした状態でエンターキーを押すとタブパネルが切り替わる
- 見えているタブ以外を`hidden`属性で隠す
- タブにフォーカスできるように`tabindex="0"`を指定する

ここまでが __最低限__ の実装です。
[詳しい実装方法はこちら](https://developer.mozilla.org/ja/docs/Web/Accessibility/ARIA/Roles/tab_role)

:::note warn
このタブはスクリーンリーダーでの読み上げで改善すべきポイントがまだ残っています。
:::

### ここまで
ここまで対応するといったんキーボードで操作できるようになります。
[今回作ったキーボード操作可能なページ](https://shamokit.com/examples/a11y/good)

- タブキーでのフォーカスの移動
- EnterまたはSpaceキーでのボタンのクリックやアコーディオンの開閉
- 左右キーでのタブの選択とEnterまたはSpaceキーでのタブの切り替え

ができるか確認してみましょう。

これでサイト内のコンテンツにキーボードからもアクセスできるようになりました！

## スクリーンリーダー
スクリーンリーダーとは、コンピューターの画面読み上げを行なってくれるソフトウェアのことです。

こちらを使用することで、視覚に頼ることなくコンテンツから情報を得ることができます。
実際に使ってみましょう！

<details><summary>Windowsユーザーの方</summary>

[NVDA](https://www.nvda.jp/nvda2023.1jp/ja/userGuide.html#NVDAQuickStartGuide)にインストールの手順が載っているので入れてください。

:::note info
[日本視覚障害者ICTネットワーク](https://jbict.net/survey/at-survey-02)さんの調査によるとWindowsユーザーが圧倒的に多く、「PC-Talker」という支援技術を用いている方が多いようです。
僕は「NVDA」の名をよく聞く印象だったのでこの記事ではNVDAの方を紹介しています。
:::
</details>

<details><summary>Macユーザーの方</summary>

システム環境設定→キーボード→キーボードショートカット→アクセシビリティ
でショートカットキーを確認してください。
`cmd+F5`でVoiceOverが起動するようになっていると思います。

__補足__
[VoiceOverの操作](https://support.apple.com/ja-jp/guide/voiceover/cpvokys04/10/mac/13.0)
</details>

:::note info
特定の支援技術に対応する　というよりかは、正しいマークアップを行っておく、そうするとどの支援技術でも正しく読み上げられるようになる　と思っておくとよさそうです。
:::

スクリーンリーダーが立ち上がったら、その状態で
[今回作ったキーボード操作可能なページ](https://shamokit.com/examples/a11y/good)
に戻ってタブキーで

- リンク
- ボタン
- アコーディオン
- タブ

にフォーカスしてそれぞれ何と読まれるのか確認してみましょう。
目を閉じて確認するといいかもしれません！

---

どうでしたか？
おそらくこう感じたのではないでしょうか。

- リンク
リンク　こちら　と言われても何のリンクかわからない
- ボタン
+1 ボタン　と言われても意味がわからないし、いまカウントがいくつなのかもわからない
- アコーディオン
  - `details`の方は問題なさそう
  - `button`の方はアコーディオンが開いているのか閉じているのかわからないしそもそもアコーディオンなのかもわからない
- タブ
哺乳類 ボタン と言われてもこれがタブだとわからない

このように、リンク、ボタン、アコーディオン、タブについてそれぞれスクリーンリーダーユーザーのために対応が必要なことがお分かりいただけたと思います。

## 「Webをもっと使いやすくする　誰にでも使えるようにする」
ここで[最初の記事](https://qiita.com/shamokit/items/2d490f281a3bd168fdd6#web%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%81%AB%E5%A4%A7%E5%88%87%E3%81%AA%E8%80%83%E3%81%88%E6%96%B9)に戻ってみましょう。


__「Webをもっと使いやすくする　誰にでも使えるようにする」__
が最終目的でした。

スクリーンリーダーを使うユーザー数は視覚障害者数から概算できるであろうと推測すると、ざっくり30万人のうち数%〜数十%程度のユーザーがスクリーンリーダーなどを使い、視覚以外から情報を得ている可能性があると考えられそうです。

その中で自分が関わっているサイトやアプリケーションにどれくらいの人数が来ているかはわかりませんが、そもそもマウスでしか操作できないなら来ていてもすぐに離脱してしまっているのではないでしょうか。

この記事ではひとまずキーボードでの操作をサポートしましたが、＋スクリーンリーダーへのサポートもできれば __「Webをもっと使いやすくする　誰にでも使えるようにする」__ が達成できそうですね！

## まとめ
- キーボードで操作できるだけでは不十分
- スクリーンリーダーへの対応が必要

今回の記事でキーボードやスクリーンリーダーなどへの対応が必要なことを知り、
スクリーンリーダーがひとまず立ち上がるようになりました。
細かい使い方は使う中で覚えていくと思うので詳しく説明しません。

次の記事からは読み上げに対して改善する方法を学んでいきましょう！