Webアクセシビリティ対応を考えてみた話


株式会社LITALICOでエンジニアをやっている[@negi](https://qiita.com/negi)です。
この記事は『[LITALICO Advent Calendar 2017](https://qiita.com/advent-calendar/2017/litalico)』5日目の記事です。

# はじめに

弊社[LITALICO](http://litalico.co.jp/)では、「障害のない社会をつくる」というビジョンの元に様々な事業を展開しています。

先日、社内でユニバーサルデザインについて議論することが何度かありました。
その際には、Webに限らず [発達障害のお子さまへ療育を行う教室](https://junior.litalico.jp/) や [障害を持つ方の就職支援をする事業所](https://works.litalico.jp/) で使う教材や資料におけるユニバーサルデザインをメインに議論したのですが、[弊社運営のWebサービス](http://litalico.co.jp/service/)こそWebアクセシビリティに対応すべきなのではと思い立ったので、まずは情報をまとめつつ、簡単に対応できそうな部分に着手してみました。

※ 恥ずかしながら筆者はWebアクセシビリティのド素人ですので、ご指摘等々大歓迎です。今後は界隈のイベント等にも参加できたらいいなと思っております。

# Webアクセシビリティとは

## JIS X 8341-3

http://waic.jp/docs/jis2016/understanding/201604/ より
> 『JIS X 8341-3:2016』の正式名称は、『高齢者・障害者等配慮設計指針－情報通信における機器，ソフトウェア及びサービス－第3部：ウェブコンテンツ』という。この規格でいう「ウェブコンテンツ」は、ブラウザや支援技術などのユーザエージェントを介して利用者に提供されるあらゆるコンテンツを指し、次のようなものが挙げられる。
> 
> ウェブサイト
> ウェブアプリケーション
> ウェブシステム
> 携帯端末などを用いて利用されるコンテンツ
> イントラネットの業務用システム
> 電子マニュアル
> CD-ROM などの記録媒体を介して配布される電子文書
> 『JIS X 8341-3:2016』は、高齢者や障害のある人を含む全ての利用者が、使用している端末、ウェブブラウザ、支援技術などに関係なく、ウェブコンテンツを利用することができるようにすることを目的としている。そのためにウェブコンテンツが満たすべきアクセシビリティの品質基準として、レベルA、レベルAA、レベルAAAという3つのレベルの達成基準が定められている。
> 
> また、『JIS X 8341-3:2016』が想定している読者は、次のように、ウェブコンテンツの企画、設計、制作・開発、確認、試験、保守・運用に関わる方たちである。
> 
> ウェブコンテンツの提供者（例：ウェブマスター、ウェブ担当者、アプリケーションやシステム等の管理者など）
> ウェブコンテンツの制作者・開発者全般（例：プロデューサー、ディレクター、デザイナー、フロントエンド・エンジニア、プログラマーなど）
> チェックツールの開発者
> ウェブコンテンツの試験を行う者

この規格の大元は「[WCAG（Web Content Accessibility Guidelines）](http://waic.jp/docs/WCAG20/Overview.html)」であり、
2008年にW3C勧告（Web技術の標準）となり、2012年にはISO/IECの国際規格になったとのこと。

* WCAGとは

http://waic.jp/docs/WCAG20/Overview.html

> Web Content Accessibility Guidelines (WCAG) 2.0 は、ウェブコンテンツをよりアクセシブルにするための広範囲に及ぶ推奨事項を網羅している。 このガイドラインに従うことで、全盲又はロービジョン、ろう又は難聴、学習障害、認知障害、運動制限、発話困難、光過敏性発作及びこれらの組合せ等を含んだ、様々な障害のある人に対して、コンテンツをアクセシブルにすることができる。又、このガイドラインに従うと、多くの場合、ほとんどの利用者にとってウェブコンテンツがより使いやすくなる。

つまり、ウェブを見る際になんらかの障害がある方に対して、ウェブコンテンツを使いやすくするための指針であると理解しました。

一方で、様々なサイトでも書かれていますが、「Webアクセシビリティを必要とする人」は、特に「障害者」や「高齢者」に限ったものではありません。
正しい（セマンティックな）HTMLを書くことで、Webブラウザ自身やクロールしてくるbotなどの機械に対するアクセシビリティを向上させることにもなります。人間でも機械でも読みやすいWebを目指しましょうということですね。


（他にも色々なツール等あると思いますが）今回は、読み上げツールを例に、具体的に私が対応してみた例を紹介できればと思います。

## 読み上げソフトの例

### Macの場合
* [VoiceOver](https://www.apple.com/jp/accessibility/mac/vision/)

### Windowsの場合
* [ナレーター](https://www.microsoft.com/ja-jp/enable/products/windows10/default.aspx)


今回はMacのVoiceOverを使っていきます。
※ 環境 macOS Sierra 10.12.6

## Voice Overの使い方
Voice Overを使ったことがなかったのでチュートリアルをやってみました。ほぼスクショだけですが、一部紹介させていただきます。

※ そんなのわかってるよ、という方は飛ばして頂いて…
※ そもそもVoice Overとはなんぞや、という方はこちらへ https://www.apple.com/jp/accessibility/mac/vision/

### 設定
<img width="669" alt="アクセシビリティ_と_Mac_OS_X_における音声読み上げ__VoiceOver__—_Website_Usability_Info.png" src="https://qiita-image-store.s3.amazonaws.com/0/62612/4941a182-2407-b38c-0697-df18bac4ea20.png">

「VoiceOverを有効にする」にチェックを入れるだけ。

### VoiceOverトレーニングをやってみる
* 正直、読み上げはだとだとしい

<img width="600" alt="学んだことを練習.png" src="https://qiita-image-store.s3.amazonaws.com/0/62612/59a89b59-3d14-122b-00a5-a375412659f6.png">


<img width="600" alt="VoiceOver修飾キー.png" src="https://qiita-image-store.s3.amazonaws.com/0/62612/8e182d0d-0d05-343f-9309-33bd8794569e.png">


<img width="600" alt="キーボードヘルプ.png" src="https://qiita-image-store.s3.amazonaws.com/0/62612/baa5d172-945b-534a-67f3-f5af6432f880.png">
VO-Kで、自分の押しているキーを読み上げてくれる

<img width="600" alt="画面の表示範囲を動かす.png" src="https://qiita-image-store.s3.amazonaws.com/0/62612/82702398-b362-c479-f5bf-0c7fae72c3e1.png">
何かアクションする際にはVOキー（control + alt）との組み合わせで行う（Emacsのcontrolキーみたいなものですかね）

<img width="600" alt="声を調節.png" src="https://qiita-image-store.s3.amazonaws.com/0/62612/11c9cc68-2caa-1ed2-2cf0-3380227e7c1b.png">


<img width="600" alt="テキストフィールドに入力.png" src="https://qiita-image-store.s3.amazonaws.com/0/62612/4c4fc7ae-14ec-34be-f4ab-6ff785ac5569.png">


<img width="600" alt="要素を操作.png" src="https://qiita-image-store.s3.amazonaws.com/0/62612/25d8f777-51f7-f5b6-6a5f-f79dfb643fcf.png">
要素をドリルダウン的に探索する場合はVO + Shift + 下矢印 を押してから、 VO + 矢印キーで探索

<img width="600" alt="表の中を移動.png" src="https://qiita-image-store.s3.amazonaws.com/0/62612/9c242321-020c-daab-b515-9fc0f7a6004f.png">


<img width="600" alt="日付と時刻を選択.png" src="https://qiita-image-store.s3.amazonaws.com/0/62612/e736be20-d05f-8b99-36da-22572007373c.png">


<img width="600" alt="自動Webスポットを使用.png" src="https://qiita-image-store.s3.amazonaws.com/0/62612/6bbce221-4363-768f-4db0-b4184222d69d.png">
※「視覚的なデザインに基づいて…」の部分がわからなかったのですが、つまり背景色とかのことを指すのでしょうか…

※ ちょっと ~~めんどくさい~~ 時間がないのであとは説明省略…
※ 他に下記のような説明がありました


* 何か要素を選択した上でその中をさらに探索する（ドリルダウン） VO-Shift-下矢印
* 現在の要素の探索から上の階層に出る VO-Shift-上矢印
* 要素の移動 VO-矢印
* とにかく何かを選択する VO-スペース
* VO-D Dock選択
* VO-H ヘルプ


## Webアクセシビリティの例
下記のサイトの対応例が具体的でわかりやすかったです。

「【アクセシビリティ】HTML/CSSで突っ込まれた点をメモメモ」
http://bashalog.c-brains.jp/17/09/08-193700.php
「【アクセシビリティ】カルーセルで突っ込まれた点をメモメモ」
http://bashalog.c-brains.jp/17/10/05-173000.php

はてなのサービス開発ブログも参考になりました。
「少しずつアクセシビリティ意識する」
http://developer.hatenastaff.com/entry/2017/08/30/123457

## 今回やってみること
正直、[WCAG](http://waic.jp/docs/WCAG20/Overview.html)を隅から隅まで読むのは時間がないので、上記のサイトで例に上がっているものを参考にしつつ、
弊社のサービスを使って頂いているユーザさんから、「読み上げソフトで読み上げたときによくわからない」とご指摘を受けた部分があったので、
実際にVoiceOverに読み上げさせてみて、気になったところを改善してみました。


### ラベルの選択未選択を視覚でのみ表現していたが、読み上げにも対応したい
![LITALICO_りたりこ_発達ナビ.png](https://qiita-image-store.s3.amazonaws.com/0/62612/1bebb9f0-3380-a3de-a880-17cb952430e7.png)

[LITALICO発達ナビ](https://h-navi.jp)内のとあるページにおいて、
上記のような、ラベルに見える要素をspanで配置、該当する場合は背景色を緑、該当しない場合は背景色をグレーとして、選択・未選択をCSSで表現している箇所がありました。
これを読み上げソフトで読み上げると __「発達障害 身体障害 知的障害 重症心身」__ としか読まれないので、選択されているのかどうか聴覚情報だけではわかりません。

```HTML
<!-- HTML -->
<div class="hoge-block">
  <div>受け入れ障害種別</div>
  
  <span class="option--selected">発達障害</span>
  <span class="option--selected">身体障害</span>
  <span class="option--selected">知的障害</span>
  <span class="option">重症心身</span>
</div>
```

```scss
# SCSS
.hoge-block {
  %__option {
  	# ラベルのスタイル
  }

  .option {
  	@extend %__option;
  	backgroud-color: #green;
  	
  	&--selected {
  	  @extend %__option;
   	  backgroud-color: #gray;
  	}
  }
}
```

とはいえ、HTMLレベルで表現できない視覚情報なので、どうにかして読み上げに対応したい…
ということで、下記を参考に `aria-label`を追加しました。

参考 [Google HTML自体で表現できないセマンティクスを表現する方法について](https://developers.google.com/web/fundamentals/accessibility/semantics-aria/)

> [Web Accessibility Initiative's Accessible Rich Internet Applications 仕様](https://www.w3.org/TR/wai-aria/)（WAI-ARIA、または単に ARIA）は、ネイティブ HTML で対応できないアクセシビリティの問題がある領域を仲介するのに適しており、アクセシビリティ ツリーでの要素の解釈方法を変更する属性を指定することで機能します。

HTMLで表現しただけでは表現しきれない情報を、スクリーンリーダー等が解釈できるように情報を付加します。


```HTML
<div class="hoge-block">
  <div>受け入れ障害種別</div>
  
  <span class="option--selected" aria-label="発達障害（選択済み）">発達障害</span>
  <span class="option--selected" aria-label="身体障害（選択済み）">身体障害</span>
  <span class="option--selected" aria-label="知的障害（選択済み）>知的障害</span>
  <span class="option" aria-label="重症心身（未選択）">重症心身</span>
</div>
```
これで、 __「発達障害、選択済みグループ」__ と読み上げられます。
※「グループ」と読み上げられる理由がわからなかったのですが、選択有無は少なくともわかるようになりました。

# おわりに

これはほんの一例で、まだまだ課題は山積ですので、少しずつ対応していこうと思います。
本記事がアクセシビリティ対応導入のきっかけとなれば幸いです。



さて、明日の『[LITALICO Advent Calendar 2017](https://qiita.com/advent-calendar/2017/litalico)』6日目は[@5kakr](https://qiita.com/5kakr)さんの「地に足つけた、サイバー攻撃対策」です。お楽しみに！

# 参考リンク
* [ウェブアクセシビリティ基盤委員会（WAIC）](http://waic.jp/)
* [Web Content Accessibility Guidelines(WCAG)2.0 日本語翻訳版](http://waic.jp/docs/WCAG20/Overview.html)
* [WCAG 2.0 解説書](http://waic.jp/docs/UNDERSTANDING-WCAG20/Overview.html)
* [WCAG 2.0 達成方法集](http://waic.jp/docs/WCAG-TECHS/Overview.html)
* [【アクセシビリティ】HTML/CSSで突っ込まれた点をメモメモ](http://bashalog.c-brains.jp/17/09/08-193700.php)
* [【アクセシビリティ】カルーセルで突っ込まれた点をメモメモ](http://bashalog.c-brains.jp/17/10/05-173000.php)
* [Google ARIAの概要](https://developers.google.com/web/fundamentals/accessibility/semantics-aria/)