「ツールチップ チョットデキル」になりたい

:::note
今回は`素のHTML`でのツールチップについての内容です。

概要
- 分かりやすいアイコン、ラベルで表現できればツールチップは不要
- デフォルトのブラウザのツールチップよりもARIAのツールチップの方がフォーカス、タッチ時に表示できる点で優れている
- ツールチップには以下の２つの用途がある
    - ラベル
    - 補助的な説明
- トグルチップというものもあってこれは、アイコン自体を補助的にするという点がツールチップと異なる
:::

# 1. 背景
最近ツールチップの実装をRvすることがあリました。
これを機にツールチップについて調べてみます。

# 2. MDN, ARIA Authoring Practices Guide (APG)

https://w3c.github.io/aria/#tooltip

https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/tooltip_role

### ブラウザのデフォルトのツールチップ

https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/title

demo
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="xxeeGQO" data-user="uuylkesg-the-styleful" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/uuylkesg-the-styleful/pen/xxeeGQO">
  BROWSER NATIVE TOOLTIP</a> by 山根大生 (<a href="https://codepen.io/uuylkesg-the-styleful">@uuylkesg-the-styleful</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

長いマウス・ホバーで要素のタイトル属性を表示する方法です。
キーボード・フォーカスやタッチ操作ではタイトル属性を表示できません。

### ARIA tooltip roleを使ったツールチップ

demo
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="xxeBoLX" data-user="uuylkesg-the-styleful" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/uuylkesg-the-styleful/pen/xxeBoLX">
  MDN DEMO TOOLTIP</a> by 山根大生 (<a href="https://codepen.io/uuylkesg-the-styleful">@uuylkesg-the-styleful</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

- 説明される要素のaria-describedby属性にツールチップの要素のidの値を指定する
- ツールチップには`role=tooltip`を付与する
- Escキーを押された時にツールチップを非表示にする

 ### 動作
- ある要素にフォーカスが当たった時や、その要素にカーソルが当たった時に、その要素に関する文脈情報を提供する
- 短い遅延の後に自動的に表示する
- フォーカスが失われるか、マウスが離れると自動的に閉じられる
- マウスがツールチップの上に移動したときにも開いたままでなければならない
- ユーザーがEscapeキーを押したときに閉じられる

### ユースケース
- 要素の説明を表示する
- 一般的にはツールやコントロールのためのチップで、簡単なラベルを持つアイコン（または全くラベルがない）のための追加コンテンツを提供する
- リンク、入力、ボタンのようなインタラクティブな要素を含まない

:::note
そもそも使う必要がなければ使わないことを推奨されていました。
>スペースがあれば、ツールチップやトグレットチップは使わないでください。
ツールチップを使って重要な情報を隠す代わりに、明確で簡潔な、常に見える説明を書くことを考えましょう。

例）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/cea938bf-beed-7008-c8ab-0f4fb71fda91.png)
[画像引用元](https://inclusive-components.design/content/images/2017/07/text_layouts-1.svg)

どこかでこの形見たことあるなと思ったらスマホのホーム画面で表示されるアプリのアイコンとテキストでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/027b3ea4-8a5b-1140-5fc4-4563de1ad686.png)
:::

# 3. MDNの参考のリンクに載っていたHeydon Pickeringさんの記事

https://x.com/heydonworks

フロントエンド開発者、デザイナー、テクニカルライター。
特にアクセシビリティとインクルーシブデザインの実践に重点を置き、ウェブデザインに関する複数の書籍の執筆・編集を通じてこの分野に貢献されている方です。

:::note
2017年の記事となっています。
[こちら](https://book.inclusive-components.design/)に最新で本として販売されているそうです
:::
前節で紹介したMDNの参考欄にHeydon Pickeringさんの記事がありましたので紹介します。

https://inclusive-components.design/tooltips-toggletips/

ツールチップとトグルチップについて分けて説明されていましたので、同様にその順で説明します。

### 動作（記事のツールチップの動作から推測）
- 要素のホバー時、フォーカス時に表示される
- 要素からマウスリーブ、フォーカスアウト時に非表示になる
:::note
ホバー時:マウスを使用するユーザ
フォーカス時:スクリーンリーダーを使用するユーザ

スクリーンリーダーについては[こちら](https://freee.github.io/a11y-training/screen-reader/)
スクリーンリーダーを使うと、画面上の情報を、音声や点字を使って読むことができます。
:::

明確なラベル、説明と見慣れたアイコンの場合、ツールチップは基本的に必要ないそうです。

仮にツールチップを使う場合以下2つを紹介されていました。

### プライマリラベルとしてのツールチップ

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="xxeeKEb" data-user="uuylkesg-the-styleful" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/uuylkesg-the-styleful/pen/xxeeKEb">
  TOOLTIP AS PRIMARY LABEL</a> by 山根大生 (<a href="https://codepen.io/uuylkesg-the-styleful">@uuylkesg-the-styleful</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

>Note the use of the tooltip role. In practical terms, all this role offers is an assurance that aria-describedby works reliably where supported. As Léonie Watson writes, ARIA labels and descriptions sometimes don't work with all elements unless you incorporate an appropriate role. In this case, the most important role is the implicit button role of the subject <button> element, but role="tooltip" may extend support for this labeling method in some software.

:::note
>role="tooltip"を使用することで、ツールチップの内容を説明するaria-describedby属性が、スクリーンリーダーなどの支援技術に対してより信頼性を持って認識され、障害を持つユーザーにとっても役立つ情報として機能するようになる

と言っているようで、実は今回aria-labelledbyを使われています。
上の解説の意味がよく分かりませんでした。
aria-describedbyでもスクリーンリーダーの読み上げはされていますし。

aria-labelledby,aria-describedbyには以下の違いがあリます。
ラベルとして使うのをブラウザに伝えるためにaria-labelledbyを使われているのかなと思いました。

- aria-labelledby:オブジェクトの本質を記述するラベル
- aria-describedby:ユーザーが必要とするかもしれないより詳細な情報を提供する記述
:::

https://developer.mozilla.org/ja/docs/Web/Accessibility/ARIA/Attributes/aria-describedby

### 補助説明としてのツールチップ

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ExJJjmx" data-user="uuylkesg-the-styleful" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/uuylkesg-the-styleful/pen/ExJJjmx">
  Untitled</a> by 山根大生 (<a href="https://codepen.io/uuylkesg-the-styleful">@uuylkesg-the-styleful</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

aria-describedbyを使用する際はtooltipにはラベルは含めないです。
そのため、ボタン内に隠されたスパンを追加します。
```html
<span class="visually-hidden">Notifications</span>
```

```css
.visually-hidden {
  clip-path: inset(100%);
  height: 1px;
  overflow: hidden;
  position: absolute;
  white-space: nowrap;
  width: 1px;
}
```
- clip-pathプロパティ
    要素のどの部分を表示するかを設定するクリッピング領域を作成します
    領域の内側にある部分は表示され、外側にある部分は非表示になります
    今回は全てを非表示にしています
:::note
[mdn](https://developer.mozilla.org/en-US/docs/Web/CSS/clip)を見た所、clipはdeprecatedとなっていて、clip-pathへの書き換えを勧められています
:::

:::note
要素を視覚的に画面から隠しつつ、スクリーンリーダーのような支援技術で読み取り可能にしています。
:::
### ユーザの成熟度に合わせた使い分け

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/6ec19121-724f-0e11-cf39-dda037e78645.png)
New user(初心者)
- テキストを常時表示

Established User(使い方が分かっているユーザ)
- アイコンのみを表示
- それまでに、アイコンが何を表しているのかを学習しているはずだから

ツールチップを使わない事になりましたが、これが最善だと説明されていました。
ユーザーが最初に何をするのかよく分からずにアイコンを押した場合を懸念されていました。

ユーザーがアイコンをクリックして新しいページに移動した時、そのページの目的や内容が一目でわかるように、見出しを明確にすることが重要だと説明しています。

:::note
これを実際どのように実現するか例を考えてみました

- ユーザーにモード（初心者、熟練者）を選択させる
- トラッキングでどれくらい機能を使っているか計測して成熟度を判定する
:::

### Toggletip（トグルチップ）

トグルチップについての説明が書かれていましたので紹介します。

demo
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="zdYdQv" data-user="heydon" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/heydon/pen/zdYdQv">
  Toogletip</a> by Heydon (<a href="https://codepen.io/heydon">@heydon</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

特徴
- 補足情報または明確な情報を提供できるという意味でツールチップに似ています
- 一般的に小さな「i」アイコンの形をとります
- ただし、アイコン自体を補助的にするという点がツールチップと異なります
- 「i」アイコンをホバーやフォーカスではなくクリックするとトグルチップが表示されます
- トグルという名前ですが、ボタンをクリックしてバブルを表示または非表示にするのではなく、バブルを表示するだけです
- ボタンのフォーカスを解除するか、ボタンから離れてマウスをクリックするか、Esc キーを押すとトグルチップが非表示になります

:::note
トグルチップでのaria-describedby属性の使用は適切ではないです

aria-describedby属性はスクリーンリーダーなどの支援技術を使用している人々が、ボタンなどの要素に関する追加情報にアクセスできるようにするためのものです。
しかし、トグルチップがクリックやタッチでのみ表示されるようになっている場合、aria-describedbyはもはや適切な手段ではありません。
スクリーンリーダーのユーザーはボタンを押す前に情報にアクセスできるため、ボタンを押しても何も行われないように見えるからです。
ボタンを押してもツールチップが表示されないと、そのボタンが何のためにあるのかが明確でなく、ユーザーが混乱する可能性があるということです。
:::

ARIA ライブリージョン
動的なコンテンツの変更をスクリーンリーダー等の支援技術により通知させる方法です。

https://developer.mozilla.org/ja/docs/Web/Accessibility/ARIA/ARIA_Live_Regions

`role="tooltip"`はライブリージョンは適用されないので、今回は`role="status"`を使用しているとのことです。

# 参考
- [ツールチップ コンポーネントの作成](https://web.dev/articles/building/a-tooltip-component?hl=ja)
- [階層メニューやトーストUIが簡単に作れる新技術！　JavaScriptで利用するポップオーバーAPI](https://ics.media/entry/230530/)
- [Qiitaで記事にCodePenが埋め込めるようになりました](https://qiita.com/Qiita/items/edae7417214c8e957f54)
- [dialog要素をEscキーでcloseした際にoverflow:hiddenを解除したい](https://qiita.com/yamatai12/items/43f2613a5556674542a4)
- [ツールチップについて考える](https://accessible-usable.net/2018/10/entry_181020.html)
- [アクセシブルなツールチップとトグルチップ](https://postd.cc/complete-guide-accessible-front-end-components-2/#accessible-tooltips-and-toggletips:~:text=%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B7%E3%83%96%E3%83%AB%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB%E3%83%81%E3%83%83%E3%83%97%E3%81%A8%E3%83%88%E3%82%B0%E3%83%AB%E3%83%81%E3%83%83%E3%83%97)
- [完全に理解した、TooltipとPopoverの違い](https://zenn.dev/magicmoment/articles/difference-tooltip-and-popover)

# Heydon Pickeringさんの本
- [コーディングWebアクセシビリティ: WAI-ARIAで実現するマルチデバイス環境のWebアプリケーション](https://www.amazon.co.jp/%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0Web%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B7%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3-WAI-ARIA%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E3%83%9E%E3%83%AB%E3%83%81%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E7%92%B0%E5%A2%83%E3%81%AEWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-Heydon-Pickering-ebook/dp/B06XWC1TWC/ref=sr_1_1?dib=eyJ2IjoiMSJ9.Hw6BVmd6WPpIQwHg7Wk1BJfmKEU_25Vv16GawvLtbRM.oISWPGF4dA2uu9K-arciZNWjfCtswf6XzN1p0kCCtVI&dib_tag=se&qid=1714227636&refinements=p_27%3AHeydon+Pickering&s=books&sr=1-1)
- [インクルーシブHTML+CSS & JavaScript: 多様なユーザーニーズに応えるフロントエンドデザインパターン](https://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%B7%E3%83%96HTML-JavaScript-%E5%A4%9A%E6%A7%98%E3%81%AA%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%83%8B%E3%83%BC%E3%82%BA%E3%81%AB%E5%BF%9C%E3%81%88%E3%82%8B%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Heydon-Pickering-ebook/dp/B07B4WLSDK/ref=sr_1_2?dib=eyJ2IjoiMSJ9.Hw6BVmd6WPpIQwHg7Wk1BJfmKEU_25Vv16GawvLtbRM.oISWPGF4dA2uu9K-arciZNWjfCtswf6XzN1p0kCCtVI&dib_tag=se&qid=1714227636&refinements=p_27%3AHeydon+Pickering&s=books&sr=1-2)

:::note
「Inclusive Design Patterns」はPDFで公開されていました
https://nmu.edu/nmudev/sites/nmudev/files/2020-06/inclusive-design-patterns_0.pdf
:::
買って読んでみます🦍

# 最後に
- スクリーンリーダーの機能を意識した実装をした経験がないのでとても勉強になりました
- ブラウザのデフォルトのツールチップとARIAのツールチップの違いを知れて勉強になりました
- ツールチップ以前に分かりやすいアイコン、ラベルでデザインすることがまず大切だなと思いました
- Heydon Pickeringさんの記事だとEscキーでツールチップは閉じなくても大丈夫というように取れました
- aria-labelledby,aria-describedbyの使い分けを意識したいです
- アクセシビリティについて意識した実装の為にもARIAについて理解したいです
- 解釈しきれてない所もあるのでまたこの記事を改善します

本記事を読んで頂き、ありがとうございました。
いいねいただけると記事執筆の励みになりますので、参考になったと思われた方は是非よろしくお願い致します🙏

:::note
次回投稿予定の記事
- Inclusive Design Patternsとは
- 「Webアプリケーションアクセシビリティ──今日から始める現場からの改善」を読んでみた
- MUI等のライブラリでの定義、推奨される使い方についてまとめた記事
- popoverとの使い分け

修正予定
- Heydon PickeringさんのPDF,本を読んでみてその内容を反映させます
:::