آموزش کامل CSS Layers (@layer) | مدیریت اولویتها در پروژههای بزرگ + ۱۵ مثال
خلاصه مطلب
CSS Layers یکی از قدرتمندترین افزودههای CSS مدرن است که به شما اجازه میدهد استایلها را در لایههای مختلف سازماندهی کنید و بدون جنگیدن با Specificity، اولویتها را کنترل کنید. در این مقاله، از مفاهیم پایه تا مدیریت پروژههای بزرگ با چندین فایل CSS، ریست استایلها، فریمورکها و استایلهای سفارشی را یاد میگیرید.
مقدمه: مشکل Specificity در CSS و راه حل لایهها
یکی از بزرگترین چالشهای CSS در پروژههای بزرگ، جنگیدن با اولویتها (Specificity) است. وقتی چندین فایل CSS دارید (مثل reset.css، bootstrap، و استایلهای سفارشی)، گاهی مجبور میشوید از !important استفاده کنید یا سلکتورهای بسیار طولانی بنویسید.
مشکلات قبل از CSS Layers:
-
استایلهای فریمورک همیشه از استایلهای شما سبقت میگرفتند
-
مجبور بودید از !important استفاده کنید (باعث ایجاد کد کثیف)
-
ترتیب بارگذاری فایلها خیلی مهم بود اما کافی نبود
-
در تیمهای بزرگ، استایلها با هم تداخل داشتند
راه حل: CSS Layers (@layer)
با لایهبندی، شما میتوانید ترتیب اولویت لایهها را خودتان تعیین کنید. استایلهای لایههای بعدی، همیشه بر لایههای قبلی غلبه دارند، بدون توجه به Specificity.
مفاهیم پایه CSS Layers (مرور سریع)
| مفهوم | نحو | توضیح |
|---|---|---|
| تعریف لایه | @layer name { } | ایجاد لایه با قوانین |
| تعریف چند لایه همزمان | @layer reset, framework, components, utilities; | اعلام ترتیب لایهها |
| اضافه کردن به لایه موجود | @layer components { .btn { } } | افزودن به لایه |
| لایه ناشناس (anonymous) | @layer { } | لایه بدون نام (اولویت پایین) |
| لایه پیشفرض (unlayered) | استایلهای بیرون از هر لایه | بالاترین اولویت |
ترتیب اولویت (از کم به زیاد):
-
لایههای تعریف شده (به ترتیب: اولی کمترین اولویت، آخری بیشترین)
-
استایلهای داخل @layer (با ترتیب تعریف)
-
استایلهای بدون لایه (unlayered) – بالاترین اولویت
۱۵+ مثال کاربردی CSS Layers
مثال ۱: تعریف ساده لایهها – اولویت پایه
درک اولیه چگونگی اولویت لایهها.
/* تعریف لایهها به ترتیب اولویت (از کم به زیاد) */ @layer reset, theme, components; @layer reset { button { border: none; background: transparent; font-size: 16px; } } @layer theme { button { background: #3498db; color: white; padding: 10px 20px; } } @layer components { button { border-radius: 8px; cursor: pointer; } } /* نتیجه نهایی: تمام ویژگیها ترکیب میشوند اما لایه components اولویت دارد */
مثال ۲: جنگ Specificity – برتری لایه بر Specificity
حتی اگر سلکتور لایه اول خاصتر باشد، لایه دوم اولویت دارد.
@layer base { /* خیلی خاص است (اولویت بالا در حالت عادی) */ div#main .container .btn-special { background: red; color: white; } } @layer override { /* ساده است (اولویت پایین در حالت عادی) */ .btn { background: blue; color: yellow; } } /* نتیجه: استایل override اعمال میشود چون لایه override بعد از base تعریف شده */
مثال ۳: اعلام ترتیب لایهها در ابتدا (بهترین روش)
همیشه ترتیب لایهها را در ابتدای فایل CSS اعلام کنید.
/* اعلام ترتیب لایهها – بهترین روش */ @layer reset, framework, components, utilities; /* حالا هر جا که این لایهها را تعریف کنید، همین ترتیب رعایت میشود */ @layer reset { * { margin: 0; padding: 0; box-sizing: border-box; } } @layer framework { .btn { padding: 12px 24px; background: gray; } } @layer components { .btn-primary { background: #3498db; } } @layer utilities { .p-4 { padding: 16px; } }
مثال ۴: مدیریت ریست (Reset) و فریمورک
ساختار استاندارد برای پروژههای بزرگ با فریمورک.
/* مرحله 1: تعریف ترتیب لایهها */ @layer reset, bootstrap, custom, utilities; /* مرحله 2: ریست استایلها */ @layer reset { * { margin: 0; padding: 0; box-sizing: border-box; } body { line-height: 1.5; } img { max-width: 100%; display: block; } } /* مرحله 3: استایلهای فریمورک (مثل Bootstrap) */ @layer bootstrap { /* اینجا معمولاً فایل فریمورک ایمپورت میشود */ .btn { padding: 8px 16px; border-radius: 4px; background: #6c757d; } .btn-primary { background: #0d6efd; } } /* مرحله 4: استایلهای سفارشی پروژه */ @layer custom { .btn-primary { background: #e74c3c; /* این بر استایل bootstrap غلبه میکند */ border-radius: 50px; } .header { background: #2c3e50; } } /* مرحله 5: کلاسهای کمکی (بالاترین اولویت) */ @layer utilities { .text-center { text-align: center; } .mt-4 { margin-top: 16px; } }
مثال ۵: اضافه کردن به لایه موجود بعداً
میتوانید در هر جای فایل CSS به یک لایه اضافه کنید.
/* اعلام اولیه لایهها */ @layer components; /* بعداً در فایل */ @layer components { .card { padding: 20px; border: 1px solid #ddd; } } /* حتی بعدتر */ @layer components { .card-header { font-weight: bold; margin-bottom: 10px; } .card:hover { box-shadow: 0 5px 15px rgba(0,0,0,0.1); } }
مثال ۶: لایههای تو در تو (Nested Layers)
امکان تعریف لایه داخل لایه وجود دارد.
@layer framework { @layer base { body { font-family: sans-serif; } } @layer theme { .dark { background: black; } } } /* دسترسی به لایههای تو در تو */ @layer framework.theme { .dark { color: white; } }
مثال ۷: لایه ناشناس (Anonymous Layer)
لایه بدون نام که همیشه اولویت کمتری از لایههای نامدار دارد.
/* لایه ناشناس – اولویت پایین */ @layer { p { color: gray; } } /* لایه نامدار – اولویت بالاتر */ @layer content { p { color: black; } }
مثال ۸: استایلهای بدون لایه (Unlayered) – بالاترین اولویت
هر استایلی که درون هیچ لایهای نباشد، بالاترین اولویت را دارد.
@layer base { .btn { background: blue; } } @layer components { .btn { background: green; } } /* بدون لایه – بر همه چیز غلبه میکند */ .btn { background: red !important; /* حتی بدون !important هم اولویت دارد */ }
مثال ۹: پروژه عملی – فروشگاه اینترنتی با لایهبندی
یک پروژه کامل فروشگاهی با لایههای مختلف.
/* ======================================== پروژه فروشگاه آنلاین با CSS Layers ======================================== */ /* 1. تعریف ترتیب لایهها */ @layer reset, fonts, variables, base, components, pages, utilities, overrides; /* 2. لایه reset – ریست استایلها */ @layer reset { * { margin: 0; padding: 0; box-sizing: border-box; } button, input, select { font: inherit; } } /* 3. لایه fonts – تعریف فونتها */ @layer fonts { @import url('https://fonts.googleapis.com/css2?family=Vazir&display=swap'); body { font-family: 'Vazir', system-ui, sans-serif; } } /* 4. لایه variables – متغیرهای CSS */ @layer variables { :root { --primary: #e94560; --secondary: #533483; --dark: #0f3460; --light: #f5f5f5; --spacing: 1rem; } } /* 5. لایه base – استایلهای پایه */ @layer base { body { background: var(--light); color: #333; } a { text-decoration: none; color: var(--primary); } button { cursor: pointer; border: none; background: var(--primary); color: white; padding: 10px 20px; border-radius: 8px; } } /* 6. لایه components – کامپوننتهای قابل استفاده مجدد */ @layer components { .card { background: white; border-radius: 12px; padding: 20px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } .product-card { transition: transform 0.3s; } .product-card:hover { transform: translateY(-5px); } .btn-primary { background: var(--primary); } .btn-secondary { background: var(--secondary); } .navbar { display: flex; justify-content: space-between; padding: var(--spacing); background: var(--dark); color: white; } } /* 7. لایه pages – استایلهای خاص هر صفحه */ @layer pages { .homepage .hero { background: linear-gradient(135deg, var(--primary), var(--secondary)); padding: 80px 20px; text-align: center; color: white; } .product-page .gallery { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; } } /* 8. لایه utilities – کلاسهای کمکی */ @layer utilities { .text-center { text-align: center; } .mt-2 { margin-top: 8px; } .mt-4 { margin-top: 16px; } .mb-4 { margin-bottom: 16px; } .p-4 { padding: 16px; } .d-flex { display: flex; } .gap-2 { gap: 8px; } } /* 9. لایه overrides – برای اووررایدهای خاص (مثل هکهای موقتی) */ @layer overrides { /* فقط برای یک صفحه خاص */ .homepage .hero h1 { font-size: 48px; } }
مثال ۱۰: مدیریت import فایلهای خارجی با لایه
ایمپورت کردن فایلهای CSS در لایههای خاص.
/* وارد کردن فایل ریست در لایه reset */ @import url('reset.css') layer(reset); /* وارد کردن بوتاسترپ در لایه framework */ @import url('bootstrap.min.css') layer(framework); /* وارد کردن فونت در لایه fonts */ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap') layer(fonts); /* استایلهای سفارشی بدون لایه – بالاترین اولویت */ @import url('custom.css'); /* تعریف لایهها بعد از import */ @layer reset, framework, fonts;
مثال ۱۱: تشخیص پشتیبانی مرورگر با @supports
استفاده شرطی از لایهها برای مرورگرهای قدیمی.
/* مرورگرهای مدرن – از لایه استفاده میکنند */ @supports (container-type: inline-size) { @layer components { .card { display: flex; } } } /* مرورگرهای قدیمی – fallback ساده */ @supports not (container-type: inline-size) { .card { display: block; } }
مثال ۱۲: لایهبندی برای دارک مود
مدیریت تمها با لایهها.
@layer theme-light, theme-dark, components; @layer theme-light { :root { --bg: white; --text: black; } } @layer theme-dark { @media (prefers-color-scheme: dark) { :root { --bg: black; --text: white; } } /* یا با کلاس دستی */ [data-theme="dark"] { --bg: black; --text: white; } } @layer components { body { background: var(--bg); color: var(--text); } }
مثال ۱۳: رفع تداخل فریمورکها (مثل Tailwind + Bootstrap)
مدیریت دو فریمورک با هم.
/* تعریف لایهها – bootstrap اولویت پایینتر دارد */ @layer bootstrap, tailwind, custom; /* وارد کردن Bootstrap */ @import url('bootstrap.css') layer(bootstrap); /* وارد کردن Tailwind (اولویت بالاتر) */ @import url('tailwind.css') layer(tailwind); /* استایلهای سفارشی (اولویت بالاترین) */ @layer custom { .btn { border-radius: 50px; /* این بر هر دو فریمورک غلبه میکند */ } }
مثال ۱۴: دیباگ کردن لایهها در DevTools
Chrome DevTools به شما نشان میدهد هر استایل از کدام لایه آمده است.
@layer base { .debug-example { color: red; } } @layer override { .debug-example { color: blue; } } /* در DevTools میتوانید ببینید کدام لایه برنده شده است */
مثال ۱۵: لایهبندی برای پرینت
مدیریت استایلهای پرینت با لایه.
@layer screen, print; @layer screen { @media (max-width: 768px) { .sidebar { display: none; } } } @layer print { @media print { .sidebar, .header, .footer { display: none; } body { font-size: 12pt; } } }
مثال ۱۶: ترکیب CSS Layers با CSS Variables
قدرت ترکیبی برای پروژههای بزرگ.
@layer variables, base, components; @layer variables { :root { --primary: #3498db; --secondary: #2ecc71; } } @layer base { body { font-family: system-ui; color: var(--primary); } } @layer components { .btn { background: var(--primary); color: white; } .btn-secondary { background: var(--secondary); } }
جدول مرجع: ترتیب اولویت در CSS مدرن (از کم به زیاد)
| رتبه | نوع | مثال | توضیح |
|---|---|---|---|
| 1 | لایه ناشناس | @layer { } | پایینترین اولویت |
| 2 | اولین لایه نامدار | @layer reset { } | با ترتیب تعریف |
| 3 | لایههای بعدی | @layer components { } | هر لایه بعدی اولویت بیشتر |
| 4 | استایلهای بدون لایه | body { } | بالاتر از همه لایهها |
| 5 | !important در لایه | color: red !important; | خیلی بالا |
| 6 | !important بدون لایه | color: red !important; | بالاترین اولویت ممکن |
11. ویژگیها و بخشهای مختلف
-
✅ ۱۵+ مثال کاربردی از پایه تا پیشرفته
-
✅ پروژه عملی کامل (فروشگاه اینترنتی با ۹ لایه)
-
✅ مدیریت تداخل فریمورکها (Bootstrap + Tailwind)
-
✅ ترکیب با import برای فایلهای خارجی
-
✅ جدول مرجع اولویتبندی کامل
-
✅ رفع مشکل Specificity بدون استفاده از !important
-
✅ سازماندهی حرفهای برای تیمهای بزرگ
-
✅ کدهای آماده و قابل کپی
۱۴. بخش تمرین عملی (چالش نهایی)
💡 چالش نهایی (پروژه محور):
با استفاده از CSS Layers، یک سیستم مدیریت محتوای کامل (CMS) بسازید که شامل:
حداقل ۷ لایه با ترتیب مناسب (reset, variables, base, framework, components, admin, utilities)
وارد کردن یک فریمورک خارجی (مثل Bootstrap یا Tailwind) در لایه framework
لایه admin که استایلهای پنل مدیریت را دارد و بر استایلهای عادی غلبه میکند
یک کامپوننت کارت که در لایه components تعریف شده و سپس در لایه admin تغییر میکند
لایه utilities با حداقل ۵ کلاس کمکی
یک صفحه کامل (مثل داشبورد ادمین) که از همه لایهها استفاده کند
کدهای خود را در بخش نظرات به اشتراک بگذارید. بهترین پروژهها را در مقاله بعدی معرفی میکنیم.
کلمات کلیدی:
CSS cascade layers, @layer tutorial, CSS specificity management, لایهبندی سی اس اس، مدیریت اولویت CSS
نظرات (0)