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
4.2k
アクセシビリティを理解するとフロントエンドのテストが楽になる!
フロントエンドカンファレンス2023 沖縄での登壇資料
https://frontend-conf.okinawa.jp/
Shota
November 17, 2023
Tweet
Share
More Decks by Shota
See All by Shota
おじいちゃんに優しいUIをつくってみた
nano72mkn
2
1.8k
フロントエンドのテストからアクセシビリティをしれっと広めていく
nano72mkn
3
1.1k
OpenAI APIを触ってみた
nano72mkn
0
1.3k
年末年始にFlutter入門
nano72mkn
0
320
Other Decks in Programming
See All in Programming
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
350
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
620
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
2.1k
生成AIを利用するだけでなく、投資できる組織へ
pospome
2
440
生成AI時代を勝ち抜くエンジニア組織マネジメント
coconala_engineer
0
39k
Python札幌 LT資料
t3tra
7
1.1k
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
3
670
ゆくKotlin くるRust
exoego
1
200
これならできる!個人開発のすゝめ
tinykitten
PRO
0
150
Graviton と Nitro と私
maroon1st
0
160
CSC307 Lecture 02
javiergs
PRO
1
760
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
PRO
0
180
Featured
See All Featured
Docker and Python
trallard
47
3.7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.2k
Crafting Experiences
bethany
0
27
RailsConf 2023
tenderlove
30
1.3k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
0
420
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.9k
Building an army of robots
kneath
306
46k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
61
48k
How Software Deployment tools have changed in the past 20 years
geshan
0
31k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
A designer walks into a library…
pauljervisheath
210
24k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
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