TailwindCSS is a popular utility-first CSS framework, which makes it easier to design your websites. In this article, I will cover how we can create custom utility classes to provide animations to the web elements.

TailwindCSS comes packed with a few animation utility classes like animate-spin, animate-pulse, animate-ping and others.

Using the class is fairy simple you just have to add the utility class to your element and the element will show the animation effect.


<button type="button" class="flex items-center rounded bg-indigo-500 p-2 text-white" disabled>
  <svg aria-hidden="true" class="mr-2 h-5 w-5 animate-spin fill-blue-600 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg">
    <path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor" />
    <path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill" />
  </svg>
  Processing..
</button>

We have applied the animate-spin utility class on the svg icon. This should produce following output
animation-button-tailwindcss

This works great, but how about when you want a custom animation for which tailwind does not have a utility class yet. Well, creating new utility classes for animation is simple and here is how we do it.

Custom utility class for Animations in TailwindCSS

To demonstrate creating custom animations, lets take an example of a progress bar where in we show the loading status using an animation.

First we will see how the animation works in pure CSS, and then we will trasform it to a tailwind utility class.

We first define the structure of our progress bar using HTML element and some basic tailwind styling


<div class="relative h-4 rounded-full bg-gray-300 overflow-hidden">
    <div id="progress" class="absolute h-full w-1/2 rounded-full bg-green-500"></div>
</div>

which gives us the following output.

progress bar tailwind

Next step is that we want to show this as a loading progress bar by moving the green bar from left to right and right to left continuously.

Let's sprinkle some CSS to achieve that.


@keyframes loading {
  0% {
    left: -100%;
  }
  50% {
    left: 100%;
  }
  100% {
    left: -100%;
  }
}

#progress {
  animation: loading 3s linear infinite;
}

Notice that we have defined a new animation named loading using keyframes in CSS, inside which we have defined the position of the element at different percentage of the animation.
We have then used the loading animation to run for 3 seconds and for infinite amount.

This results into following output.

Let's transform this animation into a tailwind utility class.

Open the tailwind.config.js file , which should be located in the root of the project directory.

Add the keyframe and animation class in the extend object the file.


..
  theme: {
    extend: {
      keyframes: {
        loading: {
          '0%': { left: '-100%' },
          '50%': { left: '100%' },
          '100%': { left: '-100%' },
        },
      },
      animation: {
        loading: 'loading 3s linear infinite',
      },
    },
..

We can now use the animate-loading utility class on our html elements to animate it.


<div class="max-w-screen-sm p-10">
    <div class="relative h-4 overflow-hidden rounded-full bg-gray-300">
      <div id="progress" class="animate-loading absolute h-full w-1/2 rounded-full bg-green-500"></div>
    </div>
  </div>
  

This should result into the same animation behaviour.

That's about it, You can read more about the tailwind animation in the official docs