Blog

※ブログ移転しました。 → hamashun.me

Category » HTML

2007年12月02日

アクセシブルなコンテンツ、ナビゲーション、フォーム のまとめ

先月の事になってしまいましたが、Webアクセシビリティ ~標準準拠でアクセシブルなサイトを構築/管理するための考え方と実践~出版記念セミナーに行ってきました。 という訳で遅まきながらまとめです。

6章~8章の翻訳をされた梅垣さんは、「アクセシブルなコンテンツ、ナビゲーション、フォーム」という内容でした。
実装寄りでアクセシビリティを考える時は、HTML、CSS、JSと、別々で考える必要がある、との事でした。
資料へのリンク

著者について

原著を書いたJim Thatcherは、情報科学を専門とする博士で、IBMスクリーンリーダーを作った人。 だからなのか、視覚障碍者やスクリーンリーダーを強く意識した内容になっている。
なお、便宜上この記事では音声支援技術をスクリーンリーダーと呼んでいます。

画像

代替テキストとは

代替テキスト、と聞くとイコールalt属性を連想しがちだが、それだけに限った事ではない(alt属性は代替テキストの内の一つ)。 代替テキストとは、(例えば)画像の代替となるテキストの事(そのまんまだけど)。 つまり、代替になればalt属性に限らないという事。
これはlongdesc属性や画像(など代替テキストを必要とするコンテンツ)の近くに記述するテキストが挙げられる。

よくある代替テキストの例
意味を持つ画像(見出しなど)
その意味をalt属性の値とする
意味と機能を持つ画像(ナビゲーションなど)
基本的には見出しなどと同様。 ただ、例えばロゴマークにトップページへのリンクを貼っている場合には、画像にあるテキストが社名であっても「hoge社トップページ」などの文言にする
意味を持たない画像(装飾用画像、スペーサー)
alt属性の値に何も含めない。 半角スペースではなくいわゆるnull。 その理由は装飾およびレイアウト目的の画像の代替テキスト | アクセシビリティBlog | ミツエーリンクスに詳しい
グラフの代替テキストの例
longdesc属性
理想的な代替テキストだが、日本で主に使われているスクリーンリーダーは非対応
alt属性に内容を記述
長文になってしまう(例えばブラウザシェアのグラフなら、「ブラウザシェアは、Internet Explorer 7が20%、Internet Explorer 6が70%、Firefox2が・・・」となってしまう)。 JAWS(高機能のスクリーンリーダー)でもalt属性の値は150文字までしか読み上げてくれないので、これでは代替にならない
alt属性に概要を記述
例えば「ブラウザシェアは、IEだけで90%を占めます」など。
そもそもグラフにする必要があるのか考える
テーブルで表として表現する事も可能
文脈的に書く
グラフの画像の近くに説明テキストを記述するなど
hamashun注

こういう例を出すと、「どれがベストか?」という話に終始しがちですが、僕個人としてはその考え方自体が既にベストでは無いと思います。
その情報の種類や対象ユーザーに合わせて、毎回最適な選択をする事がベストなのではないでしょうか。

音声

音声ファイルの等価テキスト

対談などで、音声ファイルを配布する場合には書き起こしテキストも提供する。 これには重要な音響的手がかりも記述する(例えば「ここで大きな拍手!」とか)。
(そういえば、「辻ちゃん・ウエちゃんのアクセシビリティPodcast」でも提供されていますね)

色のみの情報にしない(「赤いテキストが最新です」だと、色覚に障碍のある人が分からない可能性)。
また、コントラストを十分に取る事も重要。 カラー・コントラスト・アナライザー 2.0 日本語版が参考になります。

テーブル

アクセシビリティーの世界では、データテーブルとレイアウトテーブルの2種類に分類している。

レイアウトテーブル

スクリーンリーダーの読み上げ順に気をつける。 また、th要素やthead要素などは使用せず、table要素、tr要素、td要素のみを使用する。

データテーブル

見出しは必須。 1行目や1列目に記述する(普通は自然にそうするけど)。 昔のスクリーンリーダーは1列目や1行目を強制的に見出しとしていたので、その為。
その見出しがどの方向の見出しかを示すにはscope属性を使用する。 参考:テーブルとアクセシビリティ -- ごく簡単なHTMLの説明

階層型テーブル

