1 of 87

多様なユーザーニーズに応える�フロントエンドデザインパターン�〜ベーシック編〜

書籍「インクルーシブHTML+CSS & JavaScript」より

伊原 力也 / 太田 良典

2017.11.04

CSS Nite LP54「Coder's High 2017」

1

2 of 87

自己紹介

太田 良典

HTML4.01のW3C仕様書を翻訳した「HTML4仕様書邦訳計画補完委員会」の委員を務めた後、2001年にBAに参加。Web技術の分野で幅広い専門性を持ち、セキュリティ分野においては「第二回IPA賞(情報セキュリティ部門)」を受賞。アクセシビリティ分野では、ウェブアクセシビリティ基盤委員会(WAIC)の委員として活動している。

伊原 力也

freee株式会社 IA/UX。アクセシブルなインタラクションデザインの実践を標榜し、Webサービスやスマートフォンアプリの設計業務に従事。ウェブアクセシビリティ基盤委員会(WAIC)理解と普及作業部会委員としても活動。HCD-Net認定 人間中心設計専門家および評議委員。クリエイティブユニットmokuva所属。

2

3 of 87

3

4 of 87

4

Amazonで「アクセシビリティ」と検索!

5 of 87

5

6 of 87

このセッションの流れ

  • インクルーシブ・デザインパターン
  • ボタン vs ボタン
  • ナビゲーション
  • ブログ記事
  • まとめ

6

7 of 87

インクルーシブ・デザインパターン

7

8 of 87

原著名: インクルーシブ・デザインパターン

Inclusive Design PatternsCoding Accessibility Into Web Design

8

9 of 87

インクルーシブとは?

Inclusive

  • 「包括的」「全てを含む」など
  • exclusive (排他的) の反対語

ここでは、「誰でも受け入れる」�「特定の人を除外しない」のような意味

= どんな人、どんな環境でもアクセスできる�「アクセシビリティ」とほぼ同義

9

10 of 87

アクセシビリティ系の記事のよくあるパターン

  • いろいろダメと言われる
  • 特にJS系の処理がダメと言われる
  • 結論が「やるな」「避けろ」になってしまうことが多い
    • 一般に普及しているUIを、ただ「ダメ」と言われても困る
    • 結局、指摘を無視してやってしまうことになることが多い

10

11 of 87

この本は?

普及しているUIについて、アクセシブルなデザインパターンを提供

  • 「やるな」ではなく、「こう実装するとアクセシブル」という話�(とはいえ、これはやってはダメ、という話ももちろんある)
  • ブログ記事、ナビゲーション、メニューボタン、�商品リスト、フィルターウィジェット、登録フォームなど
  • 今日は「ボタン」「ナビゲーション」「ブログ記事」の一部を紹介

11

12 of 87

ボタン vs ボタン

12

13 of 87

インクルーシブなボタン

インタラクティブ要素である「スタート」と書かれたボタンを、�3種類のデザイナーの視点で見てみます。

Webというメディアに対する少しの知識が、よりシンプルかつ�インクルーシブな解決策を導き出すことに注目してください。

13

14 of 87

3種類のデザイナー

  • グラフィックデザイナー
    • ビジュアルデザインの専門家、実装はできない
  • コードを書くデザイナー
    • ビジュアルデザインがメインだが、ある程度実装もできる
  • インクルーシブデザイナー

14

15 of 87

みなさんなら、どのように実装しますか?

15

16 of 87

グラフィックデザイナー

彼らにとってボタンは視覚的な成果物であり、�Adobe IllustratorやSketchで作るものです。�本物のボタンのように見えるか、�全体のブランディングにフィットしているかを常に考えています。�そのボタンをどうやってWebページに実装するか、�どうやって動作させるかはまったく考えていません

16

17 of 87

グラフィックデザイナーの「スタート」ボタン

17

18 of 87

コードを書くデザイナー

