Transition و Animation در Tailwind CSS
بهنام نوبخت · ۱۴۰۵/۷/۱۳
در مقاله قبل با Stateهای مختلف در Tailwind CSS مانند hover، focus، active و disabled آشنا شدیم. اما تغییرات ایجادشده در این حالتها معمولاً بهصورت ناگهانی اتفاق میافتند. برای مثال ممکن است رنگ یک Button هنگام Hover فوراً تغییر کند یا Shadow یک Card بدون هیچ حرکت نرمی ظاهر شود. Tailwind CSS ابزارهایی در اختیار ما قرار میدهد تا این تغییرات را با استفاده از Transition نرم و طبیعی کنیم و در صورت نیاز، با Animation حرکتهای بیشتری به عناصر اضافه کنیم. در این مقاله ابتدا Transition را یاد میگیریم، سپس Duration و Timing Function را بررسی میکنیم و در ادامه با Animationهای آماده Tailwind CSS و ساخت چند مثال عملی آشنا خواهیم شد.
Transition چیست؟
Transition یا انتقال، باعث میشود تغییر یک ویژگی CSS بهجای اینکه ناگهانی اتفاق بیفتد، طی مدت زمان مشخصی انجام شود.
برای مثال بدون Transition:
<button class="bg-blue-600 hover:bg-blue-800 text-white px-5 py-3 rounded-lg">
خرید محصول
</button>رنگ Button هنگام Hover تقریباً بلافاصله تغییر میکند.
اما با:
<button class="bg-blue-600 hover:bg-blue-800 transition text-white px-5 py-3 rounded-lg">
خرید محصول
</button>تغییر رنگ نرمتر میشود.
کلاس transition
سادهترین Utility برای Transition:
transitionاست.
مثال:
<div class="bg-white shadow-sm hover:shadow-lg transition">
Product Card
</div>هنگام Hover، تغییر Shadow به شکل نرمتری اتفاق میافتد.
transition-all
اگر بخواهیم تمام ویژگیهایی که قابل Transition هستند تحت تأثیر قرار بگیرند، میتوانیم از:
transition-allاستفاده کنیم.
مثال:
<div
class="rounded-xl border p-6
transition-all
hover:-translate-y-1
hover:shadow-lg"
>
Product
</div>در اینجا چند تغییر همزمان اتفاق میافتد.
تفاوت transition و transition-all
بهصورت ساده:
transition
↓
ویژگیهای معمول قابل Transition
transition-all
↓
تمام ویژگیهای قابل Transitionدر پروژههای واقعی بهتر است تا حد امکان مشخص کنیم چه ویژگیهایی باید Transition داشته باشند، اما برای شروع transition و transition-all هر دو کاربردی هستند.
Duration چیست؟
Duration مشخص میکند Transition چه مدت طول بکشد.
مثلاً:
duration-150
duration-300
duration-500
duration-700برای مثال:
<button
class="bg-blue-600 hover:bg-blue-800
transition duration-300
rounded-lg px-5 py-3 text-white"
>
خرید
</button>در اینجا Transition حدود 300 میلیثانیه طول میکشد.
مقایسه Durationها
به صورت مفهومی:
duration-150
Fast
duration-300
Normal
duration-500
Slow
duration-700
Slowerبرای بسیاری از تعاملات رابط کاربری، Durationهای کوتاه تا متوسط مناسبتر هستند.
مثال Button با Transition
<button
class="rounded-lg bg-blue-600 px-6 py-3
font-semibold text-white
transition duration-300
hover:bg-blue-700"
>
مشاهده محصولات
</button>اکنون تغییر رنگ Button ناگهانی نیست.
Transition رنگ
Transition برای رنگها بسیار کاربردی است.
<a
href="#"
class="text-gray-600
transition-colors duration-200
hover:text-blue-600"
>
مشاهده جزئیات
</a>در اینجا از:
transition-colorsاستفاده کردهایم.
این Utility برای Transition ویژگیهای مرتبط با رنگ کاربرد دارد.
Transition برای Background
<button
class="rounded-lg bg-gray-800 px-5 py-3 text-white
transition-colors duration-300
hover:bg-blue-600"
>
ادامه
</button>هنگام Hover، رنگ Background بهصورت نرم تغییر میکند.
Transition برای Shadow
<div
class="rounded-xl bg-white p-6 shadow-sm
transition-shadow duration-300
hover:shadow-xl"
>
Product Card
</div>در این مثال فقط Shadow را Transition میدهیم.
Transition برای Transform
در مقاله قبل از:
hover:-translate-y-1استفاده کردیم.
اکنون میتوانیم آن را نرم کنیم:
<div
class="rounded-xl border bg-white p-6
transition-transform duration-300
hover:-translate-y-1"
>
Product Card
</div>نتیجه:
Normal
↓
Hover
↓
Move Upو حرکت بهصورت نرم انجام میشود.
ترکیب چند Transition
میتوانیم چند ویژگی را همزمان تغییر دهیم:
<div
class="group rounded-xl border bg-white p-6 shadow-sm
transition-all duration-300
hover:-translate-y-1
hover:border-blue-400
hover:shadow-lg"
>
<h3 class="font-bold transition-colors duration-300 group-hover:text-blue-600">
Product Title
</h3>
<p class="mt-2 text-gray-600">
Product description.
</p>
</div>هنگام Hover:
Card کمی بالا میرود.
Border تغییر میکند.
Shadow تغییر میکند.
رنگ عنوان تغییر میکند.
همه این تغییرات نرم هستند.
Ease چیست؟
Timing Function مشخص میکند سرعت تغییر در طول Transition چگونه باشد.
یکی از گزینههای رایج:
ease-linear
ease-in
ease-out
ease-in-outاست.
مثال:
<div
class="transition duration-500 ease-in-out hover:scale-105"
>
Card
</div>ease-linear
سرعت تغییر تقریباً ثابت است.
<div class="transition duration-500 ease-linear hover:scale-105">
Element
</div>ease-in
حرکت با سرعت کمتر شروع میشود و سپس سریعتر میشود.
<div class="transition duration-500 ease-in hover:scale-105">
Element
</div>ease-out
حرکت سریعتر شروع شده و در پایان آرامتر میشود.
<div class="transition duration-500 ease-out hover:scale-105">
Element
</div>ease-in-out
شروع و پایان حرکت نرمتر است.
<div class="transition duration-500 ease-in-out hover:scale-105">
Element
</div>برای بسیاری از UIهای معمول، ease-out یا ease-in-out انتخابهای مناسبی هستند.
Delay چیست؟
میتوانیم شروع Transition را نیز با Delay به تأخیر بیندازیم.
برای مثال:
<div
class="transition duration-300 delay-100 hover:scale-105"
>
Card
</div>در این مثال قبل از شروع Transition یک تأخیر کوتاه وجود دارد.
Scale
یکی از کاربردهای رایج Transition، بزرگ یا کوچک کردن عنصر است.
<div class="transition hover:scale-105">
Product
</div>یعنی هنگام Hover، اندازه عنصر کمی افزایش پیدا میکند.
مثال کاملتر:
<div
class="rounded-xl border bg-white p-6
transition duration-300
hover:scale-105"
>
Product Card
</div>برای Cardهای واقعی بهتر است مقدار Scale زیاد نباشد تا Layout صفحه دچار مشکل نشود.
Rotate
میتوان عنصر را نیز چرخاند.
<div class="transition duration-300 hover:rotate-3">
⭐
</div>این روش برای Iconها یا عناصر تزئینی میتواند کاربرد داشته باشد.
Translate
برای جابهجایی عنصر میتوان از Translate استفاده کرد.
مثال حرکت به سمت بالا:
<div class="transition-transform duration-300 hover:-translate-y-2">
Card
</div>حرکت به سمت راست:
<div class="transition-transform duration-300 hover:translate-x-2">
Element
</div>ساخت Card حرفهایتر
حالا مفاهیم قبلی را ترکیب کنیم:
<div
class="group overflow-hidden rounded-2xl border bg-white shadow-sm
transition-all duration-300 ease-out
hover:-translate-y-2
hover:shadow-xl"
>
<img
src="product.jpg"
alt="Product"
class="h-56 w-full object-cover
transition-transform duration-500
group-hover:scale-105"
>
<div class="p-5">
<h3
class="text-lg font-bold
transition-colors duration-300
group-hover:text-blue-600"
>
Modern Product
</h3>
<p class="mt-2 text-gray-600">
A modern product description.
</p>
<button
class="mt-5 rounded-lg bg-blue-600 px-5 py-2 text-white
transition-colors duration-300
hover:bg-blue-700"
>
خرید
</button>
</div>
</div>در این مثال:
Card
↓
Hover
├── Card moves up
├── Shadow changes
├── Image scales
├── Title changes color
└── Button changes colorاین الگو در بسیاری از سایتهای فروشگاهی استفاده میشود.
Animation چیست؟
Transition زمانی مفید است که یک عنصر از یک State به State دیگر تغییر کند.
اما Animation میتواند یک حرکت مستقل ایجاد کند.
برای مثال:
Element
↓
Move
↓
Move
↓
Move
↓
RepeatAnimation میتواند بدون نیاز به Hover نیز اجرا شود.
Animationهای آماده Tailwind CSS
Tailwind CSS چند Utility آماده برای Animation دارد.
از جمله:
animate-spin
animate-ping
animate-pulse
animate-bounceاین Utilityها برای موارد مختلفی کاربرد دارند.
animate-spin
عنصر را به شکل چرخشی حرکت میدهد.
مثال:
<div class="animate-spin">
🔄
</div>کاربرد رایج آن برای Loading Indicator است.
ساخت Loading Spinner
مثال:
<div
class="h-8 w-8 animate-spin rounded-full
border-4 border-gray-200 border-t-blue-600"
>
</div>در اینجا یک Spinner ساده ایجاد کردهایم.
ساختار آن:
Circle
+
Border
+
animate-spin
=
Loading Spinneranimate-pulse
باعث ایجاد حالت Pulse میشود.
<div class="h-4 w-32 animate-pulse rounded bg-gray-200"></div>این تکنیک برای Skeleton Loading بسیار کاربردی است.
مثال:
<div class="space-y-4">
<div class="h-6 w-1/2 animate-pulse rounded bg-gray-200"></div>
<div class="h-4 w-full animate-pulse rounded bg-gray-200"></div>
<div class="h-4 w-5/6 animate-pulse rounded bg-gray-200"></div>
</div>میتوانیم از این روش زمانی استفاده کنیم که اطلاعات واقعی هنوز از Server دریافت نشدهاند.
animate-bounce
باعث حرکت Bounce میشود.
<div class="animate-bounce">
↓
</div>این روش میتواند برای نمایش یک فلش یا عنصر راهنما استفاده شود.
animate-ping
یک افکت Ping ایجاد میکند.
<div class="relative">
<span class="absolute inline-flex h-3 w-3 animate-ping rounded-full bg-green-400"></span>
<span class="relative inline-flex h-3 w-3 rounded-full bg-green-500"></span>
</div>این الگو میتواند برای نمایش وضعیت Online یا Notification Indicator استفاده شود.
ساخت Notification Indicator
<div class="relative">
<button class="rounded-lg border px-4 py-2">
Notifications
</button>
<span
class="absolute -right-1 -top-1 flex h-3 w-3"
>
<span
class="absolute inline-flex h-full w-full
animate-ping rounded-full bg-red-400"
></span>
<span
class="relative inline-flex h-3 w-3
rounded-full bg-red-500"
></span>
</span>
</div>با این روش میتوان یک Indicator متحرک ایجاد کرد.
Transition یا Animation؟
یکی از سوالات مهم این است که چه زمانی از هرکدام استفاده کنیم.
Transition
زمانی مناسب است که تغییر به دلیل تعامل کاربر اتفاق میافتد.
مثلاً:
Hover
Focus
ActiveAnimation
زمانی مناسب است که حرکت مستقل یا تکرارشونده نیاز داریم.
مثلاً:
Loading
Pulse
Bounce
Notificationبه صورت ساده:
User Interaction
↓
Transition
Independent Motion
↓
Animationترکیب Responsive و Transition
Transition را میتوان با Responsive Design نیز ترکیب کرد.
مثلاً:
<div
class="w-full transition-all duration-300
hover:shadow-lg
md:w-1/2
lg:w-1/3"
>
Card
</div>در اینجا:
Responsive
+
Hover
+
Transitionبا هم استفاده شدهاند.
ترکیب Dark Mode و Transition
در آینده با Dark Mode بیشتر کار خواهیم کرد، اما میتوانیم Transition را با آن نیز ترکیب کنیم.
مثال:
<div
class="bg-white text-gray-900
transition-colors duration-300
dark:bg-gray-900 dark:text-white"
>
Content
</div>وقتی Theme تغییر کند، رنگها میتوانند بهصورت نرم تغییر کنند.
Accessibility و Animation
Animation همیشه نباید بدون توجه به شرایط کاربر اجرا شود.
برخی کاربران ترجیح میدهند حرکتهای متحرک در رابط کاربری کاهش پیدا کند.
در طراحی حرفهای باید به این موضوع نیز توجه شود و در صورت نیاز Animationهای غیرضروری را کاهش دهیم.
در Tailwind CSS میتوان از Variant مربوط به motion-reduce برای چنین شرایطی استفاده کرد.
مثال:
<div
class="animate-bounce motion-reduce:animate-none"
>
↓
</div>یعنی در شرایطی که کاربر ترجیح داده حرکتها کاهش پیدا کنند، Animation غیرفعال میشود.
Animation باید به تجربه کاربر کمک کند، نه اینکه صرفاً برای تزئین صفحه استفاده شود.
یک مثال عملی — Button تعاملی
<button
class="rounded-xl bg-blue-600 px-6 py-3
font-semibold text-white
shadow-sm
transition-all duration-300 ease-out
hover:-translate-y-0.5
hover:bg-blue-700
hover:shadow-lg
active:translate-y-0"
>
شروع کنید
</button>رفتار Button:
Normal
↓
Hover
Move + Shadow + Color
↓
Active
Returnیک مثال عملی — Loading
<div class="flex items-center gap-3">
<div
class="h-6 w-6 animate-spin rounded-full
border-4 border-gray-200 border-t-blue-600"
></div>
<span>
Loading...
</span>
</div>یک مثال عملی — Skeleton
<div class="mx-auto max-w-md rounded-xl border p-5">
<div class="h-48 animate-pulse rounded-lg bg-gray-200"></div>
<div class="mt-5 h-6 w-2/3 animate-pulse rounded bg-gray-200"></div>
<div class="mt-3 h-4 w-full animate-pulse rounded bg-gray-200"></div>
<div class="mt-2 h-4 w-5/6 animate-pulse rounded bg-gray-200"></div>
</div>این روش برای زمانی مناسب است که صفحه منتظر دریافت اطلاعات است.
اشتباهات رایج
۱. Animation بیش از حد
اگر همه عناصر صفحه Animation داشته باشند، رابط کاربری شلوغ و خستهکننده میشود.
۲. Duration بسیار زیاد
برای تعاملات معمول، Transition بسیار طولانی ممکن است حس کندی ایجاد کند.
۳. استفاده از Animation بدون هدف
قبل از اضافه کردن Animation از خودتان بپرسید:
آیا این حرکت به درک بهتر رابط کاربری کمک میکند؟
اگر پاسخ منفی است، احتمالاً نیازی به آن ندارید.
۴. فراموش کردن Focus
نباید Transition و Animation باعث شوند Focus کاربر غیرقابل تشخیص شود.
۵. نادیده گرفتن Reduced Motion
برای رابطهای حرفهای بهتر است شرایط کاربرانی که حرکت کمتر را ترجیح میدهند نیز در نظر گرفته شود.
تمرین عملی
یک Product Card ایجاد کنید که ویژگیهای زیر را داشته باشد:
Card
در حالت عادی:
Border
Shadow
White Backgroundدر Hover:
Move Up
Larger ShadowImage
در Hover شدن Card:
Slight ScaleTitle
در Hover شدن Card:
Color ChangeButton
در حالت عادی:
Blueدر Hover:
Darker Blueو تمام تغییرات با Transition نرم انجام شوند.
سپس یک Loading Spinner و یک Skeleton Loading نیز ایجاد کنید.
جمعبندی
در این مقاله یاد گرفتیم چگونه رابط کاربری را با Transition و Animation تعاملیتر کنیم.
مهمترین Utilityهایی که بررسی کردیم:
transition
transition-all
transition-colors
transition-shadow
transition-transform
duration-*
ease-*
delay-*
animate-spin
animate-ping
animate-pulse
animate-bounce
motion-reduceهمچنین تفاوت اصلی Transition و Animation را یاد گرفتیم:
Transition
برای تغییر بین Stateها
Animation
برای حرکت مستقل یا تکرارشوندهبا ترکیب این قابلیتها میتوانیم Buttonها، Cardها، Loading Indicatorها، Skeletonها و بخشهای مختلف سایت را حرفهایتر طراحی کنیم.
نظرات
هنوز نظری ثبت نشده است.