hoverすると下線が引かれるアニメーションを作ろう

Tailwindcss では class に 「underline」 と書くだけで下線を引いてもらえる便利な機能がある。

けれども、パッと瞬間的に下線が引かれる。

それは当たり前だろと思われるかもしれないけれど、これもアニメーションで

左から右へ下線を引くことが出来ないかな?と思ったのでいろいろ探してみました。

目次

underline の定義

Tailwindcss のリファレンスを参照すると、

Tailwindcss の underline = CSS の text-decoration-line: underline;

と同じと書いてある。

これをどうにかして・・・と思ったけれど、CSSでアニメーションって出来るの?

と思い、一旦JavaScriptで下線を引けないか考えてみることにした。

JavaScript で 下線を引けないか考えてみる

JavaScript で下線を引くには下記の記述で出来た。

JavaScript
document.getElementById('test').style.textDecoration = 'underline';

ん、でもこれじゃさっきの CSS と同じだよね?

うーん、もうコンパイルされている underline 自体をアニメーションにするのは無理そう。。。

それならば、始点と終点を指定して、それをアニメーションにするしかないと思った。

しかし、ドキュメントを読んでも、どうにもアニメーションの使い方が分からず

この方法も断念せざるを得なかった。

JavaScript
document.addEventListener('mouseover', function() {
  document.querySelector('#test').animate(
    {
      translate: ['calc(-100% - 1rem)', 0]
    },
    {
      duration: 700,
    }
  );
});

↑ダメだったコード。

どこかから飛んでくる上に、既に線が引かれている。

もしかして、JavaScriptじゃダメ?

もう一度 Tailwindcss で下線を引くアニメーションが出来ないか考えてみる

JavaScript 難しすぎる・・・ということでもう一度 Tailwindcss で考えてみることにしました。

始点: hover される前が left が 0

終点:hover されたら徐々に動いて left が 100

のようになる線を引いてくれるアニメーションということ、これが実現できればOK。

実際、出来ました!

HTML
<div id="parent" class="group relative inline-block text-2xl px-1">
  test
  <span id="child"
    class="absolute left-0 bottom-0 h-[2px] w-full
           scale-x-0 origin-left
           bg-red-500
           transition-transform duration-700
           group-hover:scale-x-100">
  </span>
</div>

まとめると、

  • relative – absolute で下線が引かれる位置を固定
  • left-〇:下線を引く位置(今回は0。指定しないと、文字列の後ろから引かれる)
  • scale-x-〇〇アニメーションを行う下線の位置
    始点(hover前)は0、終点(hover後)は100
  • origin-〇〇:アニメーション自体をどこから行うか(今回は左位置からやりたいので left )
  • transition-transform:アニメーションの指示
  • group-hover:class で 「group」が指定してある場所からhoverされているか判定する
    (これが無いと下線が引かれない)

子要素にするものを<span>タグでインライン要素を作る(これ超重要)

②その親要素(上記で言うと<div>タグ)の class を group でグルーピング

group-hover:(<span>タグだけでなく親要素)で終点まで線を伸ばす

といった流れで下線をアニメーションさせることが出来ました。

やったー!!

アニメーションは分かりづらいと思うので、CSS に書き直して CODE PEN で見られるように作ってみました。

「test」と書いてある箇所にマウスオーバーしてみてください。

See the Pen underline animation by gulf_stream (@Hitomi-Kuge) on CodePen.

CSSに直す上で分かりにくかったのが、group と group-hover:。

いろいろ考えて出した結論が

  • group = ただの飾り文字
  • group-hover: = <親>:hover <子>

でした(2時間ぐらい悩んだ)

おわりに

今回は hoverするとTailwindcss や CSS で下線を引かれるアニメーションの作り方の過程をご紹介しました。

Tailwindcss や CSS でここまでちゃんとアニメーションが作れるとは・・・侮れませんね(汗)

今回はただの<div>タグに施しましたが、<a>タグに入れればおしゃれなサイトが出来ると思いますよ!

機会があれば、JavaScript でも出来る方法がないか考えてみようと思います。

  • URLをコピーしました!
目次