A presentation at DIST.30 in in Tokyo, Japan by Yuko Morikawa
トゥーアールの森川です。
私はWebの持つ無限の可能性に惹かれて、この業界で働いています。
ウェブアクセシビリティとは、誰もがどんな状況でもウェブにアクセスできるようにすること。これを知ったとき、私はウェブのアクセシビリティの高さに惹かれたんだと思いました。
「ウェブのパワーはそのユニバーサル性にある。障害に関わらず誰もがアクセスできることがその本質である」
World Wide Webを発明したティム・バーナーズ・リー氏の有名な言葉です。
ウェブの本質であるアクセシビリティを守っていくのは私たちの役⽬です。
これが私がアクセシビリティをやる理由の1つです。
今日はCSSでアクセシビリティを高めていくためのTipsを4つご紹介したいと思います。
まずはじめに :focus { outline: none; }
でフォーカス時のスタイルを消さないでくださいというものです。
マウスユーザーはマウスカーソルで自分の位置を確認できますが、キーボードユーザーはフォーカス時のスタイルによって自分の位置を確認します。
マウスカーソルが消えると混乱するのと同様に、フォーカスインジケータが消えるとキーボードユーザーは混乱します。
⼿に障害があり、⼝に棒を咥えてキーボードを操作している⼈もいます。
マウスがない環境の⼈ももちろんいます。キーボードだけでも操作できるよう確認してみましょう。
次はポインティングターゲットサイズを広げてアクセシビリティを高めていきましょう。
指が太い人は小さなエリアをタップしにくかったり、病気などで常に手が震えていて、ターゲットサイズが小さいとうまくタップできない方もいます。
W3Cが策定しているアクセシビリティのガイドライン:WCAGには、最低でも44 × 44 CSSピクセル相当のターゲットサイズが必要とされています。
出典:Web Content Accessibility Guidelines (WCAG) 2.1 達成基準 2.5.5 ターゲットのサイズ
余白を含めたり、関連するテキストを含めたりしてターゲットサイズを拡大します。
スタイルの都合上、視覚的なターゲットサイズを広げることが難しい場合には疑似要素を使って拡大することもできます。
続いてコンテンツの順序を通してアクセシビリティを高めます。
よくあるUIですね。商品の画像があって、見出しとなる商品名があって、さらに説明文、商品の内容、購入ボタンと続きます。
それぞれimg要素や見出し要素を使ってマークアップしていきます。
画像のalt属性値もコンテンツとして捉えると、意味のある順序はこのようになるのではないかと思います。
全体を覆うsectionにsale-itemのclassをつけました。
flexboxを使って縦方向に要素を並べ、画像部分には order: -1;
を指定すると、視覚的な順序はアイキャッチとなる画像が1番上に表示されます。
私たち晴眼者もウェブページの隅から隅まで読むことは少ないと思います。これはスクリーンリーダーを使っている視覚障害者も同じです。スクリーンリーダーの⾒出しジャンプという機能を使っていると、⾒出し要素より上の要素は⾒落としてしまったり、前の⾒出しの最下部の要素として間違えて捉えられるかもしれません。
最後にフォームのアクセシビリティについて見ていきましょう。
このようなUIがあったときにどのようにマークアップするでしょうか?
グレーのテキストをplaceholderとしてマークアップするのはアクセシビリティ的によくありません。
⼊⼒を始めるとplaceholderは消えてしまうし、autocomplete機能によってそもそもplaceholderが全く⾒られない可能性すらあります。
スクリーンリーダーなどの⽀援技術の多くは、placeholderをラベルとして扱わなかったり、placeholder属性自体が、⽀援技術全体で広くサポートされていない問題もあります。
Floating labelsと呼ばれる手法があります。一見同じに見えますが、
フォーカスしたり、入力後は表示が変わります。
特定の条件下ではJavaScriptを使わず、CSSのみでも実装が可能です。IE11でも動きます。
Demo: Floating labels
Floating labelsを使うとplaceholderと同じビジュアルデザインでもアクセシビリティを⾼めることができます。ただし万能ではなく、気をつけなければいけない点もあります。
詳しくはFloating labels are problematicという記事に詳しく書かれているので是非読んでみてください。
やっぱり普通にラベルとして表示して、マークアップするのが1番アクセシブルです😊
最後にもう一度、ウェブの本質であるアクセシビリティを守っていくのは私たちの役⽬です。
近年、ウェブ制作者の間でも関心が高まるアクセシビリティ。海外ではアクセシブルでないコンテンツに対する苦情や訴訟なども少なくありません。ウェブアクセシビリティを高める方法はWAI-ARIAだけではありません。スタイルのために適切なマークアップを諦めていませんか?このライトニングトークでは、適切なマークアップとCSSでアクセシビリティを高める方法をお伝えします。
The following code examples from the presentation can be tried out live.
Here’s what was said about this presentation on social media.
🎤後半2つ目のLTは、
— DIST (@dist_jp) December 13, 2019
株式会社トゥーアール フロントエンドエンジニア 森川 結子さんによる
「アクセシビリティを高めるCSS」です!#dist30
LT:アクセシビリティを高めるCSS #dist30
— kouki kurihara (@kk55525) December 13, 2019
もりかわさん #dist30
— 腹筋ローラーの力を信じろ (@8845musign) December 13, 2019
CSSとアクセシビリティの話
— すぱいす (@rabspice) December 13, 2019
#dist30
アクセシビリティ。ウェブの無限の可能性…リーナさんみたいだな🥰 #dist30
— 佐藤あゆみ@忙中閑あり (@PentaPROgram) December 13, 2019
ティム・バーナーズ・リー定期 #dist30
— おおやまみちのく (@yamanoku) December 13, 2019
— 布団とエンジニア (@arktds) December 13, 2019
ティムの言葉は100万回聞いたし、これからも1000万回聞くべき #dist30
— くりむ🌥️ (@klim0303) December 13, 2019
focus消しちゃダメ!
— いしまる爆走中 (@tsugu_maru_san) December 13, 2019
#dist30
フォーカス時のスタイルを消すのはダメ絶対!
— えび🍤@札幌XD (@pino_ebiebi) December 13, 2019
#dist30
:focus { outline: none } しがち...ダメ絶対 #dist30
— Yusuke Nakaya (@s14garnet) December 13, 2019
キーボードユーザーに対してのアクセシビリティが下がる
— kouki kurihara (@kk55525) December 13, 2019
#dist30
キーボードで操作しているユーザーにとって outline を消すのは NG #dist30
— OYA takashi (@tscp) December 13, 2019
棒を咥えてキーボードを操作する人: パソコンのいろいろな使い方https://t.co/9gNxPcZXe2 #dist30 #a11y
— もりかわ💫伊原ジュニア (@talocohc_rion) December 13, 2019
最低でも44×44のサイズが必要
— いしまる爆走中 (@tsugu_maru_san) December 13, 2019
・余白を含める
・擬似要素を付ける
とかして拡大するとよい
#dist30
ポインティングターゲットサイズの最適化 https://t.co/tIYOhsmXs9 #dist30 #a11y
— もりかわ💫伊原ジュニア (@talocohc_rion) December 13, 2019
擬似要素を使ってクリッカブルエリアを広げるの便利ですよね。mix-blend-mode と組み合わせるとこんな表現もできます。#dist30 /https://t.co/xF6U1kr5nl
— 越智🍶1/1in正月 (@otiext) December 13, 2019
そか。orderは負の値使えるんだった。 #dist30
— にゃんこ@マークアップの人(咳ゲフ) (@ake_nyanko) December 13, 2019
order、マイナス値入れればよかったのか #dist30
— くりむ🌥️ (@klim0303) December 13, 2019
flexで順序変えるのはよくやる #dist30
— くろさき (@seahorse_saki) December 13, 2019
CSSで読み上げ順(?)を制御できるとは。#dist30 pic.twitter.com/t1ALT1ytal
— 池田 泰延(勉強会用) (@clockmaker_bot) December 13, 2019
あ、面倒なので目をつぶりがちな(笑)コーダーの頑張りどころ。flexboxで見出しと要素の適切な順序立てを実現する。 #dist30
— 佐藤あゆみ@忙中閑あり (@PentaPROgram) December 13, 2019
これはやる時もあるけど、内心『誰にも評価されないのに面倒なことしてる』と思ってた。やっぱりちゃんとやろう。
— 佐藤あゆみ@忙中閑あり (@PentaPROgram) December 13, 2019
htmlには意味の順序で並べて、flexbox orderで視覚的な順序を並べてあげると視覚障害者にとってもアクセシビリティの高いwebページが作れる #dist30
— じゃれみー (@Dhj_NF) December 13, 2019
placeholderではなく
— kouki kurihara (@kk55525) December 13, 2019
Floating labelを使う
#dist30
Floating labelか
— すぱいす (@rabspice) December 13, 2019
#dist30
Floating LabelはMaterial Designで初めて見た #dist30
— おおやまみちのく (@yamanoku) December 13, 2019
flating labelで入力後の表示が変わる
— いしまる爆走中 (@tsugu_maru_san) December 13, 2019
(プレースホルダーも消えない)
#dist30
ただし万能ではない #dist30
— kouki kurihara (@kk55525) December 13, 2019
https://t.co/Ts6wXnZPod #dist30
— おおやまみちのく (@yamanoku) December 13, 2019
ラベルとしてinputの外に出すのがベター #dist30
— kouki kurihara (@kk55525) December 13, 2019
ラベルは普通に外においとくのが一番#dist30
— 腹筋ローラーの力を信じろ (@8845musign) December 13, 2019
デザイナーの方へ:アクセシブルなフォームの例 https://t.co/Uw9N1eiEsi #dist30 #a11y
— もりかわ💫伊原ジュニア (@talocohc_rion) December 13, 2019
✅ ラベルを明記する(プレースホルダをラベル代わりにしない)
— mjmj🐖 (@mjmjsachi) December 13, 2019
✅ ラジオボタンやチェックボックスはテキスト部分でも操作できるようにする
✅ フォーカス表示を消さない
✅ ボタンは十分な大きさを確保する
✅ エラーメッセージは修正が必要な項目の近くに具体的に出す https://t.co/9qHOd95o1s
アクセシブルなフォームについての書籍がもうすぐ発売されます✨
— もりかわ💫伊原ジュニア (@talocohc_rion) December 13, 2019
Form Design Patterns ―シンプルでインクルーシブなフォーム制作実践ガイドhttps://t.co/P7Tteo7xzx #dist30 #a11y
先ほど発表した「アクセシビリティを高めるCSS」のスライドです😊
— もりかわ💫伊原ジュニア (@talocohc_rion) December 13, 2019
Slide:https://t.co/flOutrdhqu
Talk:https://t.co/cb7VxYdyMn#dist30
a11y.cssってのもあるよ(使ったことないけどhttps://t.co/l1fTz1uihe#dist30
— まぼろしの小林です (@koba) December 13, 2019
アクセシビリティのCSSLintもあるよhttps://t.co/c8epyWA0FB #dist30
— おおやまみちのく (@yamanoku) December 13, 2019
アクセシビリティどこまでやるのか、誰がそのコスト持つのかっていう議論によくなるんですが、ビジネスとアクセシビリティって相性よくないのか、最近の悩み #dist30
— かなとーさん / きゅん (@kanato_mercurio) December 13, 2019
アクセシビリティについて深く考えながらコーディングしたことなかったからすごく参考になる#dist30
— おもち (@omochi_mochi820) December 13, 2019