طراحی دکمه های سه بعدی با 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 به همراه رعایت اصول دسترسی میتواند دکمههای سهبعدی جذاب، کاربردی و بهینه تولید کند. همواره تست روی چند مرورگر و دستگاه مختلف را فراموش نکنید تا رفتار حرکت و رندرینگ سایهها بهدرستی نمایش داده شود.
آیا این مطلب برای شما مفید بود ؟




