ویژگی تصویر

طراحی دکمه‌های سه‌بعدی با CSS

  /  CSS   /  طراحی دکمه های سه بعدی با CSS
بنر تبلیغاتی الف

دکمه‌های سه‌بعدی می‌توانند تجربه کاربری را جذاب‌تر و قابل لمس‌تر کنند. در این مقاله به صورت عملی و گام‌به‌گام می‌بینیم چگونه با امکانات CSS مانند box-shadow، transform، pseudo-elements و متغیرهای CSS دکمه‌های سه‌بعدی زیبا، قابل دسترس و بهینه بسازیم. مثال‌ها شامل نسخه پایه، نسخه پیشرفته با متغیرها و نکات دسترسی (accessibility) خواهند بود.

مفاهیم پایه

  • box-shadow: ساخت عمق و سایه‌های بیرونی و داخلی.
  • transform: جابجایی و فشردن دکمه هنگام کلیک (translateY) برای ایجاد حس فشرده شدن.
  • pseudo-elements (::before, ::after): اضافه کردن لبه، های‌لایت یا سایه‌های مضاعف بدون اضافه کردن HTML جدید.
  • transition: نرم‌سازی حرکات برای حس طبیعی‌تر.
  • prefers-reduced-motion: احترام به تنظیمات کاربر برای کاهش حرکت.

مثال پایه — دکمه سه‌بعدی ساده

<button class="btn-3d">Click Me</button>

