第2章-4節: みんなに優しいツールチップの作り方 (アクセシビリティ)
これまで、ツールチップの基本的な作り方や、JavaScriptを使った応用テクニックを見てきたね。
でも、ウェブサイトは色々な人が使うもの。マウスが使いにくい人、目が不自由でスクリーンリーダー(画面読み上げソフト)というものを使っている人など、本当にさまざまなんだ。そんな全ての人にとって使いやすいウェブサイトを作るための考え方や工夫を「アクセシビリティ」って言うよ。
今回は、ツールチップをより多くの人に優しく、アクセシブルにするための大切なポイントを学んでいこう!
♿ なぜツールチップにアクセシビリティが重要なの?
ツールチップは、マウスを乗せた時だけ情報が表示されることが多いよね。でも、これだと…
- マウスを使わない(キーボードだけで操作する)人は、ツールチップを見ることができない。
- スクリーンリーダーを使っている人は、ツールチップが表示されても、その情報が読み上げられないかもしれない。
これじゃあ、せっかくの補足情報が一部の人にしか伝わらないことになっちゃう。だから、ツールチップを作るときは「どうすればみんながこの情報にアクセスできるかな?」と考えることがとっても大切なんだ。
⌨️ キーボード操作への対応
マウスを使わない人のために、キーボードのTabキーでツールチップのトリガー要素に移動(フォーカス)したときにも、ツールチップが表示されるようにしよう。
これには、JavaScriptでfocus
(フォーカスが当たった時)イベントとblur
(フォーカスが外れた時)イベントを監視して、ツールチップの表示・非表示を切り替えるようにするんだ。
もし、ツールチップのトリガーが普通のテキスト(<span>
など)のように、元々キーボードでフォーカスできない要素の場合は、HTML属性のtabindex="0"
を付けてあげると、キーボードでフォーカスできるようになるよ。(リンクやボタンのような元々フォーカスできる要素には不要だよ)
<!-- キーボードでフォーカスできるように tabindex="0" を追加 -->
<span class="trigger-accessible" tabindex="0" data-tooltip-id="tooltip1">キーボード対応トリガー</span>
<div id="tooltip1" role="tooltip" style="display:none;">これはキーボードでも表示できるツールチップです。</div>
const triggers = document.querySelectorAll('.trigger-accessible');
const tooltipContainer = document.getElementById('accessible-tooltip-container');
triggers.forEach(trigger => {
const tooltipId = trigger.dataset.tooltipId;
const actualTooltipContentElement = document.getElementById(tooltipId);
trigger.addEventListener('focus', () => {
if (actualTooltipContentElement) {
showAccessibleTooltip(trigger, actualTooltipContentElement.textContent);
}
});
trigger.addEventListener('blur', () => {
hideAccessibleTooltip();
});
trigger.addEventListener('mouseover', () => { /* ... */ });
trigger.addEventListener('mouseout', () => { /* ... */ });
});
function showAccessibleTooltip(triggerElement, text) {
tooltipContainer.textContent = text;
tooltipContainer.classList.add('visible');
const triggerRect = triggerElement.getBoundingClientRect();
tooltipContainer.style.left = triggerRect.left + window.scrollX + 'px';
tooltipContainer.style.top = triggerRect.bottom + window.scrollY + 5 + 'px';
}
function hideAccessibleTooltip() {
tooltipContainer.classList.remove('visible');
}
上のJavaScriptの例では、showAccessibleTooltip
と hideAccessibleTooltip
という関数で表示・非表示を管理しているよ。実際のツールチップの内容は、トリガー要素とは別の場所に用意しておいて、それを表示するイメージだね。
🗣️ スクリーンリーダーへの対応 (ARIA属性の活用)
スクリーンリーダーは、ウェブページの内容を音声で読み上げてくれるソフトだ。このスクリーンリーダーに、ツールチップの情報をちゃんと伝えてあげる必要があるんだ。
そこで役立つのが「ARIA(アリアと読む)属性」という特別なHTML属性だよ。ARIAは「Accessible Rich Internet Applications」の略で、ウェブアプリケーションのアクセシビリティを高めるための仕様なんだ。
1. role="tooltip"
まず、ツールチップとして機能するHTML要素(ツールチップのテキストが入っている箱)には、role="tooltip"
を指定する。これは「この要素はツールチップですよ」とスクリーンリーダーに教える役割があるんだ。
2. aria-describedby
次に、ツールチップのトリガーとなる要素と、その説明をしているツールチップ本体の要素を関連付けるために、aria-describedby
属性を使うよ。
- ツールチップ本体の要素に、ユニークな
id
属性を付ける(例: id="my-tooltip-content"
)。
- トリガー要素に、
aria-describedby="my-tooltip-content"
のように、ツールチップ本体のid
を指定する。
こうすることで、スクリーンリーダーは「このトリガー要素の説明は、IDがmy-tooltip-content
の要素に書かれていますよ」と理解して、適切に情報を読み上げてくれるようになるんだ。
<button class="trigger-accessible" aria-describedby="tooltip-desc-1">保存ボタン</button>
<div id="tooltip-desc-1" role="tooltip" style="display: none;">
クリックすると現在の内容を保存します。この操作は取り消せません。
</div>
<a href="#" class="trigger-accessible" aria-describedby="tooltip-link-desc">詳細情報</a>
<div id="tooltip-link-desc" role="tooltip" class="visually-hidden">
このリンクは新しいウィンドウで開きます。
</div>
上の例の.visually-hidden
は、CSSを使って画面上では要素を非表示にしつつ、スクリーンリーダーからは読み取れるようにするテクニックで使われるクラス名だよ。ツールチップの表示/非表示をJavaScriptで制御する場合、ツールチップ本体はdisplay:none
やvisibility:hidden
で隠すことが多いけど、ARIAで関連付けられていれば、スクリーンリーダーはトリガーにフォーカスした際にaria-describedby
で指定された内容を読み上げてくれることがあるんだ。
JavaScriptで動的にツールチップを表示する場合、ツールチップコンテナのid
をaria-describedby
に設定し、ツールチップが表示された時にそのコンテナの内容が読み上げられるようにするんだ。
💡 その他の大切なポイント
- 情報は簡潔に: ツールチップは短い補足情報のためのもの。長文にならないように気をつけよう。
- 重要な情報はツールチップだけに頼らない: 本当に大切な情報は、常にページ上で見えるようにするか、他の方法でも伝えられるようにしよう。ツールチップは見逃される可能性もあるからね。
- クリック/タップでも表示: マウスホバーだけでなく、クリックやタップでもツールチップを表示できるようにすると、タッチデバイスのユーザーや、ホバー操作が苦手な人にも優しくなるよ。
- 十分な表示時間: ツールチップが表示されても、すぐに消えてしまったら読めないよね。ユーザーが内容を読むのに十分な時間、表示されるようにしよう。JavaScriptで制御する場合は、
mouseout
やblur
ですぐに消すのではなく、少し遅延させるなどの工夫もできる。
- ツールチップの上にマウスを乗せられるように (必要な場合): もしツールチップの中にリンクなどの操作可能な要素を入れたい場合は、ツールチップ自体の上にマウスカーソルを移動させても消えないようにする工夫が必要だよ(これは少し高度なテクニックになる)。
- Escキーで非表示: ユーザーが意図的にツールチップを非表示にできるよう、Escキーを押したら非表示になる機能を追加するのも親切だね。
✨ アクセシブルなツールチップのデモ
これまでのポイントを踏まえて、キーボード操作とARIA属性に対応したツールチップのデモを見てみよう。下の「設定オプション」というテキストに、Tabキーでフォーカスを当てたり、マウスを乗せたりしてみてね。
🇬🇧英語の豆知識コーナー
アクセシビリティに関連する大切な言葉だよ!
-
Accessibility (よく a11y と略されるよ。 "a" と "y" の間に11文字あるからなんだ!)
意味:アクセシビリティ、利用のしやすさ、近づきやすさ
Original: Web accessibility means that websites are designed so that all people can use them.
意訳:ウェブアクセシビリティとは、全ての人がウェブサイトを利用できるように設計されていることを意味します。
-
Keyboard Navigation
意味:キーボード操作、キーボードナビゲーション
Original: Ensure that all interactive elements are accessible via keyboard navigation.
意訳:全てのインタラクティブ要素が、キーボード操作でアクセス可能であることを確認してください。
-
Screen Reader
意味:スクリーンリーダー(画面読み上げソフト)
Original: Blind users often rely on screen readers to access web content.
意訳:目の不自由なユーザーは、ウェブコンテンツにアクセスするためにスクリーンリーダーに頼ることがよくあります。
-
ARIA (Accessible Rich Internet Applications)
意味:WAI-ARIA とも。アクセシブルなリッチインターネットアプリケーションのための仕様。
Original: ARIA attributes help make dynamic web content more accessible to assistive technologies.
意訳:ARIA属性は、動的なウェブコンテンツを支援技術にとってよりアクセシブルにするのに役立ちます。
-
Focus / Blur
意味:フォーカス(要素がアクティブになること) / ブラー(フォーカスが外れること)
Original: When an input field receives focus, its border color changes. Blur occurs when you click outside.
意訳:入力フィールドがフォーカスを受け取ると、枠線の色が変わります。外側をクリックするとブラーが発生します。
まとめ
今回は、ツールチップをみんなにとって使いやすくするための「アクセシビリティ」について学んだね。
- キーボード操作(
focus
, blur
イベント)に対応することが大切。
- スクリーンリーダーのために、ARIA属性(特に
role="tooltip"
やaria-describedby
)を活用しよう。
- 情報は簡潔に、そしてツールチップだけに頼らないように。
- 表示時間や非表示の方法もユーザーに優しく。
アクセシビリティは、特別な誰かのためだけじゃなく、ウェブサイトを使う全ての人に関わる大切な考え方だよ。ちょっとした工夫で、君の作るツールチップはもっと多くの人に役立つようになるはずだ!
さて、これでツールチップに関する基本的な内容は一通り学んだね。次のページでは、この第2章「ツールチップ」で学んだことをおさらいして、関連する英単語もまとめてチェックしよう!