ویژگی تصویر

ساخت دکمه های داینامیک با CSS

  /  CSS   /  ساخت دکمه های داینامیک با 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 می‌توان دکمه‌های زیبا، سریع و دسترس‌پذیر ایجاد کرد که بدون بار اضافه جاوااسکریپت کار می‌کنند. رعایت اصول عملکرد و دسترس‌پذیری تضمین می‌کند این دکمه‌ها در محصولات واقعی مقیاس‌پذیر باشند.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: