Tooltip(ツールチップ)
Tooltip は、ボタンなどにマウスを乗せたりキーボードで選んだりしたときに、短い説明を小さく出す UI コンポーネントです。向き・待ち時間・色の変え方をまとめます。
Tooltip は、ボタンなどにマウスを乗せたときや、キーボードで選んだときに、短い補足の文字を小さく出すコンポーネントです。出す・消すは CSS だけで行い、JavaScript は Esc キーで閉じるときにだけ使います。
どんなときに使う?#
- アイコンだけのボタンに、何をするボタンかを添えたいとき
- 「ショートカット:Ctrl+S」のような、ちょっとした補足を見せたいとき
窓の中にリンクやボタンを置きたいときは、押して開く Popover(クリックで開く小窓) を使います。
使い方#
b--tooltip の箱の中に、きっかけになるボタン(b--tooltip_trigger)と、出す文字(b--tooltip_popup)をこの順で入れます。ボタンの aria-describedby と、文字の id に同じ名前を書きます。文字には role="tooltip" を付けます。
表示例
<span class="b--tooltip">
<button class="-bd -px:15 -py:5 -bdrs:10 b--tooltip_trigger set--plain" type="button" aria-describedby="demo-tt-1">保存</button>
<span class="b--tooltip_popup" role="tooltip" id="demo-tt-1" data-side="top" data-align="center">ショートカット:Ctrl + S</span>
</span>
| クラス | 付ける場所 |
|---|---|
b--tooltip |
全体を包む箱 |
b--tooltip_trigger |
きっかけになる要素(ふつうは button) |
b--tooltip_popup |
出す文字 |
出るのは2つの場合です。全体の箱(b--tooltip)の上にマウスがあるときと、ボタンがキーボードで選ばれているとき(:focus-visible)です。マウスをボタンから出てきた文字のほうへ動かしても、文字は残ります。
Esc キーで文字をすぐ消すこともできます。消したあとは、マウスか選択をいちど外へ出して戻せば、また出ます。消した状態かどうかは、b--tooltip に付く data-dismissed 属性で見分けています。
Esc で閉じる動きには、@lism-css/ui のスクリプト(dist/scripts/tooltip.js)を読み込みます。
- HTML の順番は「ボタン → 文字」にします。キーボードで選んだときに文字を出す CSS は、ボタンの後ろにある兄弟の要素しか選べません。逆に並べると、キーボードでは出なくなります
- きっかけの要素は、Tab キーで選べるものにします。
spanなどにするならtabindex="0"を足します(buttonならそのままで選べます) - 指で画面をさわる機器にはマウスを乗せる操作がないので、文字が見られないことがあります。なくてはならない情報は、ほかの場所にも書いておきます
- 文字の中にはリンクやボタンを入れません。押せるものを入れたいなら Popover にします
出る向きとそろえ方#
文字の data-side で出る向きを、data-align でそろえる位置を決めます。
| 属性 | 値 | 初期値 |
|---|---|---|
data-side |
top(上)・bottom(下)・start(左)・end(右) |
top |
data-align |
start・center・end |
center |
表示例
<div class="l--cluster -g:10">
<span class="b--tooltip">
<button class="-bd -px:15 -py:5 -bdrs:10 b--tooltip_trigger set--plain" type="button" aria-describedby="demo-tt-2">上</button>
<span class="b--tooltip_popup" role="tooltip" id="demo-tt-2" data-side="top" data-align="center">top</span>
</span>
<span class="b--tooltip">
<button class="-bd -px:15 -py:5 -bdrs:10 b--tooltip_trigger set--plain" type="button" aria-describedby="demo-tt-3">下</button>
<span class="b--tooltip_popup" role="tooltip" id="demo-tt-3" data-side="bottom" data-align="center">bottom</span>
</span>
<span class="b--tooltip">
<button class="-bd -px:15 -py:5 -bdrs:10 b--tooltip_trigger set--plain" type="button" aria-describedby="demo-tt-4">右</button>
<span class="b--tooltip_popup" role="tooltip" id="demo-tt-4" data-side="end" data-align="center">end</span>
</span>
<span class="b--tooltip">
<button class="-bd -px:15 -py:5 -bdrs:10 b--tooltip_trigger set--plain" type="button" aria-describedby="demo-tt-5">下・左寄せ</button>
<span class="b--tooltip_popup" role="tooltip" id="demo-tt-5" data-side="bottom" data-align="start">bottom / start</span>
</span>
</div>
data-sideがtop・bottomのときは、data-alignが横のそろえ方になります。左から右へ書くページ(dir="ltr")ではstartが左寄せ、endが右寄せで、右から左へ書くページ(dir="rtl")では逆になりますdata-sideがstart・endのときは、data-alignが縦のそろえ方になり、startが上、endが下ですdata-sideのstart・endも書く向きに合わせて決まり、dir="ltr"ではstartが左、endが右です- どの向きでも、画面のはしに入りきらないときは、自動で反対側に出ます
専用の変数#
どれも b--tooltip(またはその外側の要素)に書きます。文字(b--tooltip_popup)に書いても効きません。
| 変数 | 決めること | 初期値 |
|---|---|---|
--tooltip-offset |
ボタンと文字のあいだのすきま | var(--s5) |
--tooltip-delay |
出るまでの待ち時間 | 0.4s |
--tooltip-delay--close |
消えるまでの待ち時間(ボタンから文字へマウスを動かすあいだ、消えないようにする) | 0.15s |
--tooltip-duration |
ふわっと変わる時間 | 0.15s |
--tooltip-arrow |
吹き出しの矢印の高さ(0 で矢印なし) |
4px |
動きを減らす設定(prefers-reduced-motion: reduce)の画面では、ふわっと変わる時間は 0s になります(待ち時間はそのままです)。
表示例
<div class="l--cluster -g:10">
<span class="b--tooltip" style="--tooltip-delay:0s">
<button class="-bd -px:15 -py:5 -bdrs:10 b--tooltip_trigger set--plain" type="button" aria-describedby="demo-tt-6">すぐ出る</button>
<span class="b--tooltip_popup" role="tooltip" id="demo-tt-6" data-side="top" data-align="center">待ち時間 0 秒</span>
</span>
<span class="b--tooltip" style="--tooltip-delay:1s;--tooltip-offset:1rem">
<button class="-bd -px:15 -py:5 -bdrs:10 b--tooltip_trigger set--plain" type="button" aria-describedby="demo-tt-7">1秒後に出る</button>
<span class="b--tooltip_popup" role="tooltip" id="demo-tt-7" data-side="top" data-align="center">すきま 1rem</span>
</span>
</div>
色を変える#
はじめの見た目は、背景が --text(文字の色)、文字が --base(背景の色)の、色を入れかえた形です。色・余白・角丸・影は、文字の要素に -bgc・-c・-p・-bdrs・-bxsh などのクラスを付けて変えます。
表示例
<span class="b--tooltip">
<button class="-bd -px:15 -py:5 -bdrs:10 b--tooltip_trigger set--plain" type="button" aria-describedby="demo-tt-8">色を変えた例</button>
<span class="b--tooltip_popup -bgc:base-2 -c:text -bd -p:15 -bdrs:10 -bxsh:20" role="tooltip" id="demo-tt-8" data-side="top" data-align="center">背景と文字の色、余白を変えています。</span>
</span>
ブラウザによる違い#
文字をボタンのそばに置くのには、CSS Anchor Positioning(ある要素を目じるしにして、別の要素の位置を決める CSS のしくみ)を使っています。
- Firefox ESR 140 のように、このしくみを使えないブラウザでは、
b--tooltipの箱を基準にした位置に出ます。そのときは、はしで反対側に出る動きが無いので、文字が切れて見えることがあります。--tooltip-offsetのすきまも効きません - Firefox 147 以降では位置は正しく決まりますが、消えるときのふわっとした動きと
--tooltip-delay--closeの待ち時間が効かず、マウスを外すとすぐ消えます(出るときの動きと待ち時間は効きます)
しくみ#
おもな CSS は次のとおりです(位置を決める部分は長いので省いています)。
.b--tooltip {
--duration: var(--tooltip-duration, 0.15s);
--delay: var(--tooltip-delay, 0.4s);
--delay--close: var(--tooltip-delay--close, 0.15s);
--offset: var(--tooltip-offset, var(--s5));
--arrow-sz: var(--tooltip-arrow, 4px);
display: inline-block;
}
.b--tooltip_popup {
--lh: 1.25;
z-index: 10;
inline-size: max-content;
max-inline-size: min(20rem, 90vw);
padding: 0.375em 0.625em;
border-radius: var(--bdrs--10);
background-color: var(--text);
color: var(--base);
font-size: var(--fz--s);
visibility: hidden;
opacity: 0;
}
.b--tooltip:hover > .b--tooltip_popup,
.b--tooltip_trigger:focus-visible ~ .b--tooltip_popup {
visibility: visible;
opacity: 1;
transition-delay: var(--delay);
}
.b--tooltip[data-dismissed] > .b--tooltip_popup {
visibility: hidden;
opacity: 0;
}
文字の幅は中身に合わせて決まり、いちばん広くても 20rem か画面の幅の 90% までです。
React・Astro で書く場合#
@lism-css/ui/react/Tooltip(Astro は @lism-css/ui/astro/Tooltip)から Tooltip を読み込みます。部品は <Tooltip.Root>・<Tooltip.Trigger>・<Tooltip.Popup> です。<Tooltip.Root> の中に並べると、aria-describedby と id が自動でつながります。
import { Tooltip } from '@lism-css/ui/react/Tooltip';
<Tooltip.Root tooltipId="tt-01" delay="0s">
<Tooltip.Trigger className="-bd -px:15 -py:5 -bdrs:10">保存</Tooltip.Trigger>
<Tooltip.Popup side="bottom">ショートカット:Ctrl + S</Tooltip.Popup>
</Tooltip.Root>
| Props | 決めること |
|---|---|
tooltipId |
<Tooltip.Root> 用。ボタンと文字をつなぐ名前。書かなければ自動で作られる |
delay |
<Tooltip.Root> 用。出るまでの待ち時間(--tooltip-delay になる) |
offset |
<Tooltip.Root> 用。ボタンと文字のすきま(--tooltip-offset になる) |
side |
<Tooltip.Popup> 用。出る向き(data-side になる。初期値 top) |
align |
<Tooltip.Popup> 用。そろえ方(data-align になる。初期値 center) |
tooltipId・id |
<Tooltip.Trigger> の tooltipId と <Tooltip.Popup> の id。<Tooltip.Root> を使わず、部品を離して置くときだけ書く |
<Tooltip.Root> の中では、<Tooltip.Trigger> や <Tooltip.Popup> に名前(tooltipId・id)を書かないでください。一部だけに書くと、つながりが切れます。名前を決めたいときは <Tooltip.Root> の tooltipId だけを使います。
関連するページ#
- Popover(クリックで開く小窓):押して開く小窓
- Button(ボタン):きっかけにするボタン
- UI コンポーネントの使い方:読み込み方
公式ドキュメント
2026年10月5日時点の内容(lism-css 1.0.1・@lism-css/ui 0.40.1)をもとに、やさしい日本語でまとめています。