Álvaro Franz
Álvaro Franz

Reputation: 801

Tailwind CSS & Alpine JS opacity-slide-in transition

Hello dear amazing people, I am using Tailwind (CSS) and Alpine (JS) to create a multi-step form. And I want to create a transition for each step change.

I want the transition to be something simple yet nice, so I decided to do the following:

According to the documentation for Alpine transition, it shall be done as follows:

<script src="https://cdn.jsdelivr.net/gh/alpinejs/[email protected]/dist/alpine.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet"/>

<div class="container" x-data="{ activeSlide: 1, slides: [1, 2, 3] }">
    <div class="relative" style="height:200px;">
        <!-- Slides -->
        <div class="absolute" style="height:200px;width:100%;background-color:blue;" x-show="activeSlide === 1" 
             x-transition:enter="transition ease-in-out duration-1000"
             x-transition:enter-start="-ml-5 opacity-0"
             x-transition:enter-end="ml-0 opacity-100"
             x-transition:leave="transition ease-in-out duration-1000"
             x-transition:leave-start="opacity-100"
             x-transition:leave-end="opacity-0">
            Slide 1
        </div>
        <div class="absolute" style="height:200px;width:100%;background-color:orange;" x-show="activeSlide === 2"
             x-transition:enter="transition ease-in-out duration-1000"
             x-transition:enter-start="-ml-5 opacity-0"
             x-transition:enter-end="ml-0 opacity-100"
             x-transition:leave="transition ease-in-out duration-1000"
             x-transition:leave-start="opacity-100"
             x-transition:leave-end="opacity-0">
            Slide 2
        </div>
        <div class="absolute" style="height:200px;width:100%;background-color:green;" x-show="activeSlide === 3"
             x-transition:enter="transition ease-in-out duration-1000"
             x-transition:enter-start="-ml-5 opacity-0"
             x-transition:enter-end="ml-0 opacity-100"
             x-transition:leave="transition ease-in-out duration-1000"
             x-transition:leave-start="opacity-100"
             x-transition:leave-end="opacity-0">
            Slide 3
        </div>
    </div>
    <!-- Prev/Next arrow buttons -->
    <div class="box flex flex-space-between flex-middle">
        <button x-on:click="activeSlide = activeSlide === 1 ? slides.length : activeSlide - 1">←</button>
        <button x-on:click="activeSlide = activeSlide === slides.length ? 1 : activeSlide + 1">→</button>
    </div>
</div>

But I don't get the slide effect to happen. Any ideas? Thanks in advance.

Upvotes: 1

Views: 5001

Answers (1)

Yinci
Yinci

Reputation: 2480

In my experience, using margins for moving parts seem to never work as expected. Therefore I always utilize the translate classes provided by Tailwind:

<div class="container" x-data="{ activeSlide: 1, slides: [1, 2, 3] }">
    <div class="relative" style="height:200px;">
        <!-- Slides -->
        <div class="absolute" style="height:200px;width:100%;background-color:blue;" x-show="activeSlide === 1"
             x-transition:enter="transition ease-in-out duration-1000 transform"
             x-transition:enter-start="-translate-x-5 opacity-0"
             x-transition:enter-end="translate-x-0 opacity-100"
             x-transition:leave="transition ease-in-out duration-1000"
             x-transition:leave-start="opacity-100"
             x-transition:leave-end="opacity-0">
            Slide 1
        </div>
        <div class="absolute" style="height:200px;width:100%;background-color:orange;" x-show="activeSlide === 2"
             x-transition:enter="transition ease-in-out duration-1000 transform"
             x-transition:enter-start="-translate-x-5 opacity-0"
             x-transition:enter-end="translate-x-0 opacity-100"
             x-transition:leave="transition ease-in-out duration-1000"
             x-transition:leave-start="opacity-100"
             x-transition:leave-end="opacity-0">
            Slide 2
        </div>
        <div class="absolute" style="height:200px;width:100%;background-color:green;" x-show="activeSlide === 3"
             x-transition:enter="transition ease-in-out duration-1000 transform"
             x-transition:enter-start="-translate-x-5 opacity-0"
             x-transition:enter-end="translate-x-0 opacity-100"
             x-transition:leave="transition ease-in-out duration-1000"
             x-transition:leave-start="opacity-100"
             x-transition:leave-end="opacity-0">
            Slide 3
        </div>
    </div>
    <!-- Prev/Next arrow buttons -->
    <div class="box flex flex-space-between flex-middle">
        <button x-on:click="activeSlide = activeSlide === 1 ? slides.length : activeSlide - 1">←</button>
        <button x-on:click="activeSlide = activeSlide === slides.length ? 1 : activeSlide + 1">→</button>
    </div>
</div>    

Notice how I added a transform class to the x-transition:enter and a translate class to enter-start and enter-end.

You can read more about translate here

Upvotes: 3

Related Questions