Tailwindcssでtransitionのアニメーションが動かない問題

Tailwindcssで、棒状にアニメーションを入れてみました。

棒状の図は出てきたのですが、アニメーションが動きません。

なぜアニメーションが動かないのか調査した備忘録です。

目次

Tailwindcssで書いた元々のコード

まず動かなかったコードを公開します。

HTML
<div class="w-full bg-gray-200 rounded-full h-4 overflow-hidden">
  <div id="rate-bar"
    class="h-4 w-full rounded-full transition-all duration-700 bg-blue-500" style="width: 80%;">
  </div>
</div>

アニメーションはTailwindcss の transition-property の transition-all で指定しています。

trasition-all の定義はCSSでいう

  • transition-property: all;
  • transition-timing-function: var(–default-transition-timing-function);
    (cubic-bezier(0.4, 0, 0.2, 1) と同じ)
  • transition-duration: var(–default-transition-duration);
    (150ms と同じ)

の3つのプロパティを書いたのと同じ効果があります。

また、transition-duration が150ms だと早すぎると思い、

duration-700(transition-duration:700ms;)も合わせて指定しています。

このプロパティが指定されているのに、アニメーションが動かないのは何故?

原因:widthの指定がまずかった

原因は width の指定にありました。

やりたいこととしては、width を 0% を徐々に 80% にしてアニメーションしてもらいたかったのに、

画面が描画された時点で既にwidth が80%になっているので、何も変化が起きていない故、

アニメーションする対象がないと判断されていたようです。

どうすれば動かせる?

上記の理由から、0% → 80% に width を動かす必要があります。

これをやらないと trasition-all が発火しません。

手段①

考えた結果、HTMLでは0%、JavaScriptでページロードされた後に80% に変更する手段をとることにしました。

先述のHTMLに加えて、下記のJavaScriptを追加します。

JavaScript
document.addEventListener('DOMContentLoaded', () => {
  const bar = document.getElementById('rate-bar');
  bar.style.width = '80%';
});

width を 変更したことで trasition-all が発火します。

やってみると、綺麗にアニメーションを動かすことが出来ました。

もっと綺麗にするなら

ページがロードされたと同時にアニメーションが動いてしまうので、

ページロード後、少し遅らせてからアニメーションを発火させる方法もあります。

JavaScript
document.addEventListener('DOMContentLoaded', () => {
  const bar = document.getElementById('rate-bar');
  setTimeout(() => {
  bar.style.width = '80%';
}, 100);
});

少しスタイリッシュな印象になりました。

手段②

styleを使わずに、クラスだけで制御する方法もあります。

(TailwindcssV4だと動かない場合があるのでおすすめはしません

クラスは w-[number] を使います。

HTML
  <div class="w-full bg-gray-200 rounded-full h-4 overflow-hidden">
    <div id="rate-bar"
      class="h-4 w-full rounded-full transition-all duration-700 bg-blue-500 w-0">
    </div>
  </div>
JavaScript
document.addEventListener('DOMContentLoaded', () => {
  document.getElementById('rate-bar').classList.add('w-[80%]');
});

この方法で出来ない場合は手段①をおすすめします。

おわりに

今回は、Tailwindcss+JavaScriptを使ったアニメーションをご紹介しました。

まとめると、

  • transition は「変化」がないと動かない
  • 初期値(0%)を用意 → JavaScript で後から変更
  • Tailwind + style + JavaScript の合わせ技が正解

ということでした。

私のnpxで作ったTailwindcssのcssには transition-all や duration-700 が載っていなかったので、手動で追加しました。

もし動かない場合、これらのクラスがあるかどうかも確認してみてください。

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