多様なユーザーニーズに応えるフロントエンドデザインパターン:エッセンス編
by
Rikiya Ihara / magi
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
多様なユーザーニーズに応える フロントエンドデザインパターン 〜エッセンス編〜 伊原 力也 2017.11.22|html5j Webプラットフォーム部 第18回勉強会 1
Slide 2
Slide 2 text
伊原 力也 2 ● freee IA/UX ● HCD-Net 評議委員 / 認定人間中心設計専門家 ● ウェブアクセシビリティ基盤委員会 WG1委員 ● 国際ユニヴァーサルデザイン協議会 移動空間研究部会 副主査
Slide 3
Slide 3 text
https://www.hcdnet.org 3
Slide 4
Slide 4 text
https://waic.jp 4
Slide 5
Slide 5 text
Amazonで「アクセシビリティ」と検索! 5
Slide 6
Slide 6 text
6 Amazonで「インクルーシブHTML」と検索!
Slide 7
Slide 7 text
この本は? 普及しているUIについて、アクセシブルなデザインパターンを提供 ● 「やるな」ではなく「こう実装するとアクセシブル」という話 (とはいえ、これはやってはダメ、という話ももちろんある) ● ブログ記事、ナビゲーション、メニューボタン、 商品リスト、フィルターウィジェット、登録フォームなど 7
Slide 8
Slide 8 text
「〜エッセンス編〜」 8
Slide 9
Slide 9 text
9
Slide 10
Slide 10 text
10 + Accessibility
Slide 11
Slide 11 text
11
Slide 12
Slide 12 text
12
Slide 13
Slide 13 text
今日はフォームの アクセシビリティの話をします 13
Slide 14
Slide 14 text
webをインタラクティブにしているのは リンクとフォームだから 14
Slide 15
Slide 15 text
15
Slide 16
Slide 16 text
フォームといえば ● 入力欄とラベル ● エラー表示 16
Slide 17
Slide 17 text
入力欄とラベル 17
Slide 18
Slide 18 text
入力欄とラベルのポイント 18 1. 入力項目とラベルを明示的に関連付ける 2. 見た目でも入力項目とラベルの対応を明確に 3. 何が起きるか明白なラベルにする 4. プレースホルダをラベル代わりにしない 5. 必須と任意を明示する 6. 入力条件は先に提示する
Slide 19
Slide 19 text
Point 1 入力項目とラベルを明示的に関連付ける メールアドレス ユーザー名 パスワード 登録する 19
Slide 20
Slide 20 text
Point 1 入力項目とラベルを明示的に関連付ける メールアドレス ユーザー名 パスワード 登録する 20
Slide 21
Slide 21 text
明示的に関連付けると この例では、スクリーンリーダーユーザーが パスワードフィールドにフォーカスを合わせると、 「パスワード エディット、保護つき」などと読み上げられます。 21
Slide 22
Slide 22 text
明示的に関連づけるべき理由 スクリーンリーダーユーザーがどのように フォーム内を移動するかを理解する必要があります。 散文的なコンテンツでは、ユーザーは下矢印キーを使って 要素間を順に移動しますが、フォームでは異なり、 あるフィールドから次のフィールドへ直接移動する操作が行われます。 このとき、ラベル要素は飛び越されてしまいます。 ラベル要素とインタラクティブ要素が明示的に関連づけられていない場合、 そのラベル要素は見逃されてしまうのです。 22
Slide 23
Slide 23 text
Point 2 見た目でも入力項目とラベルの対応を明確に 23
Slide 24
Slide 24 text
Point 2 見た目でも入力項目とラベルの対応を明確に 24
Slide 25
Slide 25 text
labelの応用例 25
Slide 26
Slide 26 text
択一選択なのでラジオボタン+labelに 新着順 26
Slide 27
Slide 27 text
隣接セレクタでlabelにスタイルを付ける [type="radio"] + label { cursor: pointer; /* その他、基本のスタイル */ } [type="radio"]:focus + label { /* フォーカス時のスタイル */ } [type="radio"]:checked + label { /* 選択時のスタイル */ } 27
Slide 28
Slide 28 text
ラジオボタンを力強く隠す .sorter [type="radio"] { position: absolute !important; width: 1px !important; height: 1px !important; padding:0 !important; border:0 !important; overflow: hidden !important; clip: rect(1px, 1px, 1px, 1px); } 28
Slide 29
Slide 29 text
Point 3 何が起きるか明白なラベルにする 29
Slide 30
Slide 30 text
Point 3 何が起きるか明白なラベルにする 30
Slide 31
Slide 31 text
Point 3 何が起きるか明白なラベルにする 31
Slide 32
Slide 32 text
Point 4 プレースホルダをラベル代わりにしない 32
Slide 33
Slide 33 text
スペース節約とひきかえにユーザビリティが犠牲に 33
Slide 34
Slide 34 text
代用すると何が起きるのか 34 ● 文字を打ち始めた瞬間にラベルが消えてしまうため 何の項目か覚えておかねばならず認知負荷が高まる ● placeholderをサポートしないスクリーンリーダーや ブラウザだと情報が失われて意味不明になる ● ブラウザのオートコンプリート機能で複数のフィールドが 一気に埋められた際、適切に入ったか確認できない
Slide 35
Slide 35 text
35 http://bradfrost.com/blog/post/float-label-pattern/
Slide 36
Slide 36 text
本当にplaceholderである場合でも、文字色には注意 36
Slide 37
Slide 37 text
文字色を濃くしつつ、スタイルを変える ::placeholder { color: #000; font-style: italic; } ::-webkit-input-placeholder { color: #000; font-style: italic; } ::-moz-placeholder { color: #000; font-style: italic; } ::-ms-input-placeholder { color: #000; font-style: italic; } 37
Slide 38
Slide 38 text
Point 5 必須と任意を明示する 38
Slide 39
Slide 39 text
Point 5 必須と任意を明示する 39
Slide 40
Slide 40 text
ありがちな対応 メールアドレス
*
40
Slide 41
Slide 41 text
より正確を期するなら メールアドレス
*
41
Slide 42
Slide 42 text
required属性というのもあるが… 望ましくない挙動になることもあります。 初期状態で空になっている必須フィールドをエラーとして扱ってしまう、 といった動作です。今回の用途としては、これはやや冗長で、 アグレッシブすぎます。 42
Slide 43
Slide 43 text
43 Point 6 入力条件は先に提示する
Slide 44
Slide 44 text
Point 6 入力条件は先に提示する 44
Slide 45
Slide 45 text
ツールチップ的に出すやりかたも 45
Slide 46
Slide 46 text
スクリーンリーダーも読み上げる 46
Slide 47
Slide 47 text
47 ログインフォーム
ユーザー名
ユーザー名には、あなたの Eメールアドレス を登録してください
パスワード
メールでお送りしたパスワードを入れてくださ い
サイトに入る
Slide 48
Slide 48 text
[role="tooltip"] { background: orange; color: white; padding: 0.25em; display: none; } input:focus + [role="tooltip"] { display: block; } 48 フォーカス時にツールチップを出すCSS
Slide 49
Slide 49 text
49 そうそう、もう1点
Slide 50
Slide 50 text
50 http://www.outlinenone.com/
Slide 51
Slide 51 text
入力欄とラベルのポイント:おさらい 51 1. 入力項目とラベルを明示的に関連付ける 2. 見た目でも入力項目とラベルの対応を明確に 3. 何が起きるか明白なラベルにする 4. プレースホルダをラベル代わりにしない 5. 必須と任意を明示する 6. 入力条件は先に提示する 7. フォーカスインジケーターは消さない
Slide 52
Slide 52 text
エラー表示 52
Slide 53
Slide 53 text
エラー表示のポイント 53 1. エラーはフォーム内に出す 2. エラー状態が伝わるようにする 3. エラー箇所を明確にする 4. エラーの修正を助けるメッセージを出す 5. リアルタイム検証は慎重に使う
Slide 54
Slide 54 text
54 Point 1 エラーはフォーム内に出す
Slide 55
Slide 55 text
Point 2 エラー状態が伝わるようにする 55
Slide 56
Slide 56 text
Point 2 エラー状態が伝わるようにする 56 登録する
Slide 57
Slide 57 text
送信を止め、送信ボタンの上にエラーを出す例 57
登録する #error:empty {display: none;} var form = document.getElementById('register'); form.addEventListener('submit', function(event) { if (errors) { event.preventDefault(); // 送信させない document.getElementById('error').textContent = '登録情報が正しいことを 確認してください。' } });
Slide 58
Slide 58 text
アイコン画像とaria-labelでエラーをより明白に 58
登録情報が正しいことを確認してください。
Slide 59
Slide 59 text
ライブリージョンの良いところ ライブリージョンでエラーの存在を宣言することのメリットは、 ユーザーに移動してもらわなくてもエラー情報に注意を促せる点です。 エラーになっている入力欄にフォーカスを移すことで、 フォームエラーをユーザーに警告するという方法もよく見られます。 しかし、このお節介とも言える唐突なアプリケーション内での位置移動は、 ユーザーを混乱させる恐れがあります。 59
Slide 60
Slide 60 text
ありがちな「勝手にフォーカス移動」に注意 60
Slide 61
Slide 61 text
ありがちな「勝手にフォーカス移動」に注意 61
Slide 62
Slide 62 text
Point 3 エラー箇所を明確にする 62
Slide 63
Slide 63 text
Point 4 エラーの修正を助けるメッセージを出す 63
Slide 64
Slide 64 text
Point 3 Point 4 改善案 64
Slide 65
Slide 65 text
invalidを伝え、説明文を紐付ける/アイコンを出す 65 パスワード
パスワードは6文字以上にしてください。
[aria-invalid="true"] { border-color: red; background: url('images/warning-icon.svg') center right; }
Slide 66
Slide 66 text
実際の例 66
Slide 67
Slide 67 text
Point 5 リアルタイム検証は慎重に使う しゃれたフォーム検証スクリプトの中には、テキストを入力している時に リアルタイムでフィードバックを提供し、入力している内容が有効かどうか、 入力している最中に知らせてくれるものもあります。 しかし、こうしたスクリプトは管理が非常に難しくなることがあります。 特定の文字数が必要なエントリーでは、最初の何回かの キーストロークの間は常に無効なエントリーと見なされてしまうからです。 67
Slide 68
Slide 68 text
問題なし:入力中に残りの入力可能文字数を示す 68
Slide 69
Slide 69 text
問題あり:入力中にメールアドレス妥当性チェック 69
Slide 70
Slide 70 text
80年代のリミックスモード ライブリージョンのエラーメッセージが 繰り返し更新される実装になっている場合、スクリーンリーダーは 80年代のリミックスモードに入ります。 「パ、パス、パ、パスワード、パスワードは6文字以上にしてください」 などと読み上げられることになります。 70
Slide 71
Slide 71 text
対応案 71 1. キーストロークがあいたら発動するよう制御する ○ 打ち込むたびに検証するとライブリージョンが都度読まれてしまう 2. そもそもリアルタイム検証が必要か再考する ○ onblur時に再検証してaria-invalidの値を変えれば十分では? 3. 必要な場合でも送信時エラー後にリアルタイム検証を発動させる ○ 初期入力時からリアルタイム検証する必要は薄いのでは?
Slide 72
Slide 72 text
エラー表示のポイント:おさらい 72 1. エラーはフォーム内に出す 2. エラー状態が伝わるようにする 3. エラー箇所を明確にする 4. エラーの修正を助けるメッセージを出す 5. リアルタイム検証は慎重に使う
Slide 73
Slide 73 text
フォームがアクセシブルになると 多くの人のユーザビリティも向上する 73
Slide 74
Slide 74 text
webをインタラクティブに 使える人が増える 74
Slide 75
Slide 75 text
ということで 75
Slide 76
Slide 76 text
Amazonで「アクセシビリティ」と検索! 76
Slide 77
Slide 77 text
77 Amazonで「インクルーシブHTML」と検索!
Slide 78
Slide 78 text
Amazonで「インクルーシブHTML」と検索! 78
Slide 79
Slide 79 text
今日からあなたも インクルーシブデザイナー! 79
Slide 80
Slide 80 text
80 エンジニア・UXデザイナー積極採用中!
Slide 81
Slide 81 text
ありがとうございました @magi1125 81