آموزش کامل متغیرهای CSS (Custom Properties) | ساخت دارک مود و تم حرفهای
خلاصه مطلب
متغیرهای CSS (Custom Properties) انقلابی در مدیریت استایلهای وب ایجاد کردهاند. در این مقاله جامع، از مفاهیم پایه تا ساخت تمهای چندگانه (لایت/دارک)، مدیریت رنگها، فونتها، فاصلهها و ریسپانسیو کردن با متغیرها را یاد میگیرید. همراه با پروژه عملی ساخت دارک مود کامل.
مقدمه: متغیرهای CSS چیستند و چرا به آنها نیاز داریم؟
متغیرهای CSS یا Custom Properties (ویژگیهای سفارشی) راهی برای ذخیره مقادیر (مانند رنگها، فونتها، فاصلهها و...) در یک مکان و استفاده مجدد از آنها در سراسر فایل CSS است.
مشکلات قبل از متغیرها:
-
اگر میخواستید رنگ اصلی سایت را عوض کنید، باید در ۱۰۰ جای مختلف کد را تغییر میدادید
-
ساخت تمهای مختلف (مثل دارک مود) بسیار سخت بود
-
کدها تکراری و غیرقابل نگهداری بودند
مزایای متغیرهای CSS:
-
یک بار تعریف، هزار بار استفاده
-
تغییر لحظهای با جاوااسکریپت (برای دارک مود)
-
کد تمیزتر و حرفهایتر
-
قابلیت ارثبری و scope محدود
-
پشتیبانی عالی مرورگرهای مدرن
مفاهیم پایه متغیرهای CSS (مرور سریع)
| مفهوم | نحو (Syntax) | مثال | توضیح |
|---|---|---|---|
| تعریف متغیر | --نام: مقدار; | --primary-color: #3498db; | دو خط تیره پیشوند |
| استفاده از متغیر | var(--نام) | color: var(--primary-color); | تابع var |
| مقدار پیشفرض | var(--نام, مقدار) | color: var(--primary, blue); | اگر متغیر تعریف نشده بود |
| scope سراسری | :root { } | :root { --bg: white; } | در کل سایت قابل استفاده |
| scope محلی | .component { } | .card { --padding: 10px; } | فقط در همان کامپوننت |
| تغییر با JS | setProperty() | setProperty('--bg', 'black'); | تغییر داینامیک |
۱۵+ مثال کاربردی متغیرهای CSS
مثال ۱: تعریف و استفاده از متغیرهای ساده
اساسیترین حالت: تعریف رنگها در :root و استفاده در المانها.
:root { --primary-color: #3498db; --secondary-color: #2ecc71; --danger-color: #e74c3c; --text-color: #333; --bg-color: #f5f5f5; } .button { background-color: var(--primary-color); color: white; padding: 10px 20px; border: none; border-radius: 5px; } .button-danger { background-color: var(--danger-color); } body { background-color: var(--bg-color); color: var(--text-color); }
<button class="button">دکمه معمولی</button> <button class="button button-danger">دکمه خطر</button>
مثال ۲: متغیرهای فونت و تایپوگرافی
مدیریت یکپارچه فونتها در سراسر سایت.
:root { --font-primary: 'Vazir', 'Segoe UI', Tahoma, sans-serif; --font-size-base: 16px; --font-size-lg: 1.25rem; --font-size-sm: 0.875rem; --font-weight-normal: 400; --font-weight-bold: 700; --line-height-normal: 1.5; } body { font-family: var(--font-primary); font-size: var(--font-size-base); line-height: var(--line-height-normal); } h1 { font-size: var(--font-size-lg); font-weight: var(--font-weight-bold); } small { font-size: var(--font-size-sm); }
مثال ۳: متغیرهای فاصله (Spacing)
مدیریت یکپارچه margin، padding و gap.
:root { --spacing-xs: 4px; --spacing-sm: 8px; --spacing-md: 16px; --spacing-lg: 24px; --spacing-xl: 32px; --spacing-xxl: 48px; } .card { padding: var(--spacing-md); margin-bottom: var(--spacing-lg); gap: var(--spacing-sm); } .container { padding: var(--spacing-xl); } .section { margin-top: var(--spacing-xxl); }
مثال ۴: متغیرهای border-radius
ساخت دکمهها و کارتهای با انحناهای یکسان.
:root { --radius-sm: 4px; --radius-md: 8px; --radius-lg: 12px; --radius-xl: 16px; --radius-round: 50%; --radius-pill: 9999px; } .button { border-radius: var(--radius-md); } .card { border-radius: var(--radius-lg); } .avatar { border-radius: var(--radius-round); } .badge { border-radius: var(--radius-pill); }
مثال ۵: متغیرهای سایه (Box Shadow)
سایههای یکسان در کل سایت.
:root { --shadow-sm: 0 1px 3px rgba(0,0,0,0.12); --shadow-md: 0 4px 6px rgba(0,0,0,0.1); --shadow-lg: 0 10px 15px rgba(0,0,0,0.1); --shadow-xl: 0 20px 25px rgba(0,0,0,0.1); --shadow-hover: 0 10px 20px rgba(0,0,0,0.2); } .card { box-shadow: var(--shadow-md); transition: box-shadow 0.3s; } .card:hover { box-shadow: var(--shadow-hover); } .modal { box-shadow: var(--shadow-xl); }
مثال ۶: متغیرهای تابعی (با calc)
ترکیب متغیرها با محاسبات ریاضی.
:root { --base-padding: 16px; --double-padding: calc(var(--base-padding) * 2); --half-padding: calc(var(--base-padding) / 2); --header-height: 70px; --content-min-height: calc(100vh - var(--header-height)); } .container { padding: var(--double-padding); } .small-box { padding: var(--half-padding); } .main-content { min-height: var(--content-min-height); }
مثال ۷: مقدار پیشفرض در var()
اگر متغیر تعریف نشده بود، از مقدار جایگزین استفاده کن.
.button { /* اگر --button-color تعریف نشده بود، از #3498db استفاده کن */ background-color: var(--button-color, #3498db); color: var(--button-text, white); padding: var(--button-padding, 12px 24px); }
مثال ۸: scope محلی (متغیر درون یک کامپوننت)
متغیرهایی که فقط در یک کامپوننت خاص معنی دارند.
.card { --card-bg: white; --card-padding: 20px; --card-border-radius: 10px; background: var(--card-bg); padding: var(--card-padding); border-radius: var(--card-border-radius); } .card.dark { --card-bg: #2c3e50; --card-padding: 15px; } /* متغیرهای بالا فقط داخل .card کار میکنند */
مثال ۹: پروژه عملی – ساخت دارک مود کامل (بخش ۱: تعریف تمها)
مهمترین کاربرد متغیرها: ساخت تم لایت و دارک.
/* تم لایت (پیشفرض) */ :root { --bg-primary: #ffffff; --bg-secondary: #f5f5f5; --text-primary: #333333; --text-secondary: #666666; --border-color: #e0e0e0; --primary-color: #3498db; --primary-hover: #2980b9; --card-bg: #ffffff; --shadow: 0 2px 10px rgba(0,0,0,0.1); --transition: all 0.3s ease; } /* تم دارک */ [data-theme="dark"] { --bg-primary: #1a1a2e; --bg-secondary: #16213e; --text-primary: #eeeeee; --text-secondary: #bbbbbb; --border-color: #2c3e50; --primary-color: #e94560; --primary-hover: #c62a47; --card-bg: #0f3460; --shadow: 0 2px 10px rgba(0,0,0,0.3); } /* اعمال متغیرها به المانها */ body { background-color: var(--bg-primary); color: var(--text-primary); transition: var(--transition); } .card { background-color: var(--card-bg); border: 1px solid var(--border-color); box-shadow: var(--shadow); transition: var(--transition); } button { background-color: var(--primary-color); color: white; transition: var(--transition); } button:hover { background-color: var(--primary-hover); }
مثال ۱۰: تغییر تم با جاوااسکریپت (دکمه دارک مود)
کد کامل برای تغییر تم با ذخیره در localStorage.
/* همان متغیرهای مثال بالا */ .theme-toggle { background: var(--primary-color); border: none; padding: 10px 20px; border-radius: 8px; cursor: pointer; color: white; }
// جاوااسکریپت تغییر تم const toggleTheme = () => { const currentTheme = document.documentElement.getAttribute('data-theme'); const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; document.documentElement.setAttribute('data-theme', newTheme); localStorage.setItem('theme', newTheme); }; // بارگذاری تم ذخیره شده const savedTheme = localStorage.getItem('theme'); if (savedTheme) { document.documentElement.setAttribute('data-theme', savedTheme); } // اتصال به دکمه document.querySelector('.theme-toggle')?.addEventListener('click', toggleTheme);
<button class="theme-toggle">🌙 تغییر تم</button>
مثال ۱۱: تم چندگانه (لایت، دارک، آبی، سبز)
ساخت ۴ تم مختلف برای سایت.
/* تم لایت (پیشفرض) */ :root { --primary: #3498db; --bg: white; --text: #333; } /* تم دارک */ [data-theme="dark"] { --primary: #e94560; --bg: #1a1a2e; --text: #eee; } /* تم آبی */ [data-theme="blue"] { --primary: #2980b9; --bg: #e8f4f8; --text: #2c3e50; } /* تم سبز */ [data-theme="green"] { --primary: #27ae60; --bg: #e8f8f5; --text: #1e8449; } body { background: var(--bg); color: var(--text); } button { background: var(--primary); }
// تغییر به تم خاص function setTheme(themeName) { document.documentElement.setAttribute('data-theme', themeName); localStorage.setItem('theme', themeName); }
مثال ۱۲: متغیرهای داینامیک با جاوااسکریپت
تغییر متغیرها به صورت مستقیم با JS.
:root { --main-color: #3498db; --font-size: 16px; }
// تغییر رنگ اصلی document.documentElement.style.setProperty('--main-color', '#e74c3c'); // افزایش فونت const currentSize = parseInt(getComputedStyle(document.documentElement) .getPropertyValue('--font-size')); document.documentElement.style.setProperty('--font-size', (currentSize + 2) + 'px'); // خواندن مقدار متغیر const color = getComputedStyle(document.documentElement) .getPropertyValue('--main-color'); console.log(color); // #3498db
مثال ۱۳: متغیرهای شرطی با fallback
استفاده از چندین fallback برای پشتیبانی بهتر.
.button { /* اول --primary-color، اگر نبود #3498db، اگر اونم نبود blue */ background: var(--primary-color, var(--fallback-blue, blue)); padding: var(--button-padding, 12px 24px); border-radius: var(--button-radius, 8px); }
مثال ۱۴: متغیرهای ریسپانسیو (با Media Queries)
تغییر خودکار متغیرها در اندازههای مختلف صفحه.
:root { --container-padding: 20px; --font-size-base: 14px; } @media (min-width: 768px) { :root { --container-padding: 40px; --font-size-base: 16px; } } @media (min-width: 1200px) { :root { --container-padding: 60px; --font-size-base: 18px; } } .container { padding: var(--container-padding); } body { font-size: var(--font-size-base); }
مثال ۱۵: سیستم طراحی کامل (Design System)
یک سیستم طراحی حرفهای با متغیرهای CSS.
:root { /* رنگها */ --color-primary: #6366f1; --color-primary-dark: #4f46e5; --color-secondary: #8b5cf6; --color-success: #10b981; --color-danger: #ef4444; --color-warning: #f59e0b; --color-info: #3b82f6; /* سطوح خاکستری */ --gray-100: #f3f4f6; --gray-200: #e5e7eb; --gray-300: #d1d5db; --gray-400: #9ca3af; --gray-500: #6b7280; --gray-600: #4b5563; --gray-700: #374151; --gray-800: #1f2937; --gray-900: #111827; /* فاصلهها */ --space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem; --space-4: 1rem; --space-5: 1.25rem; --space-6: 1.5rem; --space-8: 2rem; --space-10: 2.5rem; --space-12: 3rem; /* فونت */ --font-sans: 'Inter', system-ui, -apple-system, sans-serif; --font-serif: 'Merriweather', Georgia, serif; --font-mono: 'Fira Code', monospace; /* سایه */ --shadow-xs: 0 1px 2px rgba(0,0,0,0.05); --shadow-sm: 0 1px 3px rgba(0,0,0,0.1); --shadow-md: 0 4px 6px rgba(0,0,0,0.1); --shadow-lg: 0 10px 15px rgba(0,0,0,0.1); --shadow-xl: 0 20px 25px rgba(0,0,0,0.1); }
مثال ۱۶: انیمیشن با متغیرها
تغییر متغیرها در انیمیشنها.
:root { --animation-speed: 0.3s; --animation-easing: cubic-bezier(0.4, 0, 0.2, 1); } .button { transition: all var(--animation-speed) var(--animation-easing); } .modal { animation: fadeIn var(--animation-speed) ease; } @keyframes fadeIn { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } }
11. ویژگیها و بخشهای مختلف
-
✅ ۱۶ مثال کاربردی از مبتدی تا پیشرفته
-
✅ پروژه عملی کامل دارک مود با جاوااسکریپت و localStorage
-
✅ سیستم طراحی (Design System) کامل با رنگها، فاصلهها، فونتها و سایهها
-
✅ تم چندگانه (لایت، دارک، آبی، سبز)
-
✅ متغیرهای ریسپانسیو با Media Queries
-
✅ کدهای آماده و قابل کپی برای هر مثال
-
✅ یکپارچگی با جاوااسکریپت برای تغییر داینامیک
جدول مرجع سریع متغیرهای CSS:
| تکنیک | کد | کاربرد |
|---|---|---|
| تعریف سراسری | :root { --name: value; } | کل سایت |
| استفاده | property: var(--name); | فراخوانی |
| پیشفرض | var(--name, fallback) | ایمنی |
| تغییر با JS | setProperty('--name', value) | داینامیک |
| scope محلی | .comp { --local: value; } | ایزوله |
| ترکیب با calc | calc(var(--base) * 2) | محاسبات |
۱۴. بخش تمرین عملی (پروژه نهایی)
💡 پروژه نهایی (چالش حرفهای):
با استفاده از متغیرهای CSS، یک صفحه فرود (Landing Page) کامل بسازید که شامل:
سیستم طراحی کامل با حداقل ۲۰ متغیر (رنگ، فاصله، فونت، سایه)
۳ تم مختلف (لایت، دارک، و یک تم دلخواه مثل آبی یا بنفش)
دکمه تغییر تم با ذخیره در localStorage
حداقل ۴ کامپوننت متفاوت (هدر، کارت، دکمه، فرم) که از متغیرها استفاده کنند
متغیرهای ریسپانسیو که در موبایل و دسکتاپ متفاوت باشند
کدهای خود را در بخش نظرات به اشتراک بگذارید. بهترین پروژهها را در مقاله بعدی معرفی میکنیم.
کلمات کلیدی:
متغیرهای CSS,Custom Properties,دارک مود با CSS,طراحی تم,ریشه CSS,:root,تغییر تم سایت,متغیرهای پیشرفته CSS
نظرات (0)