複雑な構造のテーブルにはheaders属性とid属性を使用する。 参考:テーブルとアクセシビリティ -- ごく簡単なHTMLの説明
ただし、日本のスクリーンリーダーは余り対応していない(ホームページリーダーは対応しているらしい)。

視覚障碍者が複雑な表の内容を理解するのは難しい。 なので、1つの複雑な表にまとめるよりは、シンプルな2つの表に分割できないかなどの対応も考えるべき。

画面の点滅

フリッカーと呼ばれる現象(写真サイトではない)。 Flashゲームなどを作る際には留意する。

ナビゲーション

JAWSは各hn要素にジャンプできる機能がある(きちんとしたマークアップをすれば、それだけで便利になる)。
JAWSとホームページリーダーは、ナビゲーションスキップ機能がある(何の事かよく解りませんでした。 連続するリンクをスキップできるという事?)

音声リーダーを使用するユーザーは、tabキーでリンク部分のみを選択してブラウジングする事がある。 リンクテキストが「ここをクリック」などであると、何の事か解らない(これはSEO的にもよくないと言われていますね)。

フレーム

framesetのぺーじではたいとるぞくせいをつかう。 各ふれーむには、head要素にたいとるぞくせい。

イメージマップ

クライアントサイドの画像を使う。 サーバーサイドの画像を使う場合には代替リンクが必要。 area要素にはalt属性が必須。

フォーム

labelは明示的に付ける。 label付けが無くてもスクリーンリーダーがある程度推測してくれるが、これに依存しないように。

フォームのマークアップにテーブルを使う事はよくある。 スクリーンリーダーは、テーブルモードとフォームモードを両立できないが、labelを正しく付ければ読み上げる事ができる。
しかし、idはUniqなのでlabelが複数ある場合には対応できない(これがよく解らなかったんですが、資料を見ると、左と上に二つあるthの事?)。

fieldset要素とlegend要素でフォームをグループ化する事ができるが、日本のスクリーンリーダーはlegend要素に対応していない。

フォームの設計段階の話だが、聴覚障碍者は電話番号の入力を求められても躊躇する。 それ以外の連絡手段が必要である。

日本のスクリーンリーダーは力不足である

仕様通りに作ったとしても、UA側の実装が追いついていないのでアクセシブルにならない。 製作者はこの問題に対して選択が求められる。
一つは仕様を重視して特に対処はしない。 もう一つは情報が正しく伝わる事を重視して、冗長な表現やバッドノウハウの使用も検討する。 或いは、その中間を取る。

2008年10月31日

【追記あり】li要素などを改行すると、要素と要素の間に半角スペース分の余白が現れる件について調べてみた。

追記:トラバが送れないとの報告を受けて、文末に手動トラバを追加しました。

ナビゲーションなどをリスト要素でマークアップして、display: inline; で横並びにすると、li要素とli要素の間に謎の余白が現れます。
そして、この現象を解決する手段はいくつかあります(参考:リストをinlineで並べた時の余白|CSS HappyLife)。

でも、この余白はそもそも何者で、なぜ現れるのでしょうか。

余白の正体

結論から言うと、この余白の正体は空白類文字です。 marginやpaddingの暴発ではありません。

では、なぜ何もない場所に急に空白類文字が現れるのでしょうか。 この謎を解くには、まずは空白類文字について調べる必要があります。

空白類文字 1

文書文字集合には、多様な空白類文字が含まれている。その多くは、特定の視覚的スペーシング効果を生成するために何らかのアプリケーションが用いる印刷術的要素である。 HTMLでは、次に挙げる文字だけが空白類文字であると定義される。

  • ASCIIスペース ( )
  • 水平タブ (	)
  • 書式送り ()
  • ゼロ幅スペース (​)

行区切り類もまた、空白類文字である。

Paragraphs, Lines, and Phrases (ja) 9.1 空白類 より引用

ここで注目すべきは、行区切り類もまた、空白類文字である。という部分です。 そしてこの行区切り類の項目を見ると、次のように書いてあります。

行区切り類

1つの行区切りは、1つの復帰 (
)か、1つの改行 (
)か、1つの復帰/改行組であると定める。

Paragraphs, Lines, and Phrases (ja) 9.3.2 行区切り類の制御 より引用

復帰と改行、という和訳単語が出てきますが、これはそれぞれCRとLFの事です。 復帰/改行組というのはCR+LFの事です。
(参考:テキストファイル - Wikipedia
(LF == 行送り == 改行 だと思うんですが、違ったらご指摘いただければと)

空白類文字 2

改行が空白類文字である事が解ったところで、再び空白類文字について調べてみます。 この空白類文字とは何でしょうか。
ばけらさんの用語集に簡潔かつ解りやすく載っていました。

HTML において、ASCII spaceと同様に扱われる文字です。

用語「空白類文字」@鳩丸ぐろっさり (用語集) より引用

ASCII spaceと同様だそうです。 なるほどですね。
・・・実はASCII spaceが解らなかったので、更に調べてみました。

ASCII文字の 32 番目の文字。16進数で言うと 0x20 。いわゆる半角空白のことです。

用語「ASCII Space」@鳩丸ぐろっさり (用語集) より引用

なるほど。 つまり、空白類文字とはHTMLにおいては半角スペースと同じ扱いなんですね。

ここまでのまとめ

行区切り類は空白類文字なので、改行は空白類文字である。 そして空白類文字とはHTMLにおいて半角スペース扱いである。 という事が分かりました。
これで、li要素を改行すると半角スペース分の余白が現れる理由が解りました。 やったね!

新たな疑問

・・・でもちょっと待ってください。 改行はHTMLのソースコードの中にたくさんあります。 li要素にしても、改行をしたら必ず余白が現れるわけでもありません。
空白類文字が現れる場合と現れない場合があるのは、なぜでしょうか?

改行をすると空白類文字が現れるのは、どうやらインラインボックス及び匿名インラインボックスのみのようです。
この辺りに関する仕様書の記述は見つけられなかったのですが、Web標準普及プロジェクトのドキュメントの中に近い物がありました。

上記の例にあるように、要素中に改行が混じるとやや複雑な形で表示されます。 これはインライン要素によって生成されるボックスは改行によって複数に分割されることがあるためです。 この分割された面にはborder, margin, paddingはその表示が行われません。

ブロックレベル要素とインライン要素 - Web標準普及プロジェクト 3.インライン要素 より引用

引用元にはli要素をdisplay: inline; で横に並べているサンプルがあるのですが、これを選択状態にすると、空白類文字がある事がわかります。
インライン要素によって生成されるボックスは改行によって複数に分割されることがあるため、というのはli要素の内容と空白類文字が分割された事であり、この分割された面にはborder, margin, paddingはその表示が行われません。 、というのは空白類文字側の事なのではないでしょうか。

key-childさんからコメントいただきました
関係ありませんでした。

結論

インライン及び匿名インラインボックス、匿名ブロックボックス内で改行をすると、空白類文字(半角スペース)が表示される。

空白類文字に関しては、もう少し色々とあるんですが、長くなりすぎたので今回はとりあえずこの辺りで。

空白類文字についての補足・及び言及への返信 | Blog hamashun.comへ続きます。

手動トラバ

トラバがうまく送れないという報告を受けたので手動トラバです。
JavaScriptでli要素を一行につなげる - colorhythm
ありがとうございます!

2008年11月08日

空白類文字についての補足・及び言及への返信

前回の記事、li要素などを改行すると、要素と要素の間に半角スペース分の余白が現れる件について調べてみた。 | Blog hamashun.comを書くために空白類文字について調べたら、記事に必要な内容以上の知識を得ました。
また、ブクマコメントで言及を頂いたので、続編記事を書きます。

連続した空白類文字

ユースケさんのブクマコメントの内容です。

ちなみにどんなに改行や空白が連続してあっても、1つの空白として認識する(はず。あんまし覚えてないけど確かそうだったはず)

はてなブックマーク - yu-suke@double-team.orgのブックマーク / 2008年11月04日より引用

これはHTML4.01仕様書の9.1 空白類の節に載っていて、まさにそのとおりでした。

ここで、ソース文書中で語間に空白類が複数連なっている場合、PRE要素を除いて、レンダリング結果の語間スペース調整は全く異なるものになるという点に注意されたい。特にユーザエージェントは、語間スペースの出力処理に際しては、連続する空白類の入力があった場合は1つにまとめてしまう必要がある

Paragraphs, Lines, and Phrases (ja) 9.1 空白類 より引用 (強調は引用者による)

はじめてHTMLをさわった人の多くが不思議に思う、半角スペースをたくさん入力しても反映されない件は、この仕様によるものです。

インライン・匿名インラインボックス内の改行でも、空白類文字が描画されないケース

前回の記事の結論で次のように書きました。

インライン及び匿名インラインボックス内で改行をすると、空白類文字(半角スペース)が表示される。

li要素などを改行すると、要素と要素の間に半角スペース分の余白が現れる件について調べてみた。 | Blog hamashun.com より引用

しかし、実はこれにあてはまらないケースが存在します。
例えば次のようなコードの場合です。

<div>
てってってーてってっててー
</div>

このような、開始タグの直後や終了タグの直前で改行しているコードは、よく見かけます。
この改行は匿名インラインボックス内での改行に思えますが、ブラウザ上で確認すると空白類文字は描画されていません。

この動作も、仕様書によって指定されたものです。

SGMLの行区切り規則への抵触や、現存する実装間の矛盾を回避するため、著者は、ユーザエージェントが開始タグ直後または終了タグ直前の空白類をレンダリングするとは期待しないようにすべきである。

Paragraphs, Lines, and Phrases (ja) 9.1 空白類 より引用 (強調は引用者による)

この仕様を知っておかないと、逆に「入れたはずの半角スペースが描画されない」というトラブルも起こりえますね(レアケースでしょうけど)。

北村さんより頂いた言及への返信

北村さんよりブクマコメントで頂いた言及です。

『この分割された面』は、インラインボックスの途中で(br要素により)改行された部分のことなのでは。この図の通り→ http://www.mozilla.gr.jp/standards/webtips0015.html#c1_5_1

はてなブックマーク - 徒栞 / 2008年11月05日 より引用

言及元記事の引用先の問題の部分(複雑><)は次のようになっています。

例として以下のものがあります。

  • a
  • abbr
  • acronym
  • b
  • bdo
  • big
  • cite
  • code
  • dfn
  • em
  • i
  • kbd
  • label
  • q
  • samp
  • small
  • span
  • strong
  • sub
  • sup
  • tt
  • var

上記の例にあるように、要素中に改行が混じるとやや複雑な形で表示されます。

ブロックレベル要素とインライン要素 - Web標準普及プロジェクト 3. インライン要素 より引用(スタイル属性は引用者による)

この上記の例というのは、インライン要素が並んでいる部分を指していると思うのですが、そのコード部分はli要素一つごとに改行されているだけで、br要素は登場していません。

なので、ここだけを見ると、br要素による改行ではなく行区切り類による改行を指しているのではないかと思ってしまうのですが、北村さんのコメント内にあるリンク先を見ると確かにbr要素による改行を指しているように思えます。

両方を読んだ結果、br要素による改行と行区切り類による改行の両方を指しているのではないか、と思えました。

あーでも、要素中に改行が混じるとやや複雑な形で表示されますの"要素中"って要素の中というようにも思えるので、要素の外で改行をしている場合はあてはまらないような気もしてきました。 それにそもそも、"やや複雑な形"というのも具体的に何が複雑なのかよく分からない…。 うーむ。

2009年03月20日

EDGEのトップページをHTML5化した件について

EDGEのトップページをHTML5化しました。

開発日誌やTwitterで告知したところ、ITmedia Newsで取り上げてもらったりvantさんが言及してくれたり、他にもご感想やご意見をいただいたり見かけたりしました。 ありがたいことです。

ここでちょっとお知らせなのですが、HTML5は策定中の仕様で使用例も情報も少ないので、実験場であるEDGEのコードは荒削りだったり誤りを含んでいる可能性があります。
もちろん今後修正していきますが、もし参考にする場合はその辺りを頭の片隅に入れていただければと。

HTML5を試してみる場合には、vantさんの二つめの言及記事で指摘されている通り、確かに文書文書したページの方がやりやすそうです。

2009年06月11日

EDGEが html5 Gallery で紹介されました

Edge Labs | html5 Gallery

HTML5を採用しているサイトを紹介するhtml5 Galleryという海外のサイトに、EDGEが紹介されました! 評価も星4つとなかなかなようです。

ジャンルがBlogになってるのが気になりますがw


Blog Search
Search
Recent Entry
Category
Monthly Archive