🎉  The Alpine Day 2021 videos are out! Watch Now

x-transition

Alpine provides a robust transitions utility out of the box. With a few x-transition directives, you can create smooth transitions between when an element is shown or hidden.

There are two primary ways to handle transitions in Alpine:

The transition helper

The simplest way to achieve a transition using Alpine is by adding x-transition to an element with x-show on it. For example:

<div x-data="{ open: false }">
    <button @click="open = ! open">Toggle</button>

    <span x-show="open" x-transition>
        Hello 👋
    </span>
</div>
Hello 👋

As you can see, by default, x-transition applies pleasant transition defaults to fade and scale the revealing element.

You can override these defaults with modifiers attached to x-transition. Let's take a look at those.

Customizing duration

You can configure the duration you want for a transition with the .duration modifier:

<div ... x-transition.duration.500ms>

The above <div> will transition for 500 milliseconds when entering, and 250 milliseconds when leaving.

This difference in duration generally desireable default. If you wish to customize the durations specifically for entering and leaving, you can do that like so:

<div ...
    x-transition:enter.duration.500ms
    x-transition:leave.duration.400ms
>

Customizing delay

You can delay a transition using the .delay modifier like so:

<div ... x-transition.delay.50ms>

The above example will delay the transition and in and out of the element by 50 milliseconds.

Customizing opacity

By default, Alpine's x-transition applies both a scale and opacity transition to achieve a "fade" effect.

If you wish to only apply the opacity transition (no scale), you can accomplish that like so:

<div ... x-transition.opacity>

Customizing scale

Similar to the .opacity modifier, you can configure x-transition to ONLY scale (and not transition opacity as well) like so:

<div ... x-transition.scale>

The .scale modifier also offers the ability to configure its scale values AND its origin values:

<div ... x-transition.scale.80>

The above snippet will scale the element up and down by 80%.

Again, you may customize these values seperately for enter and leaving transitions like so:

<div ...
    x-transition:enter.scale.80
    x-transition:leave.scale.90
>

To customize the origin of the scale transition, you can use the .origin modifier:

<div ... x-transition.scale.origin.top>

Now the scale will be applied using the top of the element as the origin, instead of the center by default.

Like you may have guessed, the possible values for this customization are: top, bottom, left, and right.

If you wish, you can also combine two origin values. For example, if you want the origin of the scale to be "top right", you can use: .origin.top.right as the modifier.

Applying CSS classes

For direct control over exactly what goes into your transitions, you can apply CSS classes at different stages of the transition.

The following examples use TailwindCSS utility classes.

<div x-data="{ open: false }">
    <button @click="open = ! open">Toggle</button>

    <div
        x-show="open"
        x-transition:enter="transition ease-out duration-300"
        x-transition:enter-start="opacity-0 transform scale-90"
        x-transition:enter-end="opacity-100 transform scale-100"
        x-transition:leave="transition ease-in duration-300"
        x-transition:leave-start="opacity-100 transform scale-100"
        x-transition:leave-end="opacity-0 transform scale-90"
    >Hello 👋</div>
</div>
Hello 👋
Directive Description
:enter Applied during the entire entering phase.
:enter-start Added before element is inserted, removed one frame after element is inserted.
:enter-end Added one frame after element is inserted (at the same time enter-start is removed), removed when transition/animation finishes.
:leave Applied during the entire leaving phase.
:leave-start Added immediately when a leaving transition is triggered, removed after one frame.
:leave-end Added one frame after a leaving transition is triggered (at the same time leave-start is removed), removed when the transition/animation finishes.