2番目にとりあげるデザイナーは、�最初のデザイナーとほとんど同じスキルをもっていますが、�ひとつ大きな違いがあります。

彼らは、Webページ内にボタンを表示し、�JavaScriptのイベントリスナーを指定できるだけの�HTML、CSS、JavaScriptの知識を持っています。

18

19 of 87

コードを書くデザイナーの「スタート」ボタン

<div class="button"></div>

.button {� width: 200px;� height: 70px;� background: url('../images/button.png');�}

button.addEventListener('click', function() {� // クリックでイベント発火�});

19

20 of 87

インクルーシブデザイナー

インクルーシブデザイナーは、�コードを書くデザイナーのボタンを、�潜在ユーザーを想定したさまざまな観点から検討します。�そうすると、この実装の問題点が次々と見えてきます。

20

21 of 87

コードを書くデザイナーのボタンにはこんな問題が

  • ズームすると画像がボヤける
  • ブラウザの設定で文字サイズを大きくしても文字が拡大しない
  • 背景画像が表示されないことがある
  • キーボードで操作できない
  • スクリーンリーダーにボタンであると伝わらない
  • ラベルが画像なので機械翻訳できない

21

22 of 87

22

23 of 87

インクルーシブデザイナーの「スタート」ボタン

<button>スタート</button>

23

24 of 87

24

25 of 87

「賛成」ボタンをどう修正する?

25

26 of 87

「コードを書くデザイナー」によるマークアップ

<div class="upvote" data-action="upvote"></div>

26

27 of 87

アクセシビリティチェックで登録されたチケット

27

28 of 87

1.1.1「非テキストコンテンツ」に対応

<div class="upvote" data-action="upvote" aria-label="賛成!"></div>

28

29 of 87

2.1.1「キーボード」に対応

<div class="upvote" data-action="upvote" aria-label="賛成!"� tabindex="0"></div>

29

30 of 87

4.1.2「名前(name)・役割(role)及び値(value)」に対応

<div class="upvote" data-action="upvote" aria-label="賛成!"� tabindex="0" role="button"></div>

30

31 of 87

31

32 of 87

賛成ボタンもbutton要素で

<button data-action="upvote" aria-label="賛成!"></button>

32

33 of 87

画像を背景から前景に変更

<button data-action="upvote">� <svg aria-label="賛成!"><use xlink:href="#upvote"></use></svg>�</button>

33

34 of 87

よくあるメニューボタンの実装

34

35 of 87

ボタンらしい見た目 + ラベルがおすすめ

35

36 of 87

アイコンの実装方法あれこれ

  • 背景画像
  • 前景画像
  • アイコンフォントのグリフ
  • Unicode
  • SVGスプライト

36

37 of 87

背景画像で実装した場合の問題点

Windowsでハイコントラストモードに切り替えると�背景画像は表示されなくなります

「メニュー」というテキストも提供していれば、�ぶち壊しにはなりません�(ハイコントラストモードにしたとき、背景色とともに� テキストの色も反転するため、引き続き読めるのです)。

37

38 of 87

前景画像にするとどうか?

38

ハイコントラストモードの黒背景では、�アイコンは白枠で囲まれて異なる見え方になるうえに、�「メニュー」というテキストとも分離して見えます。

39 of 87

アイコンフォントによる実装

最近よく見られるが、いくつか問題がある

  • Webページのフォントをユーザーが独自に変更している場合
  • アイコンフォントの読み込みに失敗した場合

39

豆腐

40 of 87

Unicode標準の記号を使う

40

U+2630 'TRIGRAM FOR HEAVEN'�(「八卦」の「天」)

41 of 87

U+2630(☰)を使った実装の問題

  • すべてのデバイスがサポートしているわけではなく、�表示できない可能性がある
  • スクリーンリーダーがこの記号を�「トリグラムフォーヘブン」と読み上げることがある

41

42 of 87

読み上げられないようにする

<button>� <span aria-hidden="true">☰</span>� メニュー�</button>

42

43 of 87

SVGスプライト

SVGスプライトは、急速にアイコン表示の�事実上標準の解決策となりつつあります�――それには正当な理由があります。

Googleによる305バイトのロゴ実装が証明したように、�アセットを非常に小さくできます。劣化せずに拡大縮小でき、�フォントカラーの変更に合わせて色を変えることもできます。

43

44 of 87

SVGスプライトの準備

<svg style="display: none;">� <symbol id="navicon" viewBox="0 0 20 20">� <path � d="m0-0v4h20v-4h-20zm0 8v4h20v-4h-20zm0 8v4h20v-4h-20z"

fill="currentColor" />

</symbol>� <!-- 他にも<symbol>要素がたくさん -->

</svg>

44

45 of 87

SVGスプライトの使用

<button>� <svg><use xlink:href="#navicon"></use></svg>� メニュー�</button>

button svg {� width: 1em;� height: 1em;�}

45

46 of 87

アイコン単体で使いたいときは?

前述したとおり、ボタンに「メニュー」というテキストを含める�ことには認知面のメリットがあります。�また、何らかの理由でアイコンが表示されなかった場合でも、�<button>のわかりやすさが保たれます。

それでもやはり、アイコン単体で使いたい場合もあるでしょう。�その場合は、スクリーンリーダーユーザーにも�確実に「メニューボタン」と伝わるようにすることが重要です。

46

47 of 87

SVGに加えて非表示の<span>でラベルを追加

<button>� <svg><use xlink:href="#navicon"></use></svg>� <span class="visually-hidden">メニュー</span>�</button>

47

48 of 87

ボタン全体にaria-label属性でラベルを追加

<button aria-label="メニュー">� <svg><use xlink:href="#navicon"></use></svg>�</button>

48

49 of 87

記号文字のボタンにaria-labelでラベルを追加

<button aria-label="メニュー">� ☰�</button>

49

50 of 87

開閉するメニューを実装して完成

<nav aria-label="サイト">� <button aria-expanded="false">� <svg><use xlink:href="#navicon"></use></svg>� メニュー� </button>� <ul hidden>� <li><a href="#main">ホーム</a></li>� <li><a href="/about">企業情報</a></li>� <li><a href="/products">製品情報</a></li>� <li><a href="/contact">お問い合わせ</a></li>� <li><a href="/login">ログイン</a></li>� </ul>�</nav>

50

51 of 87

開閉メニュー実装時のポイント

  • JavaScriptで<ul>にhidden属性を追加して非表示にする�→hiddenで隠せば、閉じているとき中身にフォーカスが当たらなくなる
  • <button>は<nav>要素のに配置する�→外に置くと、ランドマークに飛んだとき中身が空になってしまう
  • <button>のすぐ後にメニューを配置する�→ボタンの次にメニューの最初の項目にフォーカスが当たる
    • すぐ後にメニューを置けないことも……?

51

52 of 87

ボタンのまとめ

  • 原則として、ボタンは<button>で実装する
    • <button>警察 (Tシャツの人)を思い出しましょう
  • メニューボタンにはラベルを付けるのがおすすめ
    • アイコンのみの実装もアリだが、スクリーンリーダーにも伝わるように
  • アイコンの実装方法はいろいろある
    • 記号を使ったりSVGを使ったり
  • 開閉メニューを実装するときもいろいろ注意
    • キーボード操作時も考慮

52

53 of 87

ナビゲーション領域

53

54 of 87

サイト内共通のナビゲーション

<nav><ul>� <li><a href="/">ホーム</a></li>� <li><a href="/about">企業情報</a></li>� <li><a href="/products">製品情報</a></li>� <li><a href="/contact">お問い合わせ</a></li>� <li><a href="/login">ログイン</a></li>� </ul></nav>

54

55 of 87

スクリーンリーダーでは?

最初に「ナビゲーション ランドマーク」と読み上げられた後、�「リスト 5項目」と続き、�最後に「home リンク」と読み上げられたとします。

これにより、自分がいまnavigationランドマークにいること、�そしてそこには全部で5つのリンクがあることがわかります。�望むなら、すぐに最初のリンク先をたどることもできます。

55

56 of 87

外観と配置

56

57 of 87

CSSが読み込めなかったときも何なのかわかる

57

58 of 87

現在位置は色以外でも区別する

58

59 of 87

さらに大胆にしても良い

59

60 of 87

スクリーンリーダーのサポート:方法1

<nav>� <ul>� <li><a href="/">ホーム</a></li>� <li><a href="/about"><span class="visually-hidden">現在のページ</span> 企業情報</a></li>� <li><a href="/products">製品情報</a></li>� <li><a href="/contact">お問い合わせ</a></li>� <li><a href="/login">ログイン</a></li>� </ul>�</nav>

60

61 of 87

スクリーンリーダーのサポート:方法2

<nav>� <ul>� <li><a href="/">ホーム</a></li>� <li><a href="/about"� aria-describedby="current">企業情報</a></li>� <li><a href="/products">製品情報</a></li>� <li><a href="/contact">お問い合わせ</a></li>� <li><a href="/login">ログイン</a></li>� </ul>� <div hidden id="current">現在のページ</div>�</nav>

61

※結果:iOS VoiceOverでは効果なし:

62 of 87

スクリーンリーダーのサポート:方法3

<nav>� <ul>� <li><a href="/">ホーム</a></li>� <li><a href="/about" aria-current="page">企業情報</a></li>� <li><a href="/products">製品情報</a></li>� <li><a href="/contact">お問い合わせ</a></li>� <li><a href="/login">ログイン</a></li>� </ul>�</nav>

62

63 of 87

冗長なリンクは取り除くべき?

<nav>� <ul>� <li><a href="/">ホーム</a></li>

� <li><a href="/products">製品情報</a></li>� <li><a href="/contact">お問い合わせ</a></li>� <li><a href="/login">ログイン</a></li>� </ul>�</nav>

63

64 of 87

冗長なリンクはスキップリンクに?

<nav>� <ul>� <li><a href="/">ホーム</a></li>� <li><a href="#main">企業情報</a></li>� <li><a href="/products">製品情報</a></li>� <li><a href="/contact">お問い合わせ</a></li>� <li><a href="/login">ログイン</a></li>� </ul>�</nav>

64

65 of 87

サイトロゴと「ホーム」のリンクかぶり問題

<header role="banner">� <a href="/home"><img src="images/logo.svg" alt="ホーム"></a>� <nav>� <ul>� <li><a href="#main">ホーム</a></li>� <li><a href="/about">企業情報</a></li>� <li><a href="/products">製品情報</a></li>� <li><a href="/contact">お問い合わせ</a></li>� <li><a href="/login">ログイン</a></li>� </ul>� </nav>�</header>

65

66 of 87

重複をなくす?

<nav>� <ul>� <li><a href="#main"><img src="images/logo.svg" alt="ホーム"></a></li>� <li><a href="/about">企業情報</a></li>� <li><a href="/products">製品情報</a></li>� <li><a href="/contact">お問い合わせ</a></li>� <li><a href="/login">ログイン</a></li>� </ul>�</nav>

66

67 of 87

ナビゲーションのまとめ

  • 現在位置の表示を考えることは重要
    • 色に依存しない、スクリーンリーダーでも伝わるようにする
  • 現在位置の実装方法はいろいろある
    • 非表示のテキストを入れる、ページ内リンクにする、aria-currentなど
  • 冗長なリンクをどうするか考える
    • さまざまな考え方があり、これが正解、というものはない

67

68 of 87

ブログ記事

68

69 of 87

見出しレベルに注意

<h1>ブログ記事のマークアップ方法</h1>�<!-- 序文コンテンツ-->�<h3>「セマンティック」という単語について</h3>�<!-- 待って!2番目のネストレベルはどこに?-->

69

70 of 87

セクションの構造

70

71 of 87

見出しのレベルとスタイルを分離するのはどうか?

<h2 class="h3">私は何でしょう?</h2>

71

72 of 87

インクルーシブ=体験を等価なものにすること

コンテンツを視覚的に扱う一方で、非視覚的には別の方法で�コンテンツを処理するということは、見えているユーザーと�見えていないユーザーを分離し始めているということです。

RSSリーダーなどを通じて表示される際には、�異なるスタイルシートが適用されるため、�視覚的な構造が異なるものになることもあります。

72

73 of 87

見出しジャンプで読み飛ばされる情報に注意する

73

74 of 87

<article>要素は使うべきなのか?

<main id="main">� <article>� <h1>インクルーシブなブログ記事のマークアップ方法</h1>� <div class="meta">公開日 <time� datetime="2017-12-12">2017/12/12</time></div>� <!-- ここに記事のコンテンツ -->� </article>�</main>

74

75 of 87

JAWSとiOS VoiceOverは開始・終了を読み上げる

<article>� ここに最初の記事のコンテンツ�</article>�<article>� ここに2番目の記事のコンテンツ�</article>�<article>� ここに3番目の記事のコンテンツ�</article>

75

76 of 87

要素を選ぶときは、ユーザー体験の観点から

セマンティックな要素を選ぶときは、�ユーザー体験の観点から考えるようにしましょう。

技術的に正しい要素を使用していても、�それが全くサポートされておらず、�誰が見ても何の効果も発揮しないことがあります。

また、効果が間違いなく発揮される場合でも、混乱を招いたり、�一貫性がなかったり、じゃまだったりする場合もあります。

76

77 of 87

見出しのテキストにも注意(NGな例)

<h2>無料ですって?それならください!</h2>

77

78 of 87

何が無料なのでしょう?

ダイレクトで説明的な見出しは、あとに続く内容を明確にし、�全体的な理解も助けます。言い換えれば、もったいぶったり、�風変わりにしたりしても、ろくなことがないということです!

さらに、スクリーンリーダーユーザーにとっては�別の意味合いもあります。�スクリーンリーダーは、動的に見出しをピックアップし、�選択できるリストとして提供します。

78

79 of 87

見出しのテキスト(OKな例)

<h2>フラップジャックが無料ですって?ください!</h2>

79

80 of 87

ブログ記事のまとめ

  • 見出しはとても重要
    • 見出しレベルに配慮する、見出しのテキストも重要
  • 見た目とマークアップが食い違うのは要注意
    • ビジュアルブラウザとスクリーンリーダーの体験が異なるものになる
  • ユーザー体験を重視する
    • 仕様で許されるかという観点だけでなく、�実際にサポートされているか、ユーザーに使えるかを重視

80

81 of 87

まとめ

81

82 of 87

このセッションのまとめ

  • インクルーシブ = アクセシビリティとほぼ同義
  • ボタンは <button> で
    • <div>で頑張るのはダサい、アイコンにはさまざまな実装方法あり
  • ナビゲーションをインクルーシブに
    • スクリーンリーダーにも伝わる現在位置の表現
  • ブログ記事では見出しが重要
    • 見出しの構造やテキストに配慮する

82

83 of 87

83

Amazonで「インクルーシブHTML」と検索!

84 of 87

84

Amazonで「インクルーシブHTML」と検索!

85 of 87

85

Amazonで「インクルーシブHTML」と検索!

86 of 87

今日からあなたも�インクルーシブデザイナー!

86

87 of 87

ありがとうございました

@bakera

@magi1125

スクリーンリーダー:VoiceOver (iOS 11.1)

87