Description: The x-transition directive in AlpineJS allows you to add smooth enter and leave animations for elements that are shown or hidden using x-show or x-if. It works by applying specific CSS classes at different stages of the transition, which you then style with CSS to create the animation.
x-show or x-if: These directives control the visibility of an element. x-transition works in conjunction with them to animate the appearance and disappearance.
x-show toggles the display: none; style on the element.x-if conditionally adds or removes the element from the DOM entirely. Transitions work with both.x-transition:enter="classes-during-enter-from":
Specifies the CSS classes that define the transition's behavior (e.g., duration, easing function, properties to transition) applied during the entire "enter" (appearing) phase. For example, transition ease-out duration-300.
x-transition:enter-start="classes-at-start-of-enter":
Specifies the CSS classes defining the element's state at the very beginning of the "enter" phase (e.g., opacity-0 transform scale-90 for an element fading in and scaling up).
x-transition:enter-end="classes-at-end-of-enter":
Specifies the CSS classes defining the element's state at the very end of the "enter" phase (e.g., opacity-100 transform scale-100 for an element fully visible and at its normal scale).
x-transition:leave="classes-during-leave-from":
Similar to x-transition:enter, but for the "leave" (disappearing) phase. Defines the transition's behavior during leaving (e.g., transition ease-in duration-200).
x-transition:leave-start="classes-at-start-of-leave":
Specifies CSS classes for the element's state at the beginning of the "leave" phase (e.g., opacity-100 transform scale-100).
x-transition:leave-end="classes-at-end-of-leave":
Specifies CSS classes for the element's state at the end of the "leave" phase (e.g., opacity-0 transform scale-90).
AlpineJS adds and removes these classes in a sequence to trigger CSS transitions or animations defined in your stylesheets.
Shorthands:x-transition (no modifiers): Applies a default set of transition classes for a simple fade and scale effect. These defaults are:
enter: "transition ease-out duration-100"enter-start: "opacity-0 transform scale-95"enter-end: "opacity-100 transform scale-100"leave: "transition ease-in duration-75"leave-start: "opacity-100 transform scale-100"leave-end: "opacity-0 transform scale-95"x-transition.property.duration (e.g., x-transition.opacity.duration.500ms):
Provides convenient shorthands for common transitions. For example, x-transition.opacity.duration.500ms would apply an opacity transition over 500 milliseconds. You can chain modifiers like .scale, .origin, etc. These primarily use inline styles rather than classes.
<div x-show="open" x-transition.opacity.duration.700ms>...</div>
For fine-grained control, especially when using utility CSS frameworks like Tailwind CSS, specifying the classes explicitly with :enter-start, :enter-end, etc., is often preferred.
x-transition directives only add and remove CSS classes. Your actual CSS must define the transition property (e.g., transition: opacity 0.3s ease-out, transform 0.3s ease-out;) and the styles for the start/end states (e.g., opacity: 0; transform: scale(0.95); and opacity: 1; transform: scale(1);) for those classes to have an effect. When using Tailwind CSS, these are typically utility classes like transition, duration-300, ease-out, opacity-0, scale-95. Ensure the classes applied by x-transition:enter (or leave) include the necessary CSS transition behavior (e.g., class="transition-all duration-300 ease-out").
/* Example CSS if not using Tailwind utilities */
.my-fade-enter-active { transition: opacity 0.5s ease-out; }
.my-fade-enter-from { opacity: 0; }
.my-fade-enter-to { opacity: 1; }
/* ...and similar for leave states ... */
With Tailwind, you'd put utility classes directly in the x-transition attributes:
<div x-show="open"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in duration-200"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0">
Content
</div>
x-transition with x-if:
When an element is controlled by x-if, it's truly added to or removed from the DOM. For transitions to work correctly, the x-transition directives must be on the element that is being added/removed by x-if. If x-if is on a <template> tag, the transition directives should typically be on the root element *inside* that <template>.
<template x-if="showDetails">
<div
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
class="details-panel">
More details here...
</div>
</template>
transform or opacity directly on the element, ensure they don't conflict with your intended x-transition behavior. It can be helpful to use dedicated classes for transition states if complexity arises, or ensure Tailwind's variants (like hover:, focus:) don't interfere with the transition classes applied by Alpine. Test transitions in isolation if they don't behave as expected.
Subtle Scale Alert!
This alert appears and disappears with a gentle scale and fade effect using x-show and x-transition.
This modal is added/removed from the DOM using x-if and transitions its opacity. Click outside to close.
Shorthand Transition
This box uses the default x-transition shorthand for a quick fade and scale effect.