Published on

Show/Hide Transitions with Tailwind and Next.js

Authors
  • Name
    Ripal & Zalak
    Twitter

Creating Show/Hide Transitions with Tailwind CSS and Next.js

If you want to create smooth transitions for showing and hiding elements in your Next.js application using Tailwind CSS, this guide will help you achieve it. We'll focus on using Tailwind's opacity, transition, and conditional rendering effectively.


The Problem

Using visibility or display for transitions can be tricky because they lack intermediary states for animations. For example, when you toggle an element with visibility: hidden or display: none, it instantly disappears or appears without any transition.

A better approach is to use opacity because it allows you to animate the element’s visibility smoothly.


Step-by-Step Solution

1. The Component Code

Let’s create a message that fades in when there’s an error (e.g., from a backend response) and fades out when the error is resolved.

Here’s how you can structure it:

export default function ErrorMessage({ responseError }) {
  return (
    <span
      className={`
        ${responseError ? 'opacity-100' : 'opacity-0'}
        pt-4 font-['Poppins'] text-sm
        font-bold text-red-500 transition-opacity duration-300 ease-in-out
      `}
    >
      {responseError ? responseError.message : ''}
    </span>
  )
}

Key Points:

  • Use opacity-100 and opacity-0 to toggle the element's visibility smoothly.
  • Use transition-opacity along with ease-in-out and duration-300 for a 300ms fade effect.
  • The responseError object determines whether the message is shown or hidden.

2. Adding Space Considerations

While opacity provides smooth transitions, the element is still present in the layout. If you want to completely remove it from affecting the layout while hidden, you can add Tailwind’s hidden class.

Here’s how you can modify the code:

export default function ErrorMessage({ responseError }) {
  return (
    <span
      className={`
        ${responseError ? 'visible opacity-100' : 'invisible opacity-0'}
        pt-4 font-['Poppins'] text-sm
        font-bold text-red-500 transition-opacity duration-300 ease-in-out
      `}
    >
      {responseError ? responseError.message : ''}
    </span>
  )
}

What Changed?

  • Added visible and invisible classes to completely hide the element from the layout when opacity-0 is active.

3. Handling Layout Overlap

If you want the error message to overlay the current content (e.g., for modal-style effects), you can use absolute or fixed positioning:

export default function ErrorMessage({ responseError }) {
  return (
    <span
      className={`
        ${responseError ? 'opacity-100' : 'opacity-0'}
        absolute left-0 top-0
        w-full pt-4 text-center font-['Poppins'] text-sm
        font-bold text-red-500 transition-opacity duration-300 ease-in-out
      `}
      style={{ zIndex: 10 }}
    >
      {responseError ? responseError.message : ''}
    </span>
  )
}

FAQ

1. Why Use opacity Instead of visibility or display?

visibility and display lack intermediary states for animations. This means you cannot animate an element smoothly between hidden and visible states. opacity supports values between 0 and 1, making it ideal for transitions.

2. How Can I Avoid Layout Issues When the Element Is Hidden?

Use invisible instead of hidden. invisible makes the element invisible while preserving its space in the layout. If you want it to completely disappear and stop affecting layout, use hidden or add absolute positioning.

3. Can I Use Tailwind’s translate Classes for Slide-In Effects?

Yes, you can combine translate-x-* or translate-y-* with opacity for more dynamic transitions. For example:

<span
  className={`
    ${responseError ? 'translate-y-0 opacity-100' : 'translate-y-4 opacity-0'}
    pt-4 font-['Poppins'] text-sm
    font-bold text-red-500 transition-all duration-300 ease-in-out
  `}
>
  {responseError ? responseError.message : ''}
</span>