Transition در CSS
بهنام نوبخت · ۱۴۰۵/۶/۲۸
در طراحی رابط کاربری، بسیاری از تغییرات CSS بهصورت فوری اتفاق میافتند. مثلاً وقتی کاربر ماوس را روی یک دکمه قرار میدهد، رنگ پسزمینه، رنگ متن یا اندازه آن میتواند بلافاصله تغییر کند. این رفتار از نظر فنی کاملاً درست است، اما در بسیاری از طراحیهای مدرن، تغییر ناگهانی عناصر ظاهر چندان جذابی ندارد.
CSS با استفاده از ویژگی Transition امکان ایجاد تغییرات تدریجی و نرم بین دو وضعیت را فراهم میکند. به کمک Transition میتوان مشخص کرد یک تغییر چه مدت طول بکشد، با چه سرعتی انجام شود، روی کدام ویژگیها اعمال شود و آیا با تأخیر شروع شود یا خیر.
برای مثال، بهجای اینکه رنگ یک دکمه هنگام hover ناگهان تغییر کند:
button:hover {
background-color: #16a34a;
}میتوانیم تغییر رنگ را طی چند دهم ثانیه انجام دهیم:
button {
transition: background-color 0.3s ease;
}
button:hover {
background-color: #16a34a;
}همین تغییر کوچک میتواند ظاهر یک رابط کاربری را بسیار حرفهایتر کند.
Transition چیست؟
Transition در CSS روشی برای ایجاد تغییر تدریجی بین دو وضعیت یک عنصر است.
فرض کنید یک کارت در حالت عادی چنین ویژگیهایی دارد:
.card {
background-color: white;
transform: translateY(0);
}و هنگام قرار گرفتن ماوس روی آن چنین میشود:
.card:hover {
background-color: #f5f5f5;
transform: translateY(-8px);
}بدون Transition، تغییرات تقریباً بلافاصله اتفاق میافتند.
اما اگر بنویسیم:
.card {
transition: 0.3s ease;
}مرورگر تغییر بین وضعیت اولیه و وضعیت hover را بهصورت تدریجی نمایش میدهد.
در واقع Transition برای حرکت یا تغییر بین دو state بسیار مناسب است؛ برای مثال:
حالت عادی →
hoverحالت عادی →
focusحالت عادی →
activeحالت بسته → باز
وضعیت اولیه → وضعیتی که با JavaScript ایجاد شده است
ساختار اصلی Transition
Transition چند بخش اصلی دارد:
transition-property
transition-duration
transition-timing-function
transition-delayو معمولاً همه آنها را با ویژگی کوتاهشده transition ترکیب میکنیم.
ساختار کلی:
transition: property duration timing-function delay;مثلاً:
transition: background-color 0.3s ease 0s;یعنی:
ویژگی مورد نظر:
background-colorمدت زمان:
0.3sنحوه تغییر سرعت:
easeتأخیر:
0s
transition-property
این ویژگی مشخص میکند کدام ویژگی CSS باید Transition داشته باشد.
مثلاً:
.box {
transition-property: background-color;
}در این حالت فقط تغییر background-color بهصورت تدریجی انجام میشود.
مثال:
.box {
background-color: white;
color: black;
transition-property: background-color;
transition-duration: 0.4s;
}
.box:hover {
background-color: black;
color: white;
}در این مثال:
تغییر پسزمینه نرم است.
تغییر رنگ متن Transition ندارد.
اگر بخواهیم چند ویژگی را کنترل کنیم:
.box {
transition-property: background-color, color, transform;
}اکنون هر سه ویژگی میتوانند Transition داشته باشند.
مقدار all
میتوان بهجای نام ویژگی از all استفاده کرد:
.box {
transition-property: all;
}در این حالت تغییرات ویژگیهای مختلفی که قابل Transition باشند تحت Transition قرار میگیرند.
مثلاً:
.box {
transition-property: all;
transition-duration: 0.3s;
}اما استفاده از all همیشه بهترین انتخاب نیست.
در پروژههای واقعی معمولاً بهتر است ویژگیهایی را که واقعاً قصد تغییر آنها را داریم مشخص کنیم:
.card {
transition:
transform 0.3s ease,
box-shadow 0.3s ease;
}این روش کنترل بیشتری روی رفتار رابط کاربری ایجاد میکند.
transition-duration
ویژگی transition-duration مشخص میکند تغییر چه مدت زمانی طول بکشد. مقدار پیشفرض آن 0s است؛ بنابراین اگر مدت زمان تعیین نشود، Transition عملاً قابل مشاهده نخواهد بود.
مثال:
.box {
transition-duration: 0.5s;
}یا:
.box {
transition-duration: 500ms;
}این دو تقریباً معادل یکدیگر هستند:
0.5s = 500msمثال
button {
background-color: #2563eb;
transition-property: background-color;
transition-duration: 0.3s;
}
button:hover {
background-color: #1d4ed8;
}رنگ دکمه طی 0.3 ثانیه تغییر میکند.
انتخاب مدت زمان مناسب
برای رابطهای کاربری معمولاً زمانهای کوتاه مناسبتر هستند.
مثلاً:
transition: transform 0.2s ease;یا:
transition: all 0.3s ease;برای برخی تغییرات میتوان از زمانهای طولانیتر استفاده کرد:
transition: transform 0.8s ease;اما اگر برای یک دکمه معمولی بنویسیم:
transition: all 3s;رفتار صفحه احتمالاً بسیار کند و غیرطبیعی خواهد شد.
پس Transition باید قابل احساس باشد، اما مزاحم کاربر نشود.
transition-timing-function
مدت زمان فقط یک بخش از Transition است.
سؤال دیگری وجود دارد:
تغییر با چه سرعتی انجام شود؟
مثلاً آیا سرعت تغییر از ابتدا تا انتها ثابت باشد؟
یا ابتدا سریع و سپس آرام شود؟
این موضوع توسط transition-timing-function کنترل میشود. این ویژگی منحنی سرعت تغییر بین مقادیر ابتدایی و نهایی را مشخص میکند.
مقدار ease
ease یکی از مقادیر رایج و مقدار پیشفرض Transition است.
.box {
transition-timing-function: ease;
}در بسیاری از رابطهای کاربری، ease انتخاب خوبی برای شروع است.
مقدار linear
در linear سرعت تغییر در طول Transition ثابت باقی میماند.
.box {
transition-timing-function: linear;
}مثلاً:
.box {
transform: translateX(0);
transition: transform 1s linear;
}
.box:hover {
transform: translateX(200px);
}عنصر با سرعت یکنواخت حرکت میکند.
ease-in
در ease-in تغییر در ابتدا آرامتر شروع میشود و سپس سرعت میگیرد.
.box {
transition: transform 0.5s ease-in;
}ease-out
در ease-out تغییر سریعتر شروع میشود و در انتها آرام میشود.
.box {
transition: transform 0.5s ease-out;
}این حالت برای بسیاری از تعاملات UI بسیار مناسب است.
مثلاً برای ظاهر شدن یا حرکت یک کارت:
.card {
transition: transform 0.3s ease-out;
}
.card:hover {
transform: translateY(-6px);
}ease-in-out
در ease-in-out تغییر در ابتدا و انتها آرامتر است و در بخش میانی سریعتر انجام میشود.
.box {
transition: transform 0.5s ease-in-out;
}مقایسه Timing Functionها
مقدار | رفتار |
|---|---|
| سرعت ثابت |
| شروع و پایان نرم |
| شروع آرامتر |
| پایان آرامتر |
| شروع و پایان آرام |
برای شروع کار، این چهار مقدار را بهخوبی یاد بگیرید:
linear
ease
ease-in
ease-out
ease-in-outعلاوه بر این موارد، CSS از توابعی مانند cubic-bezier() و steps() نیز پشتیبانی میکند.
cubic-bezier
اگر مقادیر آماده برای شما کافی نباشند، میتوانید منحنی سرعت را خودتان تعیین کنید.
مثلاً:
.box {
transition:
transform 0.5s cubic-bezier(0.25, 1, 0.5, 1);
}cubic-bezier() کنترل دقیقتری روی شتاب Transition میدهد.
در طراحی حرفهای رابط کاربری، این قابلیت میتواند برای ساخت حرکات خاص و منحصربهفرد بسیار مفید باشد.
البته در پروژههای معمولی لازم نیست همه Transitionها را با cubic-bezier() بنویسید. اغلب مواقع ease-out یا ease-in-out کاملاً کافی است.
steps
یک تابع دیگر steps است که بهجای حرکت کاملاً پیوسته، تغییر را در چند مرحله انجام میدهد.
مثلاً:
.box {
transition: transform 1s steps(5);
}این نوع Transition برای رفتارهای مرحلهای یا بعضی جلوههای خاص کاربرد دارد.
برای طراحیهای معمولی UI کمتر از آن استفاده میشود، اما شناخت آن برای کار با CSS حرفهای مفید است.
transition-delay
ویژگی transition-delay مشخص میکند Transition چه مدت بعد از تغییر مقدار CSS شروع شود.
مثلاً:
.box {
transition:
transform 0.5s ease 0.3s;
}در اینجا:
0.5s → duration
0.3s → delayیعنی ابتدا 0.3 ثانیه صبر میشود و سپس Transition طی 0.5 ثانیه انجام میشود.
مثال
.card {
transform: translateY(0);
transition:
transform 0.4s ease 0.2s;
}
.card:hover {
transform: translateY(-10px);
}هنگام hover:
مرورگر تغییر را تشخیص میدهد.
0.2sصبر میکند.سپس حرکت طی
0.4sانجام میشود.
Transition Shorthand
در پروژههای واقعی معمولاً بهجای نوشتن چهار ویژگی جداگانه، از transition استفاده میکنیم.
مثلاً:
button {
transition-property: background-color;
transition-duration: 0.3s;
transition-timing-function: ease;
transition-delay: 0s;
}میتوان آن را به شکل کوتاهتر نوشت:
button {
transition: background-color 0.3s ease 0s;
}و حتی:
button {
transition: background-color 0.3s ease;
}چون مقدار delay در این مثال صفر است، نیازی به نوشتن آن نداریم.
ساختار عمومی:
transition: property duration timing-function delay;مثلاً:
transition: transform 0.3s ease-out 0.1s;Transition چند ویژگی بهصورت همزمان
میتوان چند Transition را با کاما از یکدیگر جدا کرد.
مثلاً:
.card {
transition:
transform 0.3s ease,
box-shadow 0.3s ease,
background-color 0.3s ease;
}سپس:
.card:hover {
transform: translateY(-8px);
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.15);
background-color: #ffffff;
}در نتیجه:
کارت حرکت میکند.
سایه تغییر میکند.
رنگ پسزمینه تغییر میکند.
و همه این تغییرات بهصورت نرم اتفاق میافتند.
ترکیب Transition و Transform
یکی از مهمترین ترکیبها در طراحی رابط کاربری:
transition + transformمثلاً:
.card {
transition: transform 0.3s ease;
}
.card:hover {
transform: translateY(-8px);
}یا:
.image {
transition: transform 0.4s ease;
}
.image:hover {
transform: scale(1.05);
}این تکنیک را در موارد زیادی میبینید:
کارت محصولات
تصاویر
دکمهها
آیکونها
منوها
لینکها
کارتهای خدمات
ساخت افکت Zoom برای تصویر
یکی از افکتهای بسیار رایج:
<div class="image-box">
<img src="image.jpg" alt="تصویر محصول">
</div>CSS:
.image-box {
overflow: hidden;
border-radius: 16px;
}
.image-box img {
width: 100%;
display: block;
transition: transform 0.4s ease;
}
.image-box:hover img {
transform: scale(1.08);
}در این مثال:
transition: transform 0.4s ease;باعث میشود بزرگ شدن تصویر نرم باشد.
و:
overflow: hidden;باعث میشود قسمت اضافی تصویر خارج از محدوده کادر دیده نشود.
Transition و Box Shadow
Transition فقط برای حرکت نیست.
میتوان سایه را نیز نرم تغییر داد:
.card {
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.08);
transition: box-shadow 0.3s ease;
}
.card:hover {
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.16);
}این تکنیک برای کارتهای مدرن بسیار کاربردی است.
حتی میتوان آن را با transform ترکیب کرد:
.card {
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.08);
transition:
transform 0.3s ease,
box-shadow 0.3s ease;
}
.card:hover {
transform: translateY(-8px);
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.16);
}Transition برای دکمههای مدرن
مثلاً یک دکمه ساده:
<a href="#" class="btn">
مشاهده خدمات
</a>CSS:
.btn {
display: inline-block;
padding: 12px 24px;
background-color: #f97316;
color: white;
border-radius: 10px;
text-decoration: none;
transition:
background-color 0.3s ease,
transform 0.3s ease,
box-shadow 0.3s ease;
}
.btn:hover {
background-color: #ea580c;
transform: translateY(-3px);
box-shadow: 0 8px 20px rgba(249, 115, 22, 0.25);
}این الگو برای سایتهای تجاری و Landing Pageها بسیار کاربردی است.
Transition برای لینکها
یک لینک ساده:
a {
color: #2563eb;
transition: color 0.2s ease;
}
a:hover {
color: #1d4ed8;
}حتی میتوان افکتهای بیشتری ایجاد کرد.
مثلاً:
a {
color: #333;
text-decoration: none;
transition:
color 0.2s ease,
transform 0.2s ease;
}
a:hover {
color: #f97316;
}Transition برای آیکون
فرض کنید یک آیکون فلش داریم:
<a href="#" class="more">
بیشتر بخوانید
<span>←</span>
</a>CSS:
.more {
display: inline-flex;
align-items: center;
gap: 8px;
}
.more span {
transition: transform 0.2s ease;
}
.more:hover span {
transform: translateX(-5px);
}حالا هنگام hover، فلش کمی حرکت میکند.
این نوع Micro Interaction باعث میشود رابط کاربری زندهتر به نظر برسد.
یک نکته بسیار مهم: Transition را کجا بنویسیم؟
یکی از اشتباهات رایج این است که Transition را فقط داخل :hover قرار دهیم:
button:hover {
transition: transform 0.3s ease;
transform: scale(1.05);
}این روش مناسب نیست.
بهتر است Transition در حالت اصلی قرار بگیرد:
button {
transition: transform 0.3s ease;
}
button:hover {
transform: scale(1.05);
}چرا؟
زیرا Transition باید رفتار ورود و خروج از حالت تغییر یافته را کنترل کند.
بنابراین:
.element {
transition: ...;
}و:
.element:hover {
/* تغییرات */
}معمولاً ساختار بهتری است.
آیا از transition: all استفاده کنیم؟
میتوان نوشت:
.card {
transition: all 0.3s ease;
}اما بهتر است در پروژههای حرفهای تا حد امکان مشخص کنیم چه ویژگیهایی باید تغییر کنند.
مثلاً:
.card {
transition:
transform 0.3s ease,
box-shadow 0.3s ease;
}این روش خواناتر است و رفتار مورد نظر را دقیقتر مشخص میکند.
transition: all لزوماً همیشه مشکلساز نیست، اما وقتی فقط چند ویژگی مشخص قرار است تغییر کنند، انتخاب صریح آن ویژگیها معمولاً تصمیم بهتری است.
چه ویژگیهایی برای Transition مناسب هستند؟
Transition زمانی کاربردی است که یک ویژگی بتواند از یک مقدار به مقدار دیگری بهصورت تدریجی تغییر کند.
نمونههای رایج:
color
background-color
opacity
transform
box-shadow
border-color
width
height
padding
marginمثلاً:
.box {
opacity: 1;
transition: opacity 0.3s ease;
}
.box:hover {
opacity: 0.6;
}یا:
.box {
border-color: #ddd;
transition: border-color 0.3s ease;
}
.box:hover {
border-color: #f97316;
}تفاوت Transition و Animation
در این مرحله یک سؤال مهم ایجاد میشود:
Transition چه تفاوتی با Animation دارد؟
بهصورت ساده:
Transition
برای تغییر بین دو وضعیت بسیار مناسب است:
Normal → Hoverمثلاً:
button:hover {
transform: scale(1.05);
}Animation
برای اجرای یک حرکت یا مجموعهای از مراحل مستقل مناسبتر است.
مثلاً:
پایان → چرخش → تغییر اندازه → حرکت → شروعAnimation معمولاً با @keyframes تعریف میشود.
در مقاله بعدی بهصورت کامل سراغ Animation و @keyframes خواهیم رفت.
استفاده از Transition در طراحی کارت خدمات
حالا یک مثال نزدیک به یک پروژه واقعی بسازیم.
HTML:
<section class="services">
<article class="service-card">
<div class="service-icon">
💻
</div>
<h3>طراحی سایت</h3>
<p>
طراحی سایت مدرن و Responsive برای کسبوکار شما.
</p>
<a href="#" class="service-link">
مشاهده بیشتر ←
</a>
</article>
<article class="service-card">
<div class="service-icon">
🚀
</div>
<h3>بهینهسازی سایت</h3>
<p>
بهبود سرعت و تجربه کاربری سایت.
</p>
<a href="#" class="service-link">
مشاهده بیشتر ←
</a>
</article>
</section>CSS:
.services {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 24px;
}
.service-card {
padding: 30px;
background-color: white;
border: 1px solid #e5e7eb;
border-radius: 20px;
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.06);
transition:
transform 0.3s ease,
box-shadow 0.3s ease,
border-color 0.3s ease;
}
.service-card:hover {
transform: translateY(-8px);
border-color: #f97316;
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.12);
}
.service-icon {
font-size: 40px;
margin-bottom: 20px;
transition: transform 0.3s ease;
}
.service-card:hover .service-icon {
transform: scale(1.1) rotate(-3deg);
}
.service-link {
color: #f97316;
text-decoration: none;
transition:
color 0.2s ease,
gap 0.2s ease;
}
.service-link:hover {
color: #ea580c;
}در این مثال چند مفهوم را همزمان استفاده کردیم:
transitiontransformbox-shadowborder-colorscalerotatehover
این دقیقاً همان نوع ترکیبی است که در رابطهای کاربری مدرن زیاد استفاده میشود.
ساخت یک دکمه با افکت حرفهای
مثال دیگری بسازیم:
<button class="primary-button">
شروع کنید
</button>CSS:
.primary-button {
padding: 14px 28px;
border: none;
border-radius: 12px;
background-color: #f97316;
color: white;
font-size: 16px;
font-weight: 700;
cursor: pointer;
transition:
transform 0.25s ease,
background-color 0.25s ease,
box-shadow 0.25s ease;
}
.primary-button:hover {
background-color: #ea580c;
transform: translateY(-3px);
box-shadow: 0 10px 25px rgba(249, 115, 22, 0.25);
}
.primary-button:active {
transform: translateY(0);
}حالا رفتار دکمه چنین است:
حالت عادی
↓
Hover
↓
کمی بالا میرود
↓
سایه افزایش پیدا میکند
↓
رنگ تغییر میکند
↓
Click
↓
به حالت فشرده برمیگردداین یک نمونه ساده از Micro Interaction در طراحی UI است.
Transition و Accessibility
حرکتهای زیاد و سریع برای بعضی کاربران مناسب نیستند. سیستمعاملها و مرورگرها میتوانند ترجیح کاربر برای کاهش حرکت را در اختیار CSS قرار دهند.
برای این منظور میتوان از Media Query زیر استفاده کرد:
@media (prefers-reduced-motion: reduce) {
* {
transition-duration: 0.01ms;
animation-duration: 0.01ms;
}
}ایده اصلی این است که اگر کاربر ترجیح میدهد حرکتهای رابط کاربری کمتر باشند، سایت نیز Motion کمتری نمایش دهد.
این موضوع مخصوصاً در سایتهایی که Animation و Transition زیادی دارند اهمیت پیدا میکند.
اشتباهات رایج در استفاده از Transition
۱. قرار دادن Transition فقط روی Hover
اشتباه:
button:hover {
transition: transform 0.3s;
}بهتر:
button {
transition: transform 0.3s;
}
button:hover {
transform: scale(1.05);
}۲. استفاده بیش از حد از Transition
اگر همه عناصر صفحه هنگام Hover حرکت کنند، صفحه ممکن است شلوغ و آزاردهنده شود.
Transition باید برای تقویت تجربه کاربری استفاده شود، نه اینکه صرفاً برای نمایش تکنیک CSS باشد.
۳. استفاده از زمانهای بسیار طولانی
مثلاً:
transition: all 5s ease;برای یک دکمه معمولی مناسب نیست.
معمولاً زمانهای کوتاهتر برای تعاملات UI مناسبتر هستند.
۴. استفاده بیدلیل از all
بهجای:
transition: all 0.3s ease;اگر فقط دو ویژگی تغییر میکنند:
transition:
transform 0.3s ease,
box-shadow 0.3s ease;خواناتر و کنترلشدهتر است.
۵. انتخاب Timing Function نامناسب
برای هر تعامل لازم نیست linear استفاده کنیم.
مثلاً برای یک کارت:
transition: transform 0.3s ease-out;ممکن است طبیعیتر از:
transition: transform 0.3s linear;به نظر برسد.
بنابراین Timing Function بخشی از طراحی Interaction است.
پروژه عملی: کارت خدمات تعاملی
در این تمرین یک کارت خدمات حرفهای ایجاد کنید.
کارت باید شامل موارد زیر باشد:
┌──────────────────────────┐
│ ICON │
│ │
│ طراحی سایت │
│ │
│ توضیح کوتاه درباره
│ سرویس مورد نظر │
│ │
│ مشاهده بیشتر → │
└──────────────────────────┘در حالت عادی:
پسزمینه سفید
Border خاکستری
سایه کم
آیکون در اندازه معمولی
در hover:
کارت کمی به سمت بالا حرکت کند.
سایه بیشتر شود.
Border تغییر رنگ دهد.
آیکون کمی بزرگ شود.
لینک تغییر رنگ دهد.
راهنمای شروع
.service-card {
transition:
transform 0.3s ease,
box-shadow 0.3s ease,
border-color 0.3s ease;
}سپس:
.service-card:hover {
transform: translateY(-8px);
}و سایر تغییرات را خودتان اضافه کنید.
تمرینهای مقاله
تمرین ۱ — دکمه
یک دکمه بسازید که هنگام hover:
رنگش تغییر کند.
کمی بالا برود.
سایه ایجاد کند.
تمرین ۲ — تصویر
یک تصویر بسازید که هنگام Hover کمی بزرگ شود:
transform: scale(...);و تغییر آن را با Transition نرم کنید.
تمرین ۳ — کارت
یک کارت طراحی کنید که هنگام Hover:
translateY
box-shadow
border-colorهمگی بهصورت نرم تغییر کنند.
تمرین ۴ — Timing Function
یک عنصر بسازید و برای آن این چهار حالت را امتحان کنید:
linear
ease
ease-in
ease-outتفاوت آنها را هنگام Hover مشاهده کنید.
جمعبندی
Transition یکی از ابزارهای مهم CSS برای ایجاد رابطهای کاربری نرم و حرفهای است. بهجای اینکه تغییرات CSS بهصورت ناگهانی اتفاق بیفتند، Transition به مرورگر اجازه میدهد تغییر بین دو وضعیت را طی یک بازه زمانی نمایش دهد.
چهار ویژگی اصلی آن عبارتاند از:
transition-property
transition-duration
transition-timing-function
transition-delayاما در بیشتر پروژهها از شکل کوتاهشده استفاده میکنیم:
transition: transform 0.3s ease;یکی از مهمترین الگوهایی که باید از این مقاله به خاطر بسپارید این است:
.element {
transition: ...;
}
.element:hover {
/* تغییرات */
}با ترکیب Transition و ویژگیهایی مانند:
transform
box-shadow
background-color
color
opacityمیتوان رابطهای کاربری بسیار جذابتری ایجاد کرد.
در این مقاله Transition را برای تغییر بین دو وضعیت یاد گرفتیم. اما اگر بخواهیم یک عنصر را بدون نیاز به hover یا تعامل مستقیم کاربر، در چند مرحله مختلف حرکت دهیم یا تغییر دهیم، به ابزار قدرتمندتری نیاز داریم.
نظرات
هنوز نظری ثبت نشده است.