スクリーンリーダーは、「alt」属性に設定されている文字列を読み取ります。この属性の使用は、特に画像タグ用です。
次のようなdivがある場合:
<div id=myCoolDiv tabindex="0"> 2 <div>
Altタグを使用するのと同じ方法で、スクリーンリーダーが属性をピックアップして文字列を読み取る方法はありますか?
下にリストされているdivの場合、スクリーンリーダーは「ショッピングカートアイテム2」と言いますか?
私はaria-labelを使用しようとしましたが、スクリーンリーダーはそれを拾いません:
<div id=myCoolDiv tabindex="0" aria-label="shopping cart items"> 2 <div>
role="listitem"
またはrole="group"
とaria-labelledby="shopping cart items"
を試してください。 例1を参照してください。 2
は、コンテンツのコンテキストとして読み取られた属性を持つスクリーンリーダーによって既に読み取られる必要があるテキストコンテンツです。これを参照してください セクション 。
入力を使用する場合は、aria-readonly=true
role=textbox
を追加します。 aria-label
とaria-labelledby
のどちらを使用すべきか疑問がある場合は、この 記事 を読んでください。 JAWSの documentation では、aria-label
が無視されるという事実を自分でサポートしています。さらに、アクセシビリティが重要な場合、セマンティクスは非常に重要です。入力を使用できるときにdivを使用することは意味的に適切ではなく、前述したように、JAWSはdivよりもフォーム要素を簡単に受け入れます。この「ショッピングカート」はフォームまたはフォームの一部であり、境界線が気に入らない場合は、input {border: 0 none transparent}
を使用するか、セマンティクスに関してはA +になる<output>
*を使用すると仮定します。 。
申し訳ありませんが、@ RadekPechは私に思い出させてくれました。 aria-labelledby
を使用するには可視テキストが必要であり、テキストにはaria-labelledby
の値としてリストされているIDが必要であることを追加するのを忘れました。美観のためにテキストが必要ない場合は、color: transparent
、line-height: 0
、またはcolor:<same as background>
を使用します。これは、DOMに関する限りは可視性を満たし*、それでも肉眼では見えないはずです。これらの手段は、JAWSがaria-label
を無視するためです。
*未検証
<span id="shopping">Shopping</span>
<span id="cart">Cart</span>
<span id="items">Items</span>
<input id='cart' tabindex="0" aria-readonly=true readonly role="textbox" aria-labelledby="shopping cart items" value='2'>
JAWSの場合、おそらく少し設定する必要があります。
この特定のダイアログボックスでは、特定の属性を追加したり、要素にタブを移動したときに表示される内容を追加したりできます。 JAWSはfocus
イベントをトリガーできるため、フォーム要素に簡単に応答します。代わりにの例2を使用する方が簡単です:
<div id=myCoolDiv tabindex="0" role="listitem" aria-labelledby="shopping cart items"> 2 <div>
<input id='semantic' tabindex="0" role="listitem" aria-labelledby="shopping cart items" value='2' readonly>
スクリーンリーダーで代替テキストを読むには、2つの方法(組み合わせることができます)があります。
ARIAロールimg
を持つものはすべてalt
属性を持つことができます(MUST)。 WAI-ARIA img role を参照してください。
<div role="img" alt="heart">
♥︎
</div>
ただし、これは、要素が実際に画像を表す場合にのみ使用する必要があります(例:ハートUnicodeコード)。
要素に実際のテキストが含まれていて、読み取りが必要な場合は、ARIAロールをtext
に設定し、スクリーンリーダーで読みたいものにaria-label
を追加する必要があります。 WAI-ARIA text role を参照してください。
<div role=text aria-label="Rating: 60%">
Rating: ★★★☆☆︎
</div>
関連する要素のIDを含むaria-labeledby
と不一致にしないでください。
前の2つのケースを2つのARIAロールを使用して1つに結合し、alt
とaria-label
の両方を追加できます。
<div role="img text" alt="heart" aria-label="heart">
♥︎
</div>
さらにARIAロールが定義されている場合、ブラウザはサポートされている最初のロールを使用し、そのロールで要素を処理する必要があります。
最後に重要なことは、ページタイプをHTML5に設定する必要があることです(これはARIAを設計上サポートしています)。
<!DOCTYPE html>
HTML4またはXHTMLを使用するには、ARIAサポートを有効にするために特別なDTDが必要です。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+ARIA 1.0//EN"
"http://www.w3.org/WAI/ARIA/schemata/xhtml-aria-1.dtd">
いいえ、<div>
要素にはalt
属性に相当するものはありません。
あなたがやろうとしていることに関して、ARIAベースのソリューションはやり過ぎです。スクリーンリーダーの互換性の問題にぶつかるだけでなく、必要のない場所にARIA属性を適用しています(<div>
などの場合はおそらく属さない)。
代わりに、オフスクリーンテクニックの使用を検討してください(この方法 The Paciello Groupから またはこの方法 WebAIM から)。この手法を使用して隠されたコンテンツは、引き続きスクリーンリーダーで読み取られますが、視覚的に隠されます。
あなたの質問を読んで、これがあなたが求めていることだと思います。
この手法を示すペン を作成しました。 フルページバージョン でテストする方が簡単かもしれません。
Edit:例からHTMLとCSSを追加しましたが、仕様とブラウザ/支援技術の両方が時間の経過とともに変更をサポートすることに注意してください。これは1年以内に上記のリンクを引き続き使用して、このCSSが現在のベストプラクティスであることを確認してください。
<div tabindex="0">
<span class="offscreen">Items in shopping cart: </span>2
</div>
.offscreen {
position: absolute;
clip: rect(1px 1px 1px 1px);
/* for Internet Explorer */
clip: rect(1px, 1px, 1px, 1px);
padding: 0;
border: 0;
height: 1px;
width: 1px;
overflow: hidden;
}
Bootstrap Framework を使用する場合、迅速かつ簡単な解決策があります。 sr-only
テキストが書き込まれるspan
要素では、sr-only sr-only-focusable
またはscreen-reader-only
BootstrapのCSS classes を使用する必要があります。
次の例を確認してください。クラスglyphicon glyphicon-shopping-cart
のspan
要素は、カートアイコンとしても使用されます。
<div id="myCoolDiv">
<h5>
<span class="glyphicon glyphicon-shopping-cart"></span> 2
<span class="sr-only sr-only-focusable" tabindex="0">shopping cart items</span>
</h5>
<div>
スクリーンリーダー出力: "2つのショッピングカートアイテム"
- Fangs Screen Reader Emulator Firefox用アドオンが提供
上記の作業例は次の場所にあります。 Fiddle
Oriol で示唆されているように、 Bootstrap Framework を使用しない場合は、CSSファイルに次を追加します。
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}
.sr-only-focusable:active,
.sr-only-focusable:focus {
position: static;
width: auto;
height: auto;
margin: 0;
overflow: visible;
clip: auto;
}
W3Cの代替テキスト計算アルゴリズム および アクセス可能な名前と説明:計算とAPIマッピング1.1 によると、必ずaria-label
を使用する必要があります。
そうは言っても、Jawsでは機能しません。そのような高価なツールにとっては残念です。
残りのオプションは、誰でも満足させるためにtitle
とaria-label
の両方を使用して、カートページに移動するリンクを使用する方法です
<a href="#cart" title="2 shopping cart items" aria-label="2 shopping cart items">2</a>
透明な1ピクセルオプションを使用することもできます。
2 <img src="pixel.png" height="1" width="1" alt="shopping cart items" />
試してください:
HTML
<div id=myCoolDiv tabindex="0"><span class="aria-hidden">shopping cart items</span>2<div>
CSS
.aria-hidden {
position: absolute;
left: -100000px;
}
これにより、スパン内のテキストが通知されます。そして、親divは視覚的なフォーカスを失うことはありません。 Aria-hiddenクラスは、表示されている画面領域からスパンを非表示にしますが、フォーカスがあるdiv内でスパンを読み取ります。
alt
属性としてラベルを持つdiv内の画像を使用します。そうすれば、スクリーンリーダーのない人には数字と画像だけが表示されますが、リーダーのある人には文全体が聞こえます。
<div>
<img src="http://tny.im/57j" alt="Shopping cart items" />
2
</div>
読み取り:「ショッピングカートアイテム:2」
alt
属性が画像に存在するのは、画像のコンテンツを「読み上げる」方法がないため、代わりに提供されたテキストが使用されるためです。ただし、divの場合は、すでにテキストと画像が含まれています。したがって、スクリーンリーダーで読み上げたい場合は、divのコンテンツにテキストとaltテキストを含める必要があります。
次のcssを使用して、screen-reader-textなどのクラスを作成できます。
.screen-reader-text {
clip: rect(1px, 1px, 1px, 1px);
height: 1px;
width: 1px;
overflow: hidden;
position: absolute !important;
}
次に、コードで、スクリーンリーダーのテキストに<span>
を追加するだけです。
<div>
I am a div!
<span class="screen-reader-text">This is my screen reader text</span>
</div>
こちらの例をご覧ください: https://jsfiddle.net/zj1zuk9y/
(情報源: http://www.coolfields.co.uk/2016/05/text-for-screen-readers-only-updated/ )