.btn-3d {
  --bg: #4f46e5;
  --shadow: rgba(79,70,229,0.35);
  padding: 12px 20px;
  color: #fff;
  border: none;
  border-radius: 8px;
  background: linear-gradient(180deg, var(--bg) 0%, #3730a3 100%);
  box-shadow: 0 8px 0 var(--shadow);
  transform: translateY(0);
  transition: transform 150ms ease, box-shadow 150ms ease;
  cursor: pointer;
}

.btn-3d:active {
  transform: translateY(6px);
  box-shadow: 0 2px 0 rgba(0,0,0,0.12);
}

توضیح: در این کد یک دکمه ساده ساخته‌ایم که با box-shadow یک سایه محکم در پایین دارد و هنگام فشرده شدن (active) با translateY به پایین حرکت می‌کند تا حس سه‌بعدی ایجاد شود. gradient پس‌زمینه عمق رنگ را افزایش می‌دهد. استفاده از متغیرهای CSS (به‌صورت –bg و –shadow) باعث خوانایی و قابلیت تغییر سریع رنگ‌ها می‌شود.

نسخه پیشرفته — لبه برجسته و سایه داخلی

<button class="btn-3d-adv">Send</button>

.btn-3d-adv {
  --bg: #06b6d4;
  --dark: #0891b2;
  --shadow: rgba(3,105,161,0.18);
  position: relative;
  padding: 14px 22px;
  color: #fff;
  border: none;
  border-radius: 10px;
  background: linear-gradient(180deg, var(--bg), var(--dark));
  box-shadow: 0 12px 0 var(--shadow), inset 0 1px rgba(255,255,255,0.08);
  transition: transform 180ms cubic-bezier(.2,.8,.2,1), box-shadow 180ms;
  cursor: pointer;
}

.btn-3d-adv::after {
  content: "";
  position: absolute;
  left: 6px;
  right: 6px;
  bottom: -10px;
  height: 10px;
  border-radius: 6px;
  background: rgba(0,0,0,0.12);
  filter: blur(6px);
  z-index: -1;
  transition: transform 180ms;
}

.btn-3d-adv:active {
  transform: translateY(8px);
  box-shadow: 0 4px 0 rgba(0,0,0,0.1), inset 0 1px rgba(255,255,255,0.04);
}

@media (prefers-reduced-motion: reduce) {
  .btn-3d-adv { transition: none; }
  .btn-3d-adv:active { transform: none; }
}

توضیح: در نسخه پیشرفته از دو سایه استفاده کرده‌ایم: یک box-shadow خارجی برای ارتفاع و یک سایه داخلی (inset) به‌عنوان های‌لایت. با pseudo-element ::after یک سایه «افتاده» زیر دکمه ایجاد شده تا حس شناور بودن قوی‌تر شود. همچنین با @media (prefers-reduced-motion: reduce) حرکت‌ها را برای کاربرانی که حرکت را غیرفعال کرده‌اند حذف کرده‌ایم تا دسترسی بهتر شود.

بهینه‌سازی و دسترسی (Accessibility)

  • همیشه از عنصر <button> استفاده کنید (یا role=”button” همراه با قابلیت‌های کیبورد) تا دسترسی پیش‌فرض مرورگر حفظ شود.
  • استایل فокус (outline) را حذف نکنید مگر اینکه تصویر فокус قابل تشخیص دیگری فراهم کنید. از :focus-visible برای تعیین استایل فقط هنگام نیاز استفاده کنید.
  • به رنگ‌ها توجه کنید — کنتراست کافی برای متن را حفظ کنید (حداقل 4.5:1 برای متن‌های کوچک).
  • prefers-reduced-motion را رعایت کنید تا کاربران حساس به حرکت تجربه راحت‌تری داشته باشند.

نمونه بهبود یافته با focus-visible و متغیرها

<button class="btn-3d-access">Download</button>

.btn-3d-access {
  --bg: #ef4444;
  --dark: #b91c1c;
  --shadow: rgba(185,28,28,0.24);
  position: relative;
  padding: 12px 18px;
  border-radius: 8px;
  border: none;
  color: #fff;
  background: linear-gradient(180deg,var(--bg),var(--dark));
  box-shadow: 0 10px 0 var(--shadow);
  transition: transform 160ms ease, box-shadow 160ms ease;
}

.btn-3d-access:active { transform: translateY(6px); box-shadow: 0 3px 0 rgba(0,0,0,0.12); }

.btn-3d-access:focus-visible {
  outline: 3px solid rgba(255,255,255,0.12);
  outline-offset: 4px;
}

توضیح: این نسخه علاوه بر افکت سه‌بعدی، استایل قابل توجهی برای focus-visible دارد که کاربران کیبوردی را راهنمایی می‌کند. استفاده از outline-offset باعث می‌شود خط فокус از لبه دکمه جدا شود و روی سایه تاثیری نگذارد.

مقایسه تکنیک‌ها

تکنیکمزایامعایب
box-shadow سادهسریع، کم‌هزینه از نظر رندرظاهر کمی تخت برای حالات پیچیده
pseudo-elements برای لبه‌هاقابلیت ساخت لایه‌های بیشتر بدون HTML اضافیپیچیدگی بیشتر و نیاز به مدیریت z-index
transform برای فشردنحس تعاملی طبیعیباید با reduced-motion هماهنگ شود

نکات حرفه‌ای و موارد استفاده

  • برای کارت‌ها یا UI هایی که عمق بیشتر می‌خواهند، از ترکیب چند shadow با blur و spread متفاوت استفاده کنید.
  • برای برنامه‌های موبایل، فاصله و padding دکمه را طوری تنظیم کنید که هدف لمسی مناسب وجود داشته باشد (حداقل 44×44 پیکسل توصیه می‌شود).
  • در طراحی سیستم، متغیرهای CSS (custom properties) را برای رنگ‌ها و ارتفاع سایه‌ها تعریف کنید تا تم دادن (theming) آسان شود.
  • از انیمیشن‌های کوتاه و ملایم استفاده کنید؛ انیمیشن بیش‌ازحد می‌تواند تجربه را آزاردهنده کند.

نمونه نهایی بهینه (جمع‌بندی)

<button class="btn-final">Proceed</button>

.btn-final {
  --primary: #2563eb;
  --primary-dark: #1e40af;
  --shadow-color: rgba(37,99,235,0.22);
  padding: 13px 20px;
  border-radius: 10px;
  border: none;
  color: #fff;
  background: linear-gradient(180deg,var(--primary),var(--primary-dark));
  box-shadow: 0 14px 0 var(--shadow-color), inset 0 1px rgba(255,255,255,0.06);
  transition: transform 160ms cubic-bezier(.2,.8,.2,1), box-shadow 160ms;
}

.btn-final:active { transform: translateY(9px); box-shadow: 0 4px 0 rgba(0,0,0,0.12); }

@media (prefers-reduced-motion: reduce) {
  .btn-final { transition: none; }
  .btn-final:active { transform: none; }
}

توضیح: این قطعه نهایی نشان‌دهنده تلفیق بهترین تمرین‌هاست: متغیرها برای سهولت تغییر، سایه ترکیبی برای عمق بیشتر، inset highlight برای درخشندگی سطح و احترام به prefers-reduced-motion. در بسیاری از پروژه‌ها همین الگو کافی و قابل تعمیم است.

نتیجه‌گیری کوتاه: استفاده هوشمندانه از shadow، gradient، transform و pseudo-elements به همراه رعایت اصول دسترسی می‌تواند دکمه‌های سه‌بعدی جذاب، کاربردی و بهینه تولید کند. همواره تست روی چند مرورگر و دستگاه مختلف را فراموش نکنید تا رفتار حرکت و رندرینگ سایه‌ها به‌درستی نمایش داده شود.

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

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