今日から始めるアクセシビリティ~少しの気遣いでより使いやすいアプリへ~

# 目次
1. [はじめに](#はじめに)
1. [アクセシビリティとは](#アクセシビリティとは)
1. [文字サイズはremで指定する](#文字サイズはremで指定する)
1. [画像にはalt属性をつける](#画像にはalt属性をつける)
    1. [svgにはtitle要素を指定する](#svgにはtitle要素を指定する)
1. [適切なタグを使用する](#適切なタグを使用する)
    1. [buttonタグ](#buttonタグ)
    1. [aタグ](#aタグ)
    1. [hタグ](#hタグ)
    1. [inputタグ](#inputタグ)
    1. [labelタグ](#labelタグ)
1. [コントラストを高くする](#コントラストを高くする)
    1. [形で変化を示す](#形で変化を示す)
1. [手を動かして確かめる](#手を動かして確かめる)
    1. [文字サイズを変更する](#文字サイズを変更する)
    1. [キーボードで操作してみる](#キーボードで操作してみる)
1. [参考文献](#参考文献)



# はじめに
こんばんは。[watnow](http://www.watnow.jp/)に所属する3回生の[藤堂ゆうか](https://twitter.com/chocolatbrown "藤堂ゆうかのtwitterアカウント")です。
[watnowアドベントカレンダー](https://qiita.com/advent-calendar/2023/watnow-calendar)の14日目を担当します。よろしくお願いします。

本記事では、アクセシビリティの輪読会を通して学んだことをより多くの人に共有すべく、より簡単で効果的なポイントをまとめてみました。フロントエンドやモバイルの開発をしている全ての方が対象です。

書いていて長くなってしまったので、詳細は開いてみる形式にしています。気になる方は読んでみてください。また、**実装も行ったので関連リンクから試してみてください！**



# アクセシビリティとは
アクセシビリティとは、「利用のしやすさ」や「近づきやすさ」という意味で、**サービスなどをどれだけの人が使えるようにするか**という土台作りのようなものです。

<details><summary>アクセシビリティに対応させるメリット</summary>

:::note info
目が見えないなどの障がいがある方や、何かの作業中で操作が困難である人など、あらゆる人があらゆる状況でサービスを快く使えるようにするためにはアクセシビリティに対する理解が必要です。アクセシビリティが向上すると、ユーザの増加が、ユーザビリティ(特定のユーザにおける「使いやすさ」)の向上にもつながります。
:::

</details>

では、どのようにアクセシブルにしていくのか、実装からデザインまで様々な角度からご紹介します。



# 文字サイズはremで指定する
文字サイズは、`font-size`にて`px`や`rem`で指定できます。**ユーザがデフォルトの文字サイズを変更した際、remではその変更が文字サイズに反映されますが、pxでは指定pxのまま**になります。

実装サンプル➀: [文字サイズの変更と見た目](https://web-a11y.vercel.app/simple-examples/1-font-size)

老眼の方などがデフォルトの文字サイズを変更したとして、サイトの文字サイズが変わらなかったら読めないままですよね。

<details><summary>pxとremの違い</summary>

:::note info
pxは1pxでデバイスの1ドット分を表し、絶対的な値を取ります。一方remはデフォルトの文字サイズ1文字分を表し、相対的な値を取ります。
:::

:::note
デフォルトの文字サイズは、未変更の状態で`1rem=16px`です。
少し大きいサイズなどはこの式から算出することが出来ます。
:::

</details>

remで指定することで、ユーザが読みたい文字サイズに対応させたサイトを提供することができるのです。



# 画像にはalt属性をつける
目が見えない人々にとって画像からは何の情報も得られません。しかし、**alt属性を指定することで、画像情報を文字に起こして伝えることが出来ます**。

スクリーンリーダーなどを使用しているユーザには、画像が見えない代わりにalt属性が読み上げられます。よって、alt属性を適切に指定しておくことで、画像を見れないユーザにも必要な情報が届けられます。

<details><summary>聴覚障害者を助けるスクリーンリーダ</summary>

:::note info
スクリーンリーダーとは、聴覚障害者などがコンテンツを音声で聞いて理解するために変換に使用されるツールです。
アクセシビリティにおいて、スクリーンリーダーに適切な情報を読み上げてもらうという工夫はとても大切になります。
:::

</details>

### svgにはtitle要素を指定する
画像のひとつとして、svgもあげられます。アイコンなどによく使われるsvgですが、title属性用いることで、代替テキストを付与することが出来ます。



# 適切なタグを使用する
**HTMLのタグを適切に使うことも、アクセシビリティの向上においてとても大切です。**

<details><summary>HTMLのセマンティクス</summary>

:::note info
タグにはそれぞれ、セマンティクスという役割のようなものが定められています。これらにより、スクリーンリーダーや検索エンジンなどにより正確なコンテンツを伝えます。例えば、「h1タグは見出しを表す」などです。
:::

</details>

よく使われるタグなど、効果的であろうタグをいくつか紹介します。


## buttonタグ
ボタンはよく使われる要素のひとつです。buttonタグを用いて簡単に実装ができます。

ところが、押したら関数を呼ぶというのは`onClick`がある要素であれば、divタグなどでも実装可能です。(過去に私もdivタグで画面遷移を実装したりしていました。これは、aタグの節でも述べますが、かなり酷い実装です。)

**buttonタグを使えば、マウスのホバー時にマウスポインタが変わったり、スクリーンリーダーにボタンの役割を持つ要素であることが伝わるなど、ボタンであることを明確に伝えることが出来ます。**

実装サンプル➁: [buttonタグによるボタンの実装](https://web-a11y.vercel.app/simple-examples/2-button)

ボタンを見逃してしまわないためにも、ボタンにはbuttonタグを使いましょう。

<details><summary>WAI-ARIAでセマンティクスを補完する</summary>

:::note warn
buttonタグでなくとも、WAI-ARIAというものを用いてセマンティクスを補完させることもできます。
しかし、HTMLのネイティブセマンティクスの方が様々な点で優れているので、既存のタグで実装できるものはそちらで、HTMLでは用意されていないタブなどの実装時にはWAI-ARIAを検討して見てください。
:::

</details>


## aタグ
aタグはリンクを実装する際に使用します。
buttonタグと同様に、`onClick`を駆使して画面遷移の関数を実行すれば、aタグでなくとも画面遷移が実装可能です。しかし、リンクであることが機械には理解出来ず、リンク特有の操作が出来なくなります。

実装サンプル➂: [aタグによるリンクの実装](https://web-a11y.vercel.app/simple-examples/3-a)

<details><summary>リンク特有の操作</summary>

:::note info
- **マウスホバー時に遷移先のURLが画面左下に表示される**
- **右クリックで「新しいタブで開く」などの特有の操作が行える**
- **ホイールクリックを押すと別タブで開かれる** など
:::

</details>


## hタグ
見出しにはhタグを用います。hタグで指定されたテキストは、文字サイズが大きくなったり太字になったりします。
**これを利用して、強調したいためだけにコンテンツの途中でhタグを用いたりしてしまう人もいます。**

ですが、hタグには見出しというページの階層構造を示す役割があります。よって、**強調のためだけにhタグを使ってしまうと、見出しを読み飛ばしたいスクリーンリーダーなどは不適切なコンテンツに導かれてしまいます。** 全体像も把握しづらいです。

h1~h6タグを使って、適切にページ構造を構築してください。

</details>
<details><summary>不要なセマンティクスの削除</summary>

:::note
視覚表現のために役割と合わないタグを使用ふる際には、WAI-ARIAの`role=presentation`を用いて不要なセマンティクスを削除することも出来ます。
:::

</details>

## inputタグ
入力フォームを実装する際には、inputタグを用います。

inputタグには多種多様なフォームが用意されています。これらは、type属性を指定することで利用することができます。type属性については、[MDNのinputタグのサイト](https://developer.mozilla.org/ja/docs/Web/HTML/Element/input#input_%E3%81%AE%E5%9E%8B)から確認することができます。

https://developer.mozilla.org/ja/docs/Web/HTML/Element/input#input_%E3%81%AE%E5%9E%8B

inputタグを用いずとも、チェックボックスなどをJavaScriptなどを駆使して自作することもできます。

実装サンプル➃: [inputタグによる入力フォームの実装(ラジオボタン)](https://web-a11y.vercel.app/simple-examples/4-input)

しかし、適切なフォームを使用することで、**バリデーションなども自動的に行うことができ、多くのユーザが正しい値を入力できる**ことにつながります。
適切な入力フォームで実装するようにしましょう。


## labelタグ
labelタグはinputタグと共に使用できます。使い方は、下記のように囲うだけです。
```
<lavel>
    年齢
    <input type="number">
</label>
```
このメリットは、**ラベルと入力フォームを紐づけられる**ことです。スクリーンリーダは、フォームにフォーカスした際、ラベルが読み上げられます。

また、forとidで紐づけることもできます。
```
  <label for="apple">りんご</label>
  <input type="checkbox" name="apple" id="apple" />
```
上記コードでは、**ラベルを押すだけでチェックボックスが押せるようになる**など、操作性の向上にもつながっています。

実装サンプル➄: [labelタグによるinput要素との紐づけ](https://web-a11y.vercel.app/simple-examples/5-label)

適切にlabelを記述し、入力要素をよりアクセシブルにするようにしましょう。

# コントラストを高くする。
アクセシブルなサイトには、コントラストはとても大事です。
**色の違いを見分けづらいユーザにとって、原色の赤色と青色などのコントラストに差がない色は同じ色と知覚します。**

色が違うからといって、同じアイコンで違う色のボタンが複数あったとしましょう。色の知覚が難しいユーザにとって、これらのボタンは同じボタンと思うでしょう。**色のみによる情報提供は、ユーザによってはアクセスできないことにつながる可能性があるのです。**

コントラストを高くすることで、色相の違いやコントラストの違いを知覚しにくいユーザでも、その違いを知覚することができます。
よりコントラストの高い配色を心がけましょう。

### 形で変化を示す
より違いをはっきりさせるには、形を変えてしまうことが一番得策です。たとえば、二重線で囲ってみたり、複数のアイコンを用いてみたり、形を変えることで色に囚われずに視覚的な違いを生むことができます。

# 手を動かして確かめる
最後に、**実際に自分で手を動かしてみてほしい**という提案です。

これは、私自身がやるようになって気付けたことなのですが、アクセシブルじゃない状態で自らのサイトを使うのは、やはり使いずらいです。何なら、いらいらします。

折角なので、私が普段やっている確認を紹介します。

### 文字サイズを変更する
サイトによっては、そもそも文字がでかくならなかったりします。
文字サイズを変更し、下の二点を確認し、問題があれば修正します。
- 正しくコンテンツが拡大されていること
- それによってデザインが崩れていないこと。
:::note
文字サイズの変更
chromeの場合は、設定画面(chrome://settings/appearance)からフォントサイズを変更することができます。リンクを張り付けて使ってみてください。
:::

### キーボードで操作してみる
キーボード操作のみでサイトがどのように閲覧できるかを確かめます。
入力フォームはもちろん、リンクなどが正常に認識されているか、飛びやすいかなどを手軽に確認することができます。

私の場合は、自分のサイトに限らずキーボード操作をするようにしています。癖がつくため、いつもとの操作感の違いも含めて確かめることができるのでおすすめです。


より使いやすいサイトにするために、実際に使いながら操作感を確かめつつ、よりアクセシブルな開発をできたらよいなと思います。

# さいごに
長いですが、最後まで読んでいただきありがとうございました。
私はいつも、ユーザにとってより使いやすいサービスを作れるように頑張ってきました。アクセシビリティはその一つで、輪読会を通して仲間と共に学んできた大事な知見です。

アクセシビリティを考慮するということは、ユーザへの気遣いなのかなと思っています。使ってくれるユーザに少しでも使いやすいものを提供する努力、それが私のやりがいであり、楽しさです。

記事にすることで、少しでも多くの人がアクセシビリティを知り、文字サイズだけでもremにしてもらえたらいいなと思い、この記事を書きました。
世にあふれるサービスがよりアクセシブルになるといいなと、そしてその手伝いが少しでもできていたら良いなと思います。