Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
アクセシビリティを理解するとフロントエンドのテストが楽になる!
Search
Shota
November 17, 2023
Programming
1
3.9k
アクセシビリティを理解するとフロントエンドのテストが楽になる!
フロントエンドカンファレンス2023 沖縄での登壇資料
https://frontend-conf.okinawa.jp/
Shota
November 17, 2023
Tweet
Share
More Decks by Shota
See All by Shota
フロントエンドのテストからアクセシビリティをしれっと広めていく
nano72mkn
3
950
OpenAI APIを触ってみた
nano72mkn
0
1.2k
年末年始にFlutter入門
nano72mkn
0
260
Other Decks in Programming
See All in Programming
なぜHono×GraphQLを選んだのか?
junichi_fukushima
0
880
「MCPを使ってる人」が より詳しくなるための解説
yamaguchidesu
0
290
RubyKaigi Hack Space in Tokyo & 函館最速 "予習" 会 / RubyKaigi Hack Space in Tokyo & The Fastest Briefing of RubyKaigi 2026 in Hakodate
moznion
1
110
TSConfig Solution Style & subpath imports to switch types on a per-file basis
maminami373
1
160
REST API設計の実践 – ベストプラクティスとその落とし穴
kentaroutakeda
2
230
インターフェース設計のコツとツボ
togishima
2
310
Investigating Multithreaded PostgreSQL
macdice
0
130
2025年のz-index設計を考える
tak_dcxi
13
5.1k
TSConfigからTypeScriptの世界を覗く
planck16
2
1.2k
抽象データ型について学んだ
ryounasso
0
200
AI時代のリアーキテクチャ戦略 / Re-architecture Strategy in the AI Era
dachi023
0
180
TypeScript だけを書いて Tauri でデスクトップアプリを作ろう / Tauri with only TypeScript
tris5572
2
480
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
7
450
Music & Morning Musume
bryan
47
6.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.5k
How STYLIGHT went responsive
nonsquared
100
5.6k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
A designer walks into a library…
pauljervisheath
205
24k
Site-Speed That Sticks
csswizardry
6
570
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
122
52k
Practical Orchestrator
shlominoach
187
11k
Transcript
アクセシビリティを理解すると フロントエンドのテストが楽になる! フロントエンドカンファレンス2023 沖縄 2023/11/18 @nano72mkn
自己紹介 フロントエンドエンジニア スターフェスティバル株式会社 しょうた(なつみかん) @nano72mkn 11/11生まれ 28歳になりました! ポメラニアンを飼っています ゲーム好きです(Apexなど (https://gochikuru.com/)
初登壇で 緊張してます
アジェンダ 03. WAI-ARIAで意味を伝える 05. テストでアクセシビリティを意識してみる 06. おわりに 01. アクセシビリティってなに? 02.
Webアクセシビリティと支援技術
01 アクセシビリティってなに?
access 01. アクセシビリティってなに? 英語で書くと + ability accessibility = 利用 できること
01. アクセシビリティってなに? アクセシビリティは、高齢者や障害者なども含めたあらゆる人が、どのような 環境(うるさい場所や、暗い場所、逆に明るい場所など)においても柔軟に Webサイトを利用できるように構築することを考慮する場合に使われる。 weblioから引用
アクセシビリティとは 誰が何処でとか関係なく 全ての人が利用できることを指している
02 Webアクセシビリティと支援技術
Webアクセシビリティ Webアクセシビリティのガイドラインがあります。 W3Cが発行している、 WCAG(Web Content Accessibility Guideline)
WCAGについて Web Content Accessibility Guidelines (WCAG) 2.0 は、ウェブコンテンツを よりアクセシブルにするための広範囲に及ぶ推奨事項を網羅している。 このガ
イドラインに従うことで、全盲又はロービジョン、ろう又は難聴、学習障害、 認知障害、運動制限、発話困難、光感受性発作及びこれらの組合せ等を含ん だ、様々な障害のある人に対して、コンテンツをアクセシブルにすることがで きる。又、このガイドラインに従うと、多くの場合、ほとんどの利用者にとっ てウェブコンテンツがより使いやすくなる。 WCAGから引用
WCAGには 3段階のレベルが設定されている
レベル A この基準を満たしていなければ 支援技術を使っても アクセスできない場合がある 最低限の基準 ユーザーが支援技術なしでも アクセスできるようになる 望ましい基準 レベル
AA この基準を満たすと よりアクセスしやすくなる ことがある 最高基準 レベル AAA WCAGが設定している3つのレベル
レベル A この基準を満たしていなければ 支援技術を使っても アクセスできない場合がある 最低限の基準 ユーザーが支援技術なしでも アクセスできるようになる 望ましい基準 レベル
AA この基準を満たすとより アクセスしやすくなることが ある 最高基準 レベル AAA WCAGが設定している3つのレベル
レベルAのガイドラインの一部紹介 1.1.1 非テキストコンテンツ 画像にはAlt属性を追加 2.1.1 キーボード マウスで操作できるものはキーボードでも操作できる 2.4.2 ページタイトル titleタグをつけて、利用者が現在位置を把握できる
2.4.4 リンクの目的 (コンテキスト内) aタグ内のテキストはリンクの目的をしっかり書きましょう
対応してどうなるのか
視覚に頼らずにリンクを認識する時 完全に目が見えない状態 視野が狭い 視力が著しく低下している
支援技術を使うことがある 今回はスクリーンリーダー VoiceOver(macOS) VoiceOver(iOS) PC-Talker NVDA ナレーター JAWS TalkBack などなど...
スクリーンリーダーで読み上げてみる VoiceOver(MacOS) ターゲットは このリンク <a href="https://〜" ...> ... <p>参加申し込み</p> ...
</a> コード(styleなどは省略)
スクリーンリーダーで読み上げてみる VoiceOver(MacOS) フォーカスを当てると 「リンク、参加申し込み」 と読み上げられる
なるほどねー 参加申し込みって書いてある リンクがあるのか! スクリーンリーダーで読み上げてみる 視覚に頼らずリンクを認識できる VoiceOver(MacOS)
1.1.1 非テキストコンテンツ 画像にはAlt属性を追加 2.1.1 キーボード マウスで操作できるものはキーボードでも操作できる 2.4.2 ページタイトル titleタグをつけて、利用者が現在位置を把握できる 2.4.4
リンクの目的 (コンテキスト内) aタグ内のテキストはリンクの目的をしっかり書きましょう レベルAの一部紹介
もし、目的をしっかり書いていなかったら 資料請求はこちら フォーカスを当てると「リンク、こちら」と読み上げられる
これが、 Webアクセシビリティ
03 WAI-ARIAで意味を伝える
WAI-ARIAとは W3C によって定められた仕様 HTMLなどでセマンティクス(意味)を補強するための技術
WAI-ARIAの3つの機能 ロール (Role) プロパティ (Property) ステート (State)
WAI-ARIAの3つの機能 ロール (Role) プロパティ (Property) ステート (State)
ロールについて ~AirbnbのカレンダーUIの場合~ Airbnbのカレンダーで見ていきます
tdタグやdivタグなどを 駆使してUIを作っています もちろん、jsで制御しているのでク リックしたときに選択することは可 能です ロールについて ~AirbnbのカレンダーUIの場合~
しかし、 tdタグやdivタグのままでは スクリーンリーダーなどの 支援技術では認識できません ロールについて ~AirbnbのカレンダーUIの場合~
ここで WAI-ARIAのロールを使用
role=”button” ロールについて ~AirbnbのカレンダーUIの場合~ tdタグで指定されているRole属性が WAI-ARIAのロールと呼ばれるもの です 今回はbuttonと指定されているので、 支援技術ではボタンとして認識してくれ ます。 ロール <td
しっかりと「ボタン」として 認識されています ロールについて ~AirbnbのカレンダーUIの場合~ Invalid dateは無視してー! 多分、日付出そうとしてると思う!
これが、 WAI-ARIAのロール
04 テストでアクセシビリティを意識してみる
divボタンのテストを書いてみる <div class=”button” onClick=”handleClick”>ボタン</div> 例えば、GitHub上でもよく見るこのボタンを サンプルにテストを書いてみます
ボタンをテストするぞ!となった時、 このボタンを取得するための要素は下記の2ヶ所になると思います <div class=”button” onClick=”handleClick”>ボタン</div> divボタンのテストを書いてみる <div class=”button” onClick=”handleClick”>ボタン</div> クラスのbutton
ラベルの役割をしているボタン
を使ってボタン要素を取得する場合 divボタンのテストを書いてみる class=”button” document.querySelector(‘.button’) document.querySelectorAll(‘.button’) や 要素を特定するために、 を使用することになります。 ただ、どちらも class=”button”
がついた要素が増えるたびに 取得できる要素や順番が変わるため、テストが壊れ修正することになります。 button-outlineとか ボタンの種類が増えた時も 壊れる!
を使ってボタン要素を取得する場合 divボタンのテストを書いてみる ボタン screen.getByText(‘ボタン’) で取れますが、 ‘ボタン’と書かれたものならなんでもヒットしてしまいます。 その為、「ボタンを押してください」などのテキストを追加すると テストが壊れてしまいます。
では、どうするか
支援技術が読み取ってた 情報使えばいいのでは? スクリーンリーダー
divボタンのテストを書いてみる <div role=”button” class=”button” onClick=”handleClick”>ボタン</div> 本来、この要素はボタンとして認識してもらいたい それなら、ロールを付与するだけ
WAI-ARIAのロールを使った場合 divボタンのテストを書いてみる screen.getByRole(‘button‘, {name: ’ボタン’}) で取れるようになり 全く同じ要素が現れない限りは、テストが壊れてしまうこともありません。
残念ながら、divで作成されたボタンにはtabでフォーカスする対応も、 EnterやSpaceキーで発火する対応もしなくては、アクセシビリティ的にアウト アクセシビリティ的にアウト <div role=”button” class=”button” onClick=”handleClick”>ボタン</div>
レベルAのガイドラインの一部紹介 1.1.1 非テキストコンテンツ 画像にはAlt属性を追加 2.1.1 キーボード マウスで操作できるものはキーボードでも操作できる 2.4.2 ページタイトル titleタグをつけて、利用者が現在位置を把握できる
2.4.4 リンクの目的 (コンテキスト内) aタグ内のテキストはリンクの目的をしっかり書きましょう
buttonタグに差し替えてもOK! <div role=”button” class=”button” onClick=”handleClick”>ボタン</div> <button class=”button” onClick=”handleClick”>ボタン</button> そんなに頑張る必要があるなら 全て対応済みなbuttonタグを使った方が楽なので差し替えてみます
とっても 便 利 !
buttonタグに差し替えてもOK! 差し替えてもbuttonタグにはあらかじめ role=”button” が付与されているので テストはそのままでも通ります
05 おわりに
おわりに アクセシビリティはみんなの為のもの Webアクセシビリティ対応は難しそうに思えるけど、WCAGのレベ ルAの中にはHTMLの基礎レベルの対応でクリアできるものがある Webアクセシビリティの対応をしていくと、壊れにくいテストも書け てお得 ロールは種類が沢山あるので、button以外も使ってみてね
Thank You!
参照 https://developer.mozilla.org/ja/docs/Learn/Accessibility/What_is_accessibility https://waic.jp/translations/UNDERSTANDING-WCAG20/conformance.html#uc- conformance-requirements-head https://waic.jp/files/cheatsheet/waic_jis-x-8341-3_cheatsheet_201812.pdf https://developer.mozilla.org/ja/docs/Learn/Accessibility/WAI-ARIA_basics#wai- aria_%E3%81%AE%E5%B0%8E%E5%85%A5