ساخت دکمه های داینامیک با CSS
دکمههای داینامیک (interactive/dynamic buttons) نقش مهمی در تجربه کاربری دارند. با CSS مدرن میتوان بدون جاوااسکریپت دکمههایی ساخت که با حرکت، فشار و فوکوس کاربر واکنش نشان دهند. در این مقاله به مبانی، الگوهای رایج، نکات دسترسپذیری و عضویت در پروژههای واقعی میپردازیم.
مبانی: چه چیزی “داینامیک” محسوب میشود؟
دکمه داینامیک یعنی دکمهای که به تعامل کاربر پاسخ میدهد — hover، active، focus، یا وضعیتهای تغییر موضوع (theme). اصول کلی:
- استفاده از transition و transform برای انیمیشنهای روان
- پیوسته نگه داشتن عملکرد با transform و opacity به جای تغییر خصوصیات layout (مثل top/left)
- پیروی از دسترسپذیری: فوکوس واضح و پشتیبانی از prefers-reduced-motion
مثال پایه: دکمه با پوشش لغزشی
<button class="btn">ارسال</button>
:root{
--btn-bg: #1e90ff;
--btn-color: #fff;
--btn-padding: 0.6rem 1rem;
--btn-radius: 8px;
--btn-transition: 300ms cubic-bezier(.2,.9,.2,1);
}
.btn{
position: relative;
display: inline-block;
padding: var(--btn-padding);
background: var(--btn-bg);
color: var(--btn-color);
border: none;
border-radius: var(--btn-radius);
cursor: pointer;
overflow: hidden;
transition: transform var(--btn-transition), box-shadow var(--btn-transition);
box-shadow: 0 6px 18px rgba(30,144,255,0.18);
}
.btn::before{
content: "";
position: absolute;
inset: 0;
background: linear-gradient(90deg, rgba(255,255,255,0.15), rgba(255,255,255,0));
transform: translateX(-100%);
transition: transform var(--btn-transition);
pointer-events: none;
}
.btn:hover{
transform: translateY(-3px);
}
.btn:hover::before{
transform: translateX(0);
}
.btn:active{
transform: translateY(0);
box-shadow: 0 4px 10px rgba(0,0,0,0.12);
}
توضیح: این کد یک دکمه ساده ایجاد میکند که هنگام هاور کمی بالا میآید و یک پوشش براق (با ::before) از چپ به راست لغزیده و ظاهری متحرک ایجاد میکند. از transform برای حرکت (سریعتر و بهینهتر از تغییر position) و از box-shadow برای عمق استفاده شده است.
افزودن افکتهای پیشرفته با pseudo-elements و clip-path
<button class="btn-ghost">دانلود</button>
.btn-ghost{
--c: #ff6b6b;
position: relative;
padding: 0.6rem 1.1rem;
background: transparent;
color: var(--c);
border: 2px solid var(--c);
border-radius: 999px;
overflow: hidden;
transition: color 250ms ease;
}
.btn-ghost::after{
content: "";
position: absolute;
inset: 0;
background: var(--c);
transform: scaleX(0);
transform-origin: left;
transition: transform 300ms cubic-bezier(.22,.9,.3,1);
z-index: -1;
}
.btn-ghost:hover{
color: #fff;
}
.btn-ghost:hover::after{
transform: scaleX(1);
}
.btn-ghost:focus-visible{
outline: 3px solid rgba(0,0,0,0.08);
outline-offset: 3px;
}
توضیح: این الگو یک دکمه توخالی با شعاع زیاد است که هنگام هاور یک لایه پسزمینه از چپ به راست رشد میکند (scaleX). از transform-origin برای کنترل جهت رشد استفاده شده. focus-visible برای دسترسپذیری هنگام حرکت با صفحهکلید اضافه شده است.
حالتهای دسترسپذیری و prefers-reduced-motion
برای احترام به کاربران حساس به حرکت باید از media query مخصوص استفاده کنید. همچنین فوکوس واضح و نوارهای قابل مشاهده را فراموش نکنید.
@media (prefers-reduced-motion: reduce){
.btn, .btn-ghost, .btn::before, .btn-ghost::after{
transition: none !important;
animation: none !important;
}
}
.btn:focus-visible{
box-shadow: 0 0 0 4px rgba(30,144,255,0.12);
}
توضیح: این قطعه، انیمیشن و ترنزیشنها را برای کاربرانی که انتخاب کردهاند کاهش حرکت را فعال کنند غیرفعال میکند. focus-visible برای نمایش واضح وضعیت فوکوس کیبورد استفاده شده که با دسترسی بهتر ترکیب میشود.
تمینگ با CSS Variables و تغییر وضعیت (dark/light)
:root{
--primary: #1e90ff;
--bg: #fff;
--text: #111;
}
[data-theme="dark"]{
--primary: #4cc9f0;
--bg: #0b1220;
--text: #e6eef8;
}
.btn-theme{
background: var(--primary);
color: var(--bg);
padding: 0.55rem 0.95rem;
border-radius: 6px;
}
توضیح: با استفاده از CSS Variables و یک attribute مثل data-theme میتوان بهراحتی بین تمها سوییچ کرد بدون تغییر HTML یا JS زیاد. این الگو برای سیستمهایی که تمبندی در سطح root دارند بسیار مفید است.
بهینهسازی عملکرد: چه کارهایی انجام ندهیم
برای عملکرد بهتر انیمیشنها موارد زیر را رعایت کنید:
| خصوصیت | هزینهٔ GPU/CSS |
|---|---|
| transform, opacity | کم — مناسب برای انیمیشنها |
| box-shadow, filter | متوسط — ممکن است هزینهبر شود در عناصر زیاد |
| top, left, width, height | زیاد — باعث reflow و repaint میشود |
توضیح: جدول نشان میدهد که transform/opacity بهترین انتخاب هستند. تغییر معیارهای layout باعث بازنقشهبرداری صفحه (reflow) میشود و در صفحات با تعداد زیاد عنصر میتواند عملکرد را پایین بیاورد.
مثال ترکیبی: دکمه با آیکون متحرک و حالت غیرفعال
<button class="btn-action" aria-label="افزودن به سبد" >
<span class="icon">+</span>
<span>افزودن</span>
</button>
.btn-action{
--c: #2dd4bf;
display: inline-flex;
gap: 0.5rem;
align-items: center;
padding: 0.5rem 0.8rem;
border-radius: 12px;
background: #062f34;
color: var(--c);
border: 2px solid rgba(45,212,191,0.12);
transition: transform 220ms ease, box-shadow 220ms ease;
}
.btn-action .icon{
display: inline-grid;
place-items: center;
width: 1.6rem;
height: 1.6rem;
background: rgba(45,212,191,0.08);
border-radius: 6px;
transition: transform 220ms ease;
}
.btn-action:hover .icon{
transform: rotate(20deg) translateY(-2px);
}
.btn-action:disabled{
opacity: 0.45;
pointer-events: none;
}
توضیح: این مثال یک دکمه ترکیبی با آیکون دارد که هنگام هاور آیکون کمی میچرخد. حالت disabled با کاهش opacity و غیرفعال کردن pointer-events مشخص شده است. aria-label به دسترسپذیری کمک میکند اگر متن در آیکون واضح نباشد.
موارد استفاده و نکات نهایی
- در صفحههای فرم: دکمههای داینامیک برای نشان دادن حالت ارسال یا خطا مفیدند (مثلاً تغییر رنگ یا نمایش آیکون لودینگ).
- در رابطهای موبایل: از افکتهای سبک و transform محور استفاده کنید تا مصرف انرژی کم شود.
- برای پیادهسازی کامپوننت در کتابخانهها: رفتارها را با کلاسهای کوچک و متغیرهای CSS پراکنده نکنید — یک API کلاس و متغیر تم تعریف کنید.
خلاصه: با ترکیب CSS Variables، pseudo-elements، transform/opacity و مدیا کوئری prefers-reduced-motion میتوان دکمههای زیبا، سریع و دسترسپذیر ایجاد کرد که بدون بار اضافه جاوااسکریپت کار میکنند. رعایت اصول عملکرد و دسترسپذیری تضمین میکند این دکمهها در محصولات واقعی مقیاسپذیر باشند.
آیا این مطلب برای شما مفید بود ؟




