Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Webアクセシビリティ入門 2026

Avatar for Recruit Recruit PRO
August 05, 2026

Webアクセシビリティ入門 2026

2026年度リクルート エンジニアコース新人研修の講義資料です。

Avatar for Recruit

Recruit PRO

August 05, 2026

More Decks by Recruit

Other Decks in Technology

Transcript

  1. 事前準備(1/2) • 以下の環境をセットアップしてください。 PC:Mac ◦ ▪ Node.js(24.16.0) ▪ pnpm(11.4.0) ◦

    ブラウザ:Chrome(最新) ◦ エディタ:Visual Studio Code(最新) ▪ • 推奨ですが、別のエディタでも構いません PCから音を出す演習があります。当日は、イヤホン/ヘッドホンを用意してくだ さい 2
  2. 事前準備(2/2) • 以下の手順でVoiceOverが起動することを確認してください 1. 適当なWebサイトを開きます 2. 以下のいずれかの方法でVoiceOverを起動します ▪ command +

    F5 ▪ command + Touch IDを素早く3回 ▪ システム環境設定 > アクセシビリティ > VoiceOver > VoiceOverを有効にする チェックボックス 3. VoiceOverのチュートリアルが表示された場合は、それを行うかスキップし、次回からは 表示されないようにします 4. 適当なWebサイトのテキストの一部を選択し、それが読み上げられることを確認します 5. 起動時と同じ方法でVoiceOverを終了します 3
  3. 自己紹介(講師) • 名前:雫石 卓耶(しずくいし たくや)@sititou70 • 株式会社リクルートに2021年新卒入社 • 所属: ◦

    株式会社インディードリクルートテクノロジーズ ◦ Technology 3部 • 普段:チームのテックリードとして設計やレビューなど • 好きなもの:アクセシビリティ ◦ ◦ 勉強したり ▪ 本 / ガイドラインを読む ▪ Trusted Tester:TT-2404-05928 チームに布教したり ▪ • フローリングの アイコンが私 レビュー / テスト整備 / ドキュメント作成 よろしくお願いします 4
  4. 自己紹介(サポート講師) • 名前:眞野 隼輔(まの しゅんすけ)@progfay • 株式会社リクルートに2020年新卒入社 • 所属: ◦

    株式会社リクルート ◦ ビューティー開発 1G • 普段:SALONBOARD の技術刷新と横断的な技術支援 • 趣味:Web 動向を追う、漫画を読む まのさん 5
  5. 自己紹介(サポート講師) • 名前:水足 友紀(みずたり ともき)@txxm_443 • 株式会社リクルートに2023年新卒入社 • 所属: ◦

    株式会社インディードリクルートテクノロジーズ ◦ Technology 3部 • 普段:FEからインフラに転生。Terraformと格闘 • 趣味:コーヒー、雑草、インテリア みずたりさん 6
  6. 定義 • accessibility = access + ability • accessibility =

    アクセス + できること(またはその程度のこと) • a11yと略される ◦ aとyの間に文字が11個あるから 参考:ウェブアクセシビリティ導入ガイドブック, デジタル庁, 2022。以降の出典ではタイトルだけ記載 9
  7. Webはアクセシブル • 情報媒体の中で考えると、Webコンテンツはかなりアクセシブルです。 ◦ • 例:出版物 ◦ • いつでも、どこでも、いろいろなデバイスからアクセスできる その出版物が販売されている場所と時間で入手しないといけない

    例:スマホのアプリ ◦ PCや、対応していないスマホからは使えない場合がある • アクセシブルであることは、Webの大きな利点の1つです • しかし、Webコンテンツの作り方によっては、a11yが低くなってしまいます 10
  8. Web a11yが低い例 • Aさんはロービジョン(弱視)の障がいを持っている • あるサイトの文章は、Aさんが読むにはコントラストが低い ◦ • →最低限のコントラストを考慮してデザインすればよかった Aさんは、視覚的に文章を読むのを諦めた。代わりにスクリーンリーダーを使用

    して読み上げ音声を聞こうとした。しかし文章はすべて文字画像で、alt属性など は指定されていなかった ◦ • →適切な代替テキストがあればよかった 結果的に、このサイトはAさんにとってa11yが低かったと言える 11
  9. 重要性:なぜa11yを改善すべきなのか? • 代表的なものをピックアップして紹介します ◦ アクセスできない / しにくい人を減らすため ◦ SEO対策のため ◦

    さまざまなデバイスに対応するため ◦ UX改善のため 参考:太田良典, 伊原力也, デザイニングWebアクセシビリティ, 株式会社 ボーンデジタル, 2016。以降の出典ではタイトルだけ記載 12
  10. アクセスできない / しにくい人を減らすため(1/5) • • a11y改善がメリットとなる障がい者の数*1 ◦ 国内だけで428.7万人 ◦ 視覚

    / 聴覚 / 言語 / 内部障がい、肢体不自由など 総人口で割ると ◦ 428.7万人 / 12,399万人*2 ≒ 3.4% ◦ 100人アクセスしたら3人にメリットあり? ▪ 意外に多いと思いませんか? *1:ウェブアクセシビリティ導入ガイドブックより。*2:人口推計, 2024年2月報, 総務省統計局 , 2024 13
  11. アクセスできない / しにくい人を減らすため(2/5) • 障がい者ではないがa11y改善がメリットになる人 ◦ クイズ:そのような例を思いつくだけ挙げてみてください ▪ (時間:1分) ▪

    ヒント: • 例えば目が見えづらい原因は、障がい以外に何かありますか。 • 他にも、音が聞こえづらい、操作が難しい、などについてはどうで すか。 14
  12. アクセスできない / しにくい人を減らすため(3/5) • 障がい者ではないがa11y改善がメリットになる人の例 ◦ メガネを忘れてきた / 壊れている ◦

    陽の光が眩しくて画面の色を認識しづらい ◦ 高齢になり、最近目が悪くなってきた ▪ →コントラストが強く、文字が大きいほうが良い ◦ 電車が揺れてスマホでのポインティングが難しい ◦ 最近PCを買ってみた。マウスの操作にはまだ慣れていない ▪ →リンクやボタンが大きめだとうれしい 15
  13. アクセスできない / しにくい人を減らすため(4/5) • 障がい者ではないがa11y改善がメリットになる人の例 ◦ イヤホンを忘れてきた / 充電切れ /

    つけるのが面倒 ◦ 周りがうるさくて音が聞こえない ▪ →動画や音声コンテンツに、字幕や書き起こしがあるとうれしい ◦ 一時的に腕を怪我していてマウスが使えない ◦ マウスを使うだけのスペースが無い、またはマウスを忘れてきた 16
  14. アクセスできない / しにくい人を減らすため(5/5) • 障がい者ではないがa11y改善がメリットになる人の例 ◦ 単純にキーボード操作が好き ▪ ◦ →キーボードで操作できると良い

    別の言語を話すユーザー ▪ →文字画像などは翻訳できないので困る ▪ →ソースコードが<code>で実装されていないと、変数名まで翻訳の対 象に ▪ ◦ →英語の音声/動画にキャプションや書き起こしがあると翻訳できる リンク先を別タブで開きたい ▪ →「新しいタブで開く」やCtrl + クリック / Cmd + クリックしたいの に、<button>や<div>へのonClickで実装されているので開けない! 17
  15. さまざまなデバイスに対応するため • a11yの基準を守っていると、特殊なデバイスにも対応できる場合がある • 2.5.5 ターゲットのサイズ (高度):ボタンやリンクなど、ポインタのターゲット が一定よりも大きいこと • ◦

    →ポインティングが普通より難しいデバイスに対応 ◦ 例:家庭用ゲーム機Wiiのブラウザ、Wiiリモコンでポインティングする 達成基準 1.4.3 コントラスト (最低限):ページの色使いに一定以上のコントラス トがあり、はっきり見えること ◦ →白黒表示のデバイスに対応 ◦ 例:Kindle端末、モノクロ印刷機 18
  16. SEOのため(1/3) • a11y改善とSEOの方法には共通する部分が多い • 例1:titleタグ • ◦ SEO:<title> 要素に具体的でわかりやすいテキストを記述する*1 ◦

    a11y:ウェブページには、主題又は目的を説明したタイトルがある*2 例2:alt属性 ◦ SEO:画像に alt 属性を指定することでユーザーが目的のコンテンツを見つけやす くなる*3 ◦ a11y:利用者に提示されるすべての非テキストコンテンツには、同等の目的を果 たすテキストによる代替が提供されている*4 ▪ 非テキストコンテンツ:画像など ▪ テキストによる代替:alt属性など *1:最適なタイトルリンクを出しやすくするためのベストプラクティス, Google。*2:WCAG 達成基準 2.4.2 ページタイトル, W3C。*3:Google 画像検索 SEO ベストプラクティス, Google。*4:WCAG 達成基準 1.1.1 非テキストコンテンツ, W3C 19
  17. UXの例(2/5):アクセスしやすい • title要素が適切でない例 ◦ 「新しいドキュメント」というtitle ▪ ◦ 「PRT-12345-67 | 家庭用プリンタ」というtitle。内容はPR動画

    ◦ 「PRT-12345-67 | 家庭用プリンタ」というtitle。内容は消耗品案内 ◦ 「PRT-12345-67 | 家庭用プリンタ」というtitle。内容は説明書 ▪ • →何のページかわからない →あいまい。どれにアクセスすればいいかわからない →今回はtitle要素が具体的でわかりやすかったため、アクセスしやすかった 25
  18. WCAGの歴史:WCAG 2.0 • 2008-12-11勧告 ◦ 1.0の勧告から約8.5年 • 構造を刷新、より現代的なWebの環境に対応 • 61個の達成基準(a11yを達成するための要件)

    • 標準化 ◦ ISO/IEC 40500:2012と互換 ◦ JIS X 8341-3:2016と互換 ▪ クイズ:8341という番号は、ある理由によって選ばれました。その理 由とは?(時間:30秒) 49
  19. WCAGの歴史:WCAG 2.0 • 2008-12-11勧告 ◦ 1.0の勧告から約8.5年 • 構造を刷新、より現代的なWebの環境に対応 • 61個の達成基準(a11yを達成するための要件)

    • 標準化 ◦ ISO/IEC 40500:2012と互換 ◦ JIS X 8341-3:2016と互換 ▪ →「やさしい(8341)」の語呂合わせらしいです 50
  20. WCAGの歴史:WCAG 2.1 • 2018-06-05勧告 ◦ • 2.0の勧告から約9.5年 78個の達成基準 ◦ 17個の基準を追加

    • モバイルデバイスを考慮 • 弱視、認知障害、学習障害のための基準を追加 51
  21. WCAGの歴史:WCAG 2.2(最新) • • • 2023-10-05に勧告 ◦ 2.1の勧告から約5年 ◦ 現状勧告されているWCAGの中で最新

    86個の達成基準 ◦ 2.1の1つの基準を廃止*1 ◦ 9個の基準を追加 フォーカス、入力操作と支援、認証、ヘルプについて基準を追加 *1:詳細:How and why is success criteria 4.1.1 Parsing obsolete? 52
  22. WCAGの歴史:WCAG 3.0(作成中) • 完成はあと数年後 ◦ リポジトリのコミットを見る限り、2018-04頃から作成に取り掛かっていた 様子*1 ▪ • WCAG

    2.1勧告のちょっと前 構造を刷新 ◦ 草案には、VR(仮想現実)やAR(拡張現実)といった単語も見られる *1:リポジトリ:https://github.com/w3c/silver 53
  23. 達成基準と分類 • ガイドラインは達成基準で構成されます*1 ◦ • • 達成基準:a11yを達成するための要件 達成基準は大きく4つに分類されています ◦ 知覚可能

    ◦ 操作可能 ◦ 理解可能 ◦ 堅牢 alt属性は、その画像が何なのかを知覚するためのもの ◦ →「知覚可能」を見れば良さそう *1:以降は、WCAG 2.2の場合の話で、他のバージョンには当てはまらない場合があります 56
  24. 58

  25. • レベルA:基準の分類。より優先して満たすべき基準はA。そこからAA、AAA と続く。 • 適合レベル ◦ レベルAに適合:レベルAの基準を満たすこと ◦ レベルAAに適合:A +

    AAの基準を満たすこと ◦ レベルAAAに適合:A + AA + AAA、つまりすべての基準を満たすこと ◦ 「このサイトはWCAG 2.2 レベルAに適合している」などという 60
  26. 61

  27. 66

  28. 環境構築:演習サイトのbadブランチを起動する • 「セットアップ」と「起動」の手順を実行します ◦ • できない方はSlackで教えてください 起動できたら ◦ 一通りコンテンツを眺めてみましょう ◦

    どのようなコンテンツがありますか? ▪ ◦ ヒーローヘッダー、ナビゲーション、サービス…… 「ここはa11yが低そうだな」と思われる場所はありますか? 83
  29. 1.4.3、1.4.11 コントラスト(AA) • • テキスト*1 ◦ ⭕サイズの大きなテキストに3:1以上のコントラスト比がある ◦ ⭕そうでないテキストに4.5:1以上のコントラスト比がある ◦

    サイズの大きなテキスト*2 ▪ 英語の場合:約24px以上の通常の文字、または約18.6px以上の太字 ▪ 日本語の場合:約29px以上の通常の文字、または約24px以上の太字 ⭕非テキスト:以下について、隣接する色に3:1以上のコントラスト比がある*3 ◦ ユーザーインターフェースコンポーネント*4、およびその状態の特定 ◦ コンテンツを理解するのに必要なグラフィック *1:達成基準 1.4.3 コントラスト (最低限)、*2:サイズの大きなテキスト、*3:達成基準 1.4.11 非テキストのコントラスト、*4:単一のコントロールとして利用者が知覚するもの。テキストボックスやラジオボタンが含まれる 86
  30. 改善例:コントラスト • 訪問済みリンクの色を濃くする*1 diff src/styles/variables.css --color-link: #002e33; - --color-link-visited: #d53f7d;

    + --color-link-visited: #531d46; } *1:スタイルや文言の変更は、本来の業務であれば関係各所に相談のうえで行います。今回は演習なので、我々の判断で自由に行えるものとします 90
  31. 改善例:コントラスト • H2のスタイルを修正する diff src/styles/global.css h2 { flex-wrap: wrap; column-gap:

    0.5em; width: fit-content; - color: var(--color-accent); + color: var(--color-base); 参考:テキスト (及び文字画像) とその背景の間に、少なくとも 3:1 のコントラスト比を確保する 91
  32. 改善例:コントラスト • ラジオボタンのスタイルを修正する diff src/styles/campaign.css @@ -59,7 +59,7 @@ height:

    0.7em; - background-color: var(--color-main); + background-color: var(--color-base); border-radius: 50%; 参考:色の使用とフォーカスの可視化との関係性 92
  33. クイズ:色の使用(回答例) • リンクであることを色だけで伝えている ◦ • 周囲のテキストとの十分なコントラストも無い フォームの必須要素を色だけで伝えている 参考:達成基準 1.4.1 の失敗例

    - 色覚なしで視覚的にはっきりと分からないリンクを作成する、達成基準 1.4.1 の失敗例 - 色の違いだけで、必須又はエラーフィールドを特定している 97
  34. 改善例:色の使用 • リンクに下線をつける diff src/styles/footer.css - a { - diff

    src/styles/service.css display: block; text-decoration: none; padding: 10px 50px 10px 20px; } max-width: 500px; diff src/styles/navigation.css - text-decoration: none; font-size: 3rem; - text-decoration: none; diff src/styles/works.css position: relative; display: block; min-width: 400px; - text-decoration: none; 参考:文字色の違いが情報を伝えるために使用される場合に、利用可能な追加の視覚的な手がかりを確保する 98
  35. 改善例:色の使用 • フォームの必須要素をテキストでも伝えるようにする diff src/index.html <form> - <p>色のついた項目は必須です</p> 氏名:<input name="name"

    /> <label class="tel"> - <span class="required">電話番号:</span> + <span class="required">電話番号(必須):</span> 参考:色のついたフォームコントロールのラベルに対して、テキストによる手がかりを含める 99
  36. 1.4.10 リフロー • 縦スクロールコンテンツ ◦ • 横スクロールコンテンツ ◦ • ⭕画面の幅を320pxにしたとき、横スクロールを必要としないこと

    ⭕画面の高さを256pxにしたとき、縦スクロールを必要としないこと ただし、利用や意味の理解に2次元のレイアウトが必須である一部のコンテンツ を除く。 ◦ 例:複雑な表など 101
  37. 2.5.5、2.5.8 ターゲットのサイズ • ⭕ポインタ入力のターゲットのサイズが44 × 44px以上である(AAA) • ⭕ポインタ入力のターゲットのサイズが24 × 24px以上である(AA)

    • ただし、いくつか例外ケースがある*1 ◦ 同じ機能の大きいボタンがある ◦ インラインである:リンク、文中のボタンなど ◦ ブラウザが提供する機能をそのまま使っている *1:ここに記載した以外にも例外のケースがある。詳しくはWCAGを参照 102
  38. 改善例:リフロー、ターゲットのサイズ • min-widthを削除する • ボタンを大きくする diff src/styles/works.css a { position:

    relative; display: block; - min-width: 400px; diff src/index.html - <button type="button">送信</button> + <button type="button">アンケートを送信</button> diff src/styles/campaign.css button { display: block; width: fit-content; + padding: 1em; 104
  39. コラム:どんな人がキーボードでWebを閲覧する? • ぼく(特に障がいなし) ◦ できるだけキーボードから手を離したくないと思ったとき ◦ うまくポインティングできないとき ▪ 例)ノートPCのトラックパッドの精度が悪い ▪

    例)揺れる乗り物のうえでPCを使っている ▪ 例)腕を怪我している ▪ 例)マウスを使うスペースがない • 障がいによって手、腕の震えがあり、うまくポインティングできない人 • ロービジョンにより、画面上のポインタを見つけたり、目で追ったりするのが困 難な人 106
  40. トレーニング:キーボードでWebページを操作する • フォーカス可能: ◦ 可能:a, button, チェックボックス, ラジオボタン, textareaなど ◦

    不可能:div, span, p, h1など • 次のフォーカス可能な要素にフォーカス:tabまたはoption + tab • 前のフォーカス可能な要素にフォーカス:shift + tabまたはoption + shift + tab • リンクに遷移する:フォーカスを当ててenter • ボタンを押す:フォーカスを当ててspace • チェックボックスを切り替える:フォーカスを当ててspace • ラジオボタンを切り替える:フォーカスを当てて上下左右キー • テキストエリアに入力する:フォーカスを当てて、そのまま文字を入力する • 前 / 次のページに移動:command + 左右キー 107
  41. トレーニング:キーボードでWebページを操作する:演習 • まずGoogleを開きます • ここからキーボードのみで操作します • 課題1:カレーのWikipediaを表示してみてください • 課題2.1:以下のタイトルのページを表示してみてください ◦

    Checkbox Example (Two State) | APG | WAI | W3C • 課題2.2:そのページ内にあるチェックボックスを操作してみてください • 課題3.1:以下のタイトルのページを表示してみてください ◦ • Radio Group Example Using Roving tabindex | APG | WAI | W3C 課題3.2:そのページ内にあるラジオボタンを操作してみてください 108
  42. 改善例:フォーカスの可視化 • 可視性の良いフォーカスインジケータを独自に実装することもできる ◦ デフォルトのインジケータのスタイルは、OSやブラウザによって異なる Chrome (Mac) • Chrome (Ubuntu)

    Firefox (Ubuntu) どのような背景色、コンポーネントに対しても十分なコントラストになるよう に、複数の色を使って実装してみる 参考:コンテンツ制作者が提供する視認性に優れたフォーカスインジケータを使用する、すべてのコンポーネントで十分なコントラスト比を確保するために 2 色のフォーカスインジケータを作成する 113
  43. 改善例:フォーカスの可視化 • 可視性の良いフォーカスインジケータを独自に実装する diff src/styles/global.css + +/* normalize.cssを上書きするためbuttonを個別に指定する */ +*,

    +button[type="button"] { + &:focus-visible { + /* focus-indicator */ + outline: 2px solid var(--color-accent); + outline-offset: 4px; + box-shadow: 0 0 0 8px var(--color-base); + } +} 114
  44. 改善例:キーボード操作 ラジオボタンの現状 • label { input[type="radio"] { display: none; //

    もともとのinputは非表示 &:checked { display: none;してしまうと、キー ボードや支援技術からも見えなくな り、操作できなくなってしまう + span { // チェック時のスタイル } } } span { // ここで独自のスタイルを定義 } } 120
  45. 改善例:キーボード操作 • • 今回やりたいこと:見た目上は隠したいが、支援技術等には引き続き公開したい ◦ これは通称、Visually-Hiddenと呼ばれる ◦ ぱっと見て「visibility: hidden;」と似ているが、混同しないようにする いろいろな実装方法が考えられるが、今回は以下にあるvisually-hiddenスタイル

    をコピペして使う*1 ◦ WCAGが提供するvisually-hiddenスタイルの例 *1:Visually-Hiddenによる実装は理論的には正しいですが、支援技術によっては動作しない場合があるかもしれません。そのため、ターゲットとする技術を使って実際にテストし、動作しない場合は別の実装を行うこともできます。詳しくは「改善例:キーボード操作 (補足)」のスライドを参照してください。 121
  46. 改善例:キーボード操作 diff src/styles/global.css diff src/index.html +.visually-hidden { <div class="radio"> +

    clip-path: inset(100%); + clip: rect(1px, 1px, 1px, 1px); - + height: 1px; value="polite" checked /> + overflow: hidden; + + position: absolute; + type="radio" + white-space: nowrap; + name="advantage" + width: 1px; + value="polite" + class="visually-hidden" + checked +} <label> + <input type="radio" name="advantage" <input /> <span>ヒアリングが丁寧</span> 以降ほかのラジオボタンも同様 *1:Visually Hiddenのスタイルは次を参考にした:https://waic.jp/translations/WCAG21/Techniques/css/C7 122
  47. 改善例:キーボード操作 • フォーカスインジケータも忘れずに diff src/styles/campaign.css input[type="radio"] { - display: none;

    + &:focus-visible { + + span { + &::before { + /* focus-indicator */ + outline: 2px solid var(--color-accent); + outline-offset: 4px; + box-shadow: 0 0 0 8px var(--color-base); + } + + } } 123
  48. 改善例:キーボード操作 • ナビゲーションメニューの開閉ボタンに関しても同じように修正する diff src/styles/navigation.css .nav_open, .nav_close { button {

    - display: none; + &:focus-visible { + + span { + /* focus-indicator */ + outline: 2px solid var(--color-accent); + outline-offset: 4px; + box-shadow: 0 0 0 8px var(--color-base); + + } } 125
  49. 改善例:キーボード操作 • ナビゲーションメニューの開閉ボタンに関しても同じように修正する diff src/index.html <nav class="navigation"> <label class="nav_open"> -

    <button>MENU</button> + <button class="visually-hidden">MENU</button> <span>MENU</span> </label> <div class="container"> <label class="nav_close"> - <button>CLOSE</button> + <button class="visually-hidden">CLOSE</button> <span>CLOSE</span> </label> 126
  50. 改善例:キーボード操作 • Dialog要素を使ってナビゲーションメニューを実装してみる diff src/index.html diff src/scripts/navigation.js - <div class="container">

    navOpenButton.addEventListener("click", () => { + <dialog class="container"> - navContainer.style.display = "block"; + navContainer.showModal(); - </div> }); + </dialog> navCloseButton.addEventListener("click", () => { diff src/styles/navigation.css .container { - navContainer.style.display = "none"; + navContainer.close(); }); position: fixed; top: 0; left: 0; - display: none; 131
  51. コラム:どんな人がスクリーンリーダーでWebを閲覧する? • 盲目(79.5% • ロービジョン・視覚障がい(21.9% • 他にも ◦ 認知障がい・学習障がい(3.2% ◦

    運動機能障がい(2.4% ◦ 難聴(7.3% ▪ 注意:スクリーンリーダーはテキストを点字ディスプレイに送信する機 能も持っている ▪ 例:盲目かつ難聴で、スクリーンリーダー + 点字ディスプレイを使用 参考:https://webaim.org/projects/screenreadersurvey9/#disabilitytypes 141
  52. トレーニング:スクリーンリーダーの操作(VoiceOver) • VoiceOverのオン/オフ:以下のいずれか ◦ command + F5 ◦ command +

    Touch IDを素早く3回 ◦ システム環境設定 > アクセシビリティ > VoiceOver > VoiceOverを有効に するチェックボックス • フォーカスの操作は同じ ◦ • フォーカスを移動すると、そこを読み上げる テキストをマウスで選択すると、そこを読み上げる 146
  53. トレーニング:スクリーンリーダーの操作(VoiceOver) • VOキー:以下のいずれか ◦ CapsLock ◦ control + option •

    次を読み上げ:VO + → • 前を読み上げ:VO + ← • 領域に入る / 出る:VO + shift + ↓ / ↑ 147
  54. トレーニング:スクリーンリーダーの操作(VoiceOver) • 見出しやリンク、ランドマークの一覧を見る:VO + u ◦ さらに、 ▪ 一覧を切り替え:左右キー ▪

    項目を移動:上下キー ▪ 項目を選択:enter ▪ 閉じる:esc • ヘルプ:VO + h • 注意:WebナビゲーションはDOMモードで統一します ◦ デフォルトはDOMです ◦ 切替方法:ヘルプ > コマンドヘルプ > Web > WebナビゲーションのDOM / グ ループを切り替える 148
  55. クイズ:リンクの目的(回答例) • フッターの「こちら」リンク • サービス内のリンクテキストがおかしい ◦ 例:UIデザイン right_arrow 参考:達成基準 2.4.9

    の失敗例 - リンクテキストを具体的なテキストに変更するメカニズムなしで、「ここをクリック」又は「続きを読む」などの不明確なリンクを使用している 152
  56. 改善例:リンクの目的 • フッターの「こちら」リンク diff src/index.html このサイトはアクセシビリティの学習のために作られました。詳しくは - <a href="https://github.com/sititou70/komaru-corp-a11y">こちら</a> +

    <a href="https://github.com/sititou70/komaru-corp-a11y"> + + 当サイトのGitHubリポジトリ </a> を参照してください 参考:リンクの目的を説明したリンクテキストを提供する 153
  57. 改善例:リンクの目的 • サービス内のリンクテキストにalt属性の不適切な値が含まれてしまう問題 • VOのリンク一覧に表示されている文字列は、リンクのアクセシブルネーム ◦ アクセシブルネーム:ユーザーがWebコンテンツの一部を識別するための文 字列 • ある要素のアクセシブルネームは、その子要素から以下の規則で計算される

    ◦ Accessible Name and Description Computation 1.2 • アクセシブルネームをDev Toolsから確認する方法がある • ここでは、子要素である画像のalt属性もアクセシブルネームの計算対象に含ま れ、それが不適切であるためおかしくなっている • 次の改善で同時に修正される 154
  58. 改善例:適切なalt属性 • アンケート結果のグラフ:alt属性がない • VOで読み上げてみると「/graph02.jpg ラベルのない画像」となってしまう。こ れではアンケート結果が利用者に伝わらない • 基本的に、画像にある文字をそのままalt属性に書けば良い diff

    src/index.html - <img src="/assets/graph2.jpg" /> + <img + src="/assets/graph2.jpg" + alt="満足:70% 不満:30%" + /> 参考:達成基準 1.1.1 の失敗例 - img 要素、area 要素、及び type "image" の input 要素の alt 属性又はテキストによる代替を省略している 156
  59. 改善例:適切なalt属性 • サービスのリンク内にあるアイコン画像:alt属性が不適切 ◦ • 「right_arrow」と読み上げられても困る これは純粋な装飾画像なので無視したい ◦ alt=””と書く ◦

    属性自体の省略はできないことに注意 diff src/index.html - <img src="/assets/right_arrow.svg" alt="right_arrow" /> + <img src="/assets/right_arrow.svg" alt="" /> 参考:支援技術が無視すべき画像に対して、img 要素の alt テキストを空にして、title 属性を付与しない 157
  60. 改善例:適切なalt属性 • 制作実績のリンク内の画像:alt属性がない • →画像に含まれるテキストはすでにリンク内に存在するためalt=””とする ◦ もし「alt=”五百年の歴史と共に 駒瑠神社”」としたとすると ◦ リンクテキストは「ホームページ制作

    五百年の歴史と共に 駒瑠神社 五百年 の歴史と共に 駒瑠神社 公式サイト」と冗長になってしまう diff src/index.html <a href="./" class="observe"> <span>ホームページ制作</span> - <img src="./assets/work01.jpg" /> + <img src="./assets/work01.jpg" alt="" /> 五百年の歴史と共に 駒瑠神社 公式サイト </a> 158
  61. クイズ:適切な見出し(回答例) • 「先月のアンケート結果」見出しが一覧に表示されない • 「 注意:お電話のかけ間違いが多くなっております。十分ご注意ください」が見 出しとして表示されてしまう 参考:達成基準 1.3.1 の失敗例

    - コンテンツにおける関係を表さない方法で、構造的なマークアップを使用している、達成基準 1.3.1 の失敗例 - 情報を伝えるために、適切なマークアップ又はテキストを用いずに、テキストの提示の変化を使用している 164
  62. 改善例:適切な見出し • 「先月のアンケート結果」見出し ◦ 見出し要素ではなくspanにスタイルを当てたものだった ◦ したがってVOの見出し一覧に現れなかった diff src/index.html -

    <span class="result">先月のアンケート結果</span> + <h3>先月のアンケート結果</h3> diff src/styles/campaign.css - .result { - font-size: 1.2rem; - font-weight: bold; - } 参考:見出しを特定するために、h1 要素~ h6 要素を使用する 165
  63. 改善例:適切な見出し • 「 注意:お電話のかけ間違いが多くなっております。〜〜」見出し ◦ 文章を強調するためにh3要素を使っていた ◦ strong要素を使うように修正する diff src/index.html

    - <h3> + <strong> 注意:お電話のかけ間違いが多くなっております。十分ご注意ください - </h3> + </strong> 参考:構造をマークアップするために、セマンティックな要素を使用する 166
  64. コラム:見出しの重要性 • How Users Read on the Web の調査によれば、ほとんどの ユーザーはWebページを流し

    読みしている • Screen Reader User Survey #9 Resultsによれば、ユー ザーは見出しによるナビゲー ションをよく使う。これはラ ンドマークやページ内検索よ りも高い割合 グラフの出典:https://webaim.org/projects/screenreadersurvey9/#finding 168
  65. 改善例:適切なラベル • 氏名の入力:可視ラベルとアクセシブルネームが一致していない diff src/index.html - 氏名:<input name="name" /> +

    <label> + <span>氏名:</span> + <input name="name" /> + </label> 参考:アクセシブルな名前 (accessible name) を視覚的なラベルと一致させる 171
  66. 改善例:適切なラベル • 電話番号の入力:それぞれのinputに適切な可視ラベルがない ◦ 直前のテキストが可視ラベルだとすると、tel2とtel3のラベルは「-」という ことになってしまう • テキストボックスを1つにして、続けて入力してもらうようにする diff src/index.html

    diff src/styles/campaign.css - <span class="required">電話番号(必須):</span> - - <input name="tel1" required="required" /> - - - <input name="tel2" required="required" /> - - - <input name="tel3" required="required" /> - + <span class="required"> - + .tel { input { width: 3em; } } 電話番号(必須)(ハイフン・スペース無し、半角数字): + </span> + <input name="tel" required="required" /> 参考:達成基準 3.3.2 の失敗例 - 電話番号のフィールド一式を視覚的にフォーマットしているが、テキストラベルを含んでいない 172
  67. 1.3.5 入力目的の特定 • ⭕適切なautocomplete属性を使用している • これにより ◦ ブラウザは情報を自動入力できるようになる ▪ ◦

    特に、言語や記憶、運動に関して障がいのある人に役立つ 例えば、autocomplete="tel"の要素の前に電話のアイコン「📞」を表示す る支援技術を利用できる ▪ 一部の利用者は、コミュニケーションに画像を使用するのを好む場合が ある 174
  68. 改善例:入力目的の特定 diff src/index.html - <input name="name" /> + <input name="name"

    autocomplete="name" /> - <input name="tel" required="required" /> + <input name="tel" required="required" autocomplete="tel" /> 175
  69. 改善例:アニメーションの抑制 • ヒーローヘッダーの背景動画:停止させるコントロールを作る diff src/index.html <script type="module" src="./scripts/nav.js"></script> + <script

    type="module" src="./scripts/hero.js"></script> + <button type="button" class="stop">STOP</button> </div> </header> diff src/scripts/hero.js +const bgVideo = document.querySelector(".hero .bg"); +const stopButton = document.querySelector(".hero .stop"); + +stopButton.addEventListener("click", () => { + bgVideo.pause(); +}); 178
  70. 改善例:アニメーションの抑制 • ヒーローヘッダーの背景動画:停止させるコントロールを作る diff src/styles/hero.css + button { + position:

    absolute; + right: 10px; + bottom: 10px; + padding: 0.7em 1em; + border: 2px solid var(--color-text); + } 参考:動きのあるコンテンツ、点滅するコンテンツ、又は自動更新するコンテンツを停止させるコントロールを使用する 179
  71. 改善例:アニメーションの抑制 • 制作実績のリンク:スクロールするとアニメーションが実行される • prefers-reduced-motionで抑制できるようにする diff src/styles/works.css diff src/styles/works.css +@media

    (prefers-reduced-motion) { + @keyframes appear { + } +} &.is-displayed { animation: appear 0.5s both ease; } + @media (prefers-reduced-motion) { + + 参考:モーションの防止に CSS reduce-motion クエリを使用する opacity: 1; } 180
  72. Evaluation Tools:自動評価ツール • HTML / CSSバリデータ:基本的な構文等を検査 • Axe(Deque社) ◦ 平均して、WCAG全体の57%の問題点を自動的に発見可能とされる*1

    ◦ 以下のツールで内部的に利用されている ▪ Lighthouse ▪ storybook-addon-a11y ▪ eslint-plugin-jsx-a11y ▪ Accessibility Insights for Web • WAVE(WebAIM Community) • IBM Equal Access Toolkit(IBM社) • Firefox A11yインスペクターのチェック機能(Mozilla社) *1:axe-coreのREADMEより 184
  73. 自動チェックツールだけでは十分でない • 例:alt属性 ◦ ツールは「alt属性が設定されていない」ことを検出できる ◦ しかし、「alt属性にどのような値を設定すればいいか」はわからない ◦ ▪ 装飾画像なら:空文字

    ▪ 文字列を含むなら:その文字列 ▪ etc…… →「その画像がどのような意図を持つか」はコンテンツ制作者にしかわから ない • badブランチをチェックアウトして、自動チェックツールを実行してみましょう ◦ • 今日見てきた問題点はすべて検出されましたか? 自動チェックと手動チェックを組み合わせるのが大事 185
  74. a11yをテストコードでも活用する • 改善前のテストコード:DOMの構造、クラス名、スタイル、name属性に依存 test("ナビゲーションメニューを開ける", async ({ page }) => {

    await page.goto("/"); await page.locator(".nav_open button").dispatchEvent("click"); await expect(page.locator(".navigation .container")).toHaveCSS("display", "block"); }); test("アンケート:氏名は任意要素", async ({ page }) => { await page.goto("/"); const input = page.locator(".campaign form input[name=name]"); await expect(input).not.toHaveAttribute("required"); }); 187
  75. a11yをテストコードでも活用する • 改善後:a11yロールやラベルで、より堅牢なテストが書ける test("ナビゲーションメニューを開ける", async ({ page }) => {

    await page.goto("/"); await page.getByRole("button", { name: /MENU/i }).dispatchEvent("click"); await expect(page.getByRole("dialog", { name: /MENU/i })).toHaveAttribute("open"); }); test("アンケート:氏名は任意要素", async ({ page }) => { await page.goto("/"); const input = page.getByRole("textbox", { name: /氏名/i }); await expect(input).not.toHaveAttribute("required"); }); 188
  76. 新規開発:素直なコードを心がける • Webには、高いアクセシビリティの仕組みが最初から備わっています。 • それを引き出す一番の方法は、基本に忠実なコードを素朴に書くことです。 • 良いHTMLを書きましょう ◦ 例:文書構造を意識する ◦

    例:信頼できるサイトを参考にしてコードを書く ◦ 例:デザインの時点で、Web文書としては表現しづらいものになっているこ ともある。その場合は、デザイナーと協力して解決する • 標準の技術を検討しましょう ◦ 例:ダイアログを実装するとき、自前実装やUIライブラリよりも、標準の Dialog要素が使えないか検討する 192
  77. 新規開発:素直なコードを心がける • シンプルに実装しましょう ◦ 現代におけるWeb技術の表現力はわりと高いですし、日々向上し続けています ◦ それでも、複雑な実装(例:divやspanを多用して、かつaria-xxxを山盛りにし て)をしたくなったら、実装したい機能の方を一度疑ってみましょう • ◦

    例:やりたいことに対して、機能がリッチすぎるかもしれない ◦ 例:システム全体を見直すと、その機能を削除/簡略化できるかもしれない a11yを意識することは、コードやシステムをシンプルに保つための、1つの判断基準に なります。 ◦ UXの向上、工数の削減、可読性や保守性の改善など、a11yの範囲を超えた効果も 期待できる • 作るべきものを、正しい方法で作りましょう 193
  78. まとめ:今日は以下のことを学びました • アクセシビリティの ◦ 定義:access + ability ◦ 重要性 ▪

    アクセスできない / しにくい人を減らすため ▪ SEO対策のため ▪ さまざまなデバイスに対応するため ▪ UX改善のため ▪ etc…… ◦ 基準・ガイドライン:WCAG 2.2 ◦ 改善・検証方法:コードを書いて学んだ 194
  79. The power of the Web is in its universality. Access

    by everyone regardless of disability is an essential aspect. Webの優れている点は、その普遍性にあります。 障がいの有無によらず誰でもアクセスできることが、Webの本質的な側面です。 Tim Berners-Lee, W3C Director and inventor of the World Wide Web →誰でも使えるWebを作っていきましょう! 195
  80. 参考文献 • Web Content Accessibility Guidelines (WCAG) 2.2 • デザイニングWebアクセシビリティ

    - アクセシブルな設計やコンテンツ制作のア プローチ • Form Design Patterns - シンプルでインクルーシブなフォーム制作実践ガイド • ウェブアクセシビリティ導入ガイドブック、デジタル庁 196