27
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

うちのフロントがvueでテクニカルなツールチップ作ってて、やるぅ〜って思った話

Last updated at Posted at 2023-08-25

概要

いやいや、vueでツールチップ作ろうと思えば簡単に作れるよね。
v-ifとか、detailsとか使えば余裕っすやん。
ってお思いの方は多いはず。

でも、難しいのが、

表示箇所以外をクリックした時に表示が消えるようにする。

そう、これが入ると一筋縄ではいかなくなるんよな。
(でもツールチップといえばこれはいれたい)

まあ、一旦ツールチップのコンポーネントを作っちゃえば、
それ使い回すんけど、そこまではいらないし、簡単に実装できちゃうやつが欲しい。
そんなことを思いながら、日々開発してたら、
うちのフロントエンドが作ってきたツールチップがかなりテクニカルやった。
(どっかで調べて拾ってきたんかな)

ちなみにtailwindとvueのgroup機能使ってる。
とりあえず、コードみてほしい。
(わかる人にはわかると思う)

.vue

  <div class="group" tabindex="0">
    <span>表示ボタン</span>
    <div class="invisible opacity-0 group-focus:visible group-focus:opacity-100">
    ここは表示させる中身
    </div>
  </div>

ワイ、これ見た時は「なんかよくわかんねー!まあいっか動いてるし笑」って思ってた。
しかしよく見ると@clickとかないし、内心どうやってるんやろ。。。とは思いながら、そのまま触れへんかってん。

でも今日、さっき、今、「やっぱツールチップ必要やんここ!」って場面があって、
彼が作ったツールチップの記述を紐解くことにした。

すると色々調べてて完全理解したあとに「なんやこれやべー!」
って感動してしまった。んで今これ書いてる。

仕様の説明

結論からいうと、

group-focusでフォーカスされてる時の状態で表示・非表示を切り替えてた。

vueのgroupやpeerの機能って、対象の状態によってその対象の子要素とか兄弟要素のcssを噛ませることができんねん。
だから今回のでいうと、class="group"のdivが対象で、
そいつのfocus/focus-outで、group-focusしてるdivの表示・非表示を切り替えてるって仕様。

さらに、ここが一番やるぅー!って思ったところなんやけど、
divとかspanってfocusできへんのよ。
なので、はじめ理解してないから、focusが効かなくて動かない。
そして、子要素のdivを無理やりlabelにしたりして悪いことしてる気分になった。笑

ここがミソでdivにtabindex="0"付けてfocusできるようにしてるねん。
やべー!
tabindexってあんま使わんし、使うとしてもキー操作できるようにする時くらいか。

まあなんにせよ、よく考えたなって思う。深く思う(だいぶ褒めてる)

ちなみにこの記述は装飾cssをあえて省いている説明用のタグなので、
使いたい人はお好みに装飾してください。

今回はtailwindでやったけど、
工夫したらチェックボックスのcheckedで判別して、labelやらfocus-withinやら使ったら
普通のcssでも実装できそうな気がするとかしないとか。

27
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?