このページでは、アクセシビリティと、電子出版物のコンテンツを非表示にしたり最小化するのに使用する様々なテクニックの影響について説明します。
ただし、コンテンツが出版物の理解の中心ではない限り、支援技術のユーザーのみを対象とした非表示コンテンツを組み込むのは一般的に避けることをお勧めします。代替テキストへの標準的なハイパーリンクや、コンテンツを最小化する宣言的なアプローチ(例:details
要素)は、非表示コンテンツよりも幅広く使用できます。このコンテンツの恩恵を受けるすべての人が支援技術を使用しているわけではありません。
コンテンツを選択的に表示する必要がある場合には、プログレッシブ エンハンスメント手法に従っていることを確認してください。
HTMLテクニック
details
要素
details
要素は、コンテンツを非表示にする要件を完全には満たしていません。 summary
タグで指定されたラベルに対してコンテンツを折りたたむ機能を提供します。コンテンツを展開したり折りたたんだりするのに、EPUBリーディングシステムではしばしば欠けているスクリプト サポートを必要としないのが、この要素の利点の1つです。
コンテンツが折りたたまれた状態で始まる必要はありません。 open
属性を追加すると、コンテンツは最初は展開されます(この属性もhidden
属性と同様にブール値であるため、その値は空の文字列または値open
のいずれかになります)。
ただし現状では、要素を展開あるいは折りたんだ時に、リーディングシステムによってページが再表示される際にうまくいかないことがあります。展開すると、要素の下のコンテンツが現在のページの下部から押し出され、目の見える読者が利用できなくなる可能性があります。また、この属性は古いブラウザーでは十分にサポートされておらず、Internet Explorerの全バージョンではサポートされていないため、機能させるにはポリフィル(訳注:ブラウザの機能が欠けている部分を自前のプログラムで補うこと)が必要です。
details
要素は通常、説明を要素に関連付けるためにaria-details
属性と組み合わせて使用されます。
CSSテクニック
CSS はコンテンツを視覚的に非表示にするさまざまなアプローチを提供しますが、それを使用する際の主な問題には次のようなものがあります。
- CSS は常にサポートされているわけではなく、しばしばユーザーによって無効化されることもあります。
- 新しいプロパティのサポートは開発に長い時間がかかることが多く、古いユーザー エージェントではサポートされないものも多くあります。
- EPUBリーディングシステムは独自のスタイルを提供することが多いので、コンテンツ制作者のスタイルは無視されたり上書きされるかもしれません。
結果的に、スタイル設定されたコンテンツは、ユーザーが使用しているユーザー エージェントにかかわらず、ユーザーに対して非表示になる保証がありません。一般的に、HTML テクニックの方が(訳注:非表示に関して)信頼性が高くなります。
display
をnone
に設定する
display
プロパティは、 視覚的に非表示にするために広く使用されている方法です。その起源はhidden
属性よりはるかに古く、要素の高さと幅を設定するよりも直接的で簡単に操作できます。display をnone
に設定すると、そのプロパティが適用されている要素は視覚的な表示とアクセシビリティ ツリーから削除されるため、支援技術はコンテンツを読み取れません。
hidden
属性と同様に、display
プロパティを使用して非表示にされたコンテンツは、非表示コンテンツを受け入れるARIA 属性によってアクセスできます。ただし、このアプローチには、支援技術を使用しないユーザーにとっても有用である情報が非表示になってしまう、同様の欠陥があります。
クリッピング
クリッピングは、視覚によるユーザーが追加コンテンツの存在に気付かないように、コンテンツを1ピクセルに縮小する手法です。
コンテンツを完全に非表示にせずクリッピングする利点は、支援技術はクリッピングされたコンテンツは読み上げ、一方、非表示に設定またはスタイル設定されたコンテンツは無視するという部分です。
clip-path
プロパティは、この効果を実現するために使用される主要なプロパティですが、次の例に示すように、他のいくつかのプロパティも必要です(一部はフォールバックとして)。
注記
clip
プロパティは非推奨になりました。これは、古いブラウザ用のフォールバックとして含まれています。
この手法は Web ブラウザーではうまく機能しますが、EPUBリーディングシステムでのサポートは一貫していません。新しいclip-path
プロパティのサポートは広く普及しておらず、絶対位置指定を必要とする古いclip
プロパティもサポートされていません。
height
(高さ)とwidth
(幅)をゼロに設定する
要素のheight
とwidth
プロパティを0
に設定することは、クリッピング手法に似ていますが、通常、支援技術ではサイズ指定のない要素のコンテンツは読み上げられません。
要素の寸法を 0 に設定しても、コンテンツはアクセシビリティ ツリーから削除されませんが、支援技術は多くの場合、このようにスタイル設定されたコンテンツを無視するように最適化されています(たとえば、クリッピング手法でサイズを 1 ピクセルに縮小するだけであるのはそのためです)。ただし、この動作は普遍的なものではないため、場合によってはコンテンツが読み取られることがあります。
opacity
(不透明)の透明化
要素のopacity
プロパティを0
に設定すると、ユーザーに対しては完全に透明になりますが、支援技術はテキストを読み上げます。
opacity
の使用に関する主な問題は、EPUBリーディングシステムでのサポートと、不透明なテキストがある場所にスペースが残ってしまう点です。
注記
アルファ チャンネルを透明に設定することで(たとえば、 rgba()
または#RRGGBBAA
値構文を使用)、要素のテキストのみの不透明度を変更することもできます。ただし、EPUB ではアルファ チャンネル値のサポートも広く普及していません。
変形(Transformation)
transform
プロパティには、コンテンツを非表示にする2つのオプションがあります。1つは要素をゼロに縮小(スケーリング)する方法で、もう1つは要素を画面外に移動する方法です。どちらの場合でも、支援技術はテキストを読み上げます。
scale
変形を使用すると、参照されている要素は、スペースを占有しなくなるまで縮小されます。これは、高さと幅を 0 に設定するのと効果は似ていますが、縮小時に要素が占有するスペース全体が消えないという点が異なります。
translate
変形を使用すると、要素が占めるスペース全体が消えないことを除けば、絶対配置指定による画面外コンテンツと効果は似ています。値は、移動ベクトルのx
座標とy
座標です。
opacity
と同様に、 transform
を使用する場合の主な問題は、このようなアニメーションが EPUB リーディングシステムで十分にサポートされておらず、変形されたテキストがあった場所にスペースが残ってしまうことです。
visibility
(可視性)をhidden
(非表示)に設定する
visibility
プロパティは、電子出版物内のコンテンツを非表示にするために使用されることはあまりありません。 display
プロパティとは異なり、レンダリングされたコンテンツ内に要素が表示されるスペースを残してしまうためです。可視スペースがあるにもかかわらず、コンテンツは支援技術によって読み込まれません。
このプロパティは、Web では、要素が非表示または表示されたときにページ上の他のコンテンツが移動するのを防ぐためによく使用されます(たとえば、ページ フッターがページの下部から引き上げられないようにするため)。
display
プロパティと同様に、この方法で非表示にされたコンテンツは、非表示のコンテンツを許可するARIA 属性から参照されない限り、支援技術に対して非表示になります。
絶対position
(位置)
position
プロパティを使用してコンテンツを画面外に絶対配置することは、視覚的には非表示にして、支援技術には読み込ませるというもう1つの一般的なWeb手法です。変更されるのはコンテンツの視覚的な位置だけなので、支援技術は引き続きテキストを読み上げます。
ただし、絶対配置を使用してコンテンツを画面外に配置することは、EPUB リーディングシステムでは非常に信頼性が低くなります。コンテンツの絶対配置は、リフロー可能なコンテンツのレンダリングとページ付けを複雑にするため、固定レイアウトの出版物以外では無効になっていることがよくあります。その結果、コンテンツがページ上の予期しない位置に固定されて表示され、視覚的に読み取る人にとって他のコンテンツが見えにくくなる可能性があります。
負のtext-indent
text-indent
プロパティに大きな負の数を指定して、コンテンツを画面の表示領域から押し出すために使用することがあります。大きな数を使用すると、テキストが1行にレンダリングされ、画面の表示領域に届かなくなります。コンテンツは視覚的には表示されませんが、支援技術によって読み上げられます。
CSS テクニックの中でも、負のインデントは特に信頼性が低い傾向があります。たとえば、ユーザーがコンテンツに到達できるように、ブラウザに大きなスクロールバーが表示される可能性があることが指摘されています(ただし、方向性を設定することでこれを軽減できます)。EPUB リーディングシステムでより一般的な問題は、負のインデントや、表示領域外のコンテンツを操作するその他の試みが無視されることです。
また、通常、最初の行を単に後ろに移動することによって生じる空白を縮小するには、縮小されたフォント サイズや要素の高さの変更など、他のタンデム プロパティも必要です。これらも、EPUB リーディングシステムでは十分にサポートされていない可能性があります。
注記
100%
のインデントを使用してコードを反対方向に画面外に押し出す同様の手法もブラウザー用に提案されていますが、コンテンツが画面外に配置されないようにするリーディングシステムではこれも機能しません。
背景とcolor
(色)を合わせる
前景色を背景色と一致させることでコンテンツを非表示にすることは可能ですが、これは EPUB コンテンツに使用できる最悪の選択であると言えます。
この方法でEPUB のコンテンツを非表示にすると、次のような問題が発生します。
- 多くの場合、リーディングシステムでは、すべての出版物が同じ外観と雰囲気を持つように、独自の前景色と背景色が適用されます。その結果、テキストが実際に非表示になるという保証はありません。
- 同様に、リーディングシステムでは、前景テキストと背景テキストの色の設定を変更するオプションがユーザーに提供されることがよくあります。
- 多くの場合、リーディングシステムでは、前景色と背景色をリセットする複数の読書モード(夜間読書など)が提供されており、これによりデフォルトでテキストが非表示であっても、表示されてしまいます。
どのユーザー エージェントでもよくある問題は、この非表示方法ではテキストが隠れるだけであるということです。可視性を変更した場合と同様に、テキストが占める領域は引き続き表示されます。
色を変更してもテキストが実際に削除されるわけではないため、支援技術ではこの方法で隠されたテキストを読み上げます。
ARIA テクニック
ARIAはコンテンツの表示には影響しませんが、支援技術からコンテンツを非表示にしたり、非表示のコンテンツを支援技術からアクセスできるようにするのに使用できる属性を多数有しています。
aria-describedby
属性
aria-describedby
属性は、参照される要素が非表示である必要はありませんが、非表示の説明を要素に関連付けるためによく使用されます。属性の値は、説明を含む要素の ID です。
説明が複数の要素に分割されている場合には、aria-describedby
属性は複数の要素を参照します。
aria-describedby
使用して、非表示かどうかに関係なく、任意のコンテンツを参照する場合の問題は、そのコンテンツが単純なテキスト文字列になることです(つまり、説明内を効果的に移動する方法がありません)。その結果、支援技術のユーザーは、先に進む前にそのテキスト文字列全体を聞かなければならず、イライラすることがあります。
非表示のコンテンツを参照するaria-describedby
を使用すると、他にアクセスの恩恵を受ける可能性のあるユーザーが多数いる場合でも、支援技術のユーザーによる説明へのアクセスに限定されてしまいます。
aria-details
属性
aria-details
属性は、どちらも要素のコンテンツに関する追加情報を識別するという点でaria-describedby
属性に似ていますが、いくつかの重要な違いがあります。
- 非表示コンテンツの参照を目的としたものではありません。
- 参照されるコンテンツは単純なテキスト文字列に縮約されず、ユーザーは参照先のコンテンツ構造をナビゲートできます。
aria-details
属性の値は、説明を含む要素の ID です。この属性は1 つの要素のみを参照できます。
この属性は、折りたためるdetails
要素を参照するのによく使用されます。この使用法は、すべてのユーザーに対してできるだけ目立たない方法で説明を提供する最適な方法の1つです。
注記
要素名と属性名に「details」が使用されているのは、ある意味偶然です。 aria-details
要素は、追加情報を含む任意の要素を参照できます。
aria-label
とaria-labelledby
属性
aria-label
属性とaria-labelledby
属性はどちらも、要素にアクセシブルな名前を提供します。
aria-label
によって非表示の名前を指定できます。
この属性は、新しいセクションを示すのに空白のみが使用されている電子出版で役立ちます(例:見出しのない前付セクション、索引または参考文献のエントリのグループ)。明示的な見出しがないと、支援技術ではsection
をナビゲートできないため、このようなセクションに対する名前付けが重要です。
aria-labelledby
属性は同様の目的を果たしますが、名前を(非表示にできる)別の要素に組み込めます。 aria-labelledby
属性の値は、名前を含む要素のIDです。
ラベルが複数の要素に分割されている場合、 aria-labelledby
属性は複数の要素を参照する場合があります。
コンテンツのセクションに明示的な見出しがある場合には、必ずしもaria-labelledby
属性を使用する必要はありません。
支援技術では最初の見出し要素をセクションに関連付けます。ただし、古いブラウザや古い支援技術向けに見出しを明示的に関連付けると役立ちます。
presentation
ロール
よくある誤解として、要素にpresentation
ロールを追加すると、支援技術からコンテンツを隠すことができる、というものがあります。これは間違いです。
この誤解は、この役割が、ユーザーが遭遇する必要のない画像に適用されることが多いために生じます。
実際、コンテンツが存在せず、画像は無視しても問題ないことを支援技術に知らせるのは、空のalt
属性です。
任意の要素にrole="presentation"
を設定すると、そのセマンティクスのみが削除されます。要素の内容は変更されません。
注記
ARIA ワーキング グループは、無視されるのはコンテンツではなく要素のセマンティクスであることをより適切に反映するために、 presentation
ロールをnone
に置き換える方向に動いています。
スクリプトテクニック
JavaScriptにはコンテンツを非表示にする独自の新しい機能はありませんが、開発者はこのページで説明したすべてのテクニックを使用してドキュメントを操作し、コンテンツを非表示にできます。たとえば、開発者はhidden
属性を動的に追加および削除したり、要素にCSSクラスを割り当てたりできます。そしてもちろん、ARIAはスクリプトによって変更できるように設計されています。
もともとのテクニックを直接使用する場合と比べてJavaScriptが優れている点は、コンテンツを非表示にするときに段階的な拡張が可能であることです。ユーザー設定に応じて、コンテンツのオン/オフを切り替えなければならない場合があります。
たとえば、プログラミングに関する本には複数の言語による例題が掲載され、ユーザーは自身が最も使いやすい言語のみを選択して有効にできます。HTMLまたはCSSのテクニックを使用して1つの言語をデフォルトで非表示にすると、スクリプトのサポートがないと、それらの例題はユーザーにまったく表示されなくなる可能性があります(つまり、選択を切り替えるスクリプトが機能しない場合)。代わりに、ページの読み込み時にJavaScriptを使用すると、スクリプトが利用できない場合であってもユーザーに対して何も非表示にはなりません。情報を失うことなく、スクリプトは適切に終了します。
同様に、教科書の問題の答えがスクリプトを使用してのみ明らかにされる場合、どのユーザーもその答えにアクセスできません。
関連リンク
- MDN — <details>: 詳細折りたたみ要素
- MDN — hidden
- HTML —
hidden
属性 - HTML —
details
要素 - WCAG 2.1 — CSS を使用してリンクテキストの一部を非表示にする
- CSS —クリッピングシェイプ: clip-path プロパティ
- CSS —コンテンツの高さ: 'height' プロパティ
- CSS —コンテンツの幅: 'width' プロパティ
- CSS — 'display' プロパティ
- CSS —可視性: 'visibility' プロパティ
- CSS —インデント: 'text-indent' プロパティ
- CSS —配置スキームの選択: 'position' プロパティ
- CSS —透明度: 'opacity' プロパティ
- CSS — 'transform' プロパティ
- CSS —前景色: 'color' プロパティ
- ARIA — aria-hidden(状態)
- ARIA — aria-describedby(プロパティ)
- ARIA — aria-details(プロパティ)
- ARIA — aria-label(プロパティ)
- ARIA — aria-labelledby(プロパティ)
- ARIA —presentation(ロール)