🎨 نسخه دایره‌المعارفی — کامل و آفلاین

دنیای کامل CSS
از صفر تا صد

ادامه‌ی رسمی دایره‌المعارف HTML — این‌بار با تمرکز کامل روی CSS. هر مفهوم، هر ویژگی و هر تکنیک با مثال، خروجی زنده و توضیح قدم‌به‌قدم برای کسی که هیچ آشنایی‌ای با این دنیا ندارد.

۲۵
فصل کامل
۲۰۰+
ویژگی و مفهوم
۱۰۰٪
آفلاین
مثال زنده

نوشته‌شده توسط صدرا حاتمی | Sadra Hatami

۰

CSS چیست و چرا وجود دارد؟

از لباس صفحه تا کنترل کامل ظاهر

اگر HTML را یاد گرفته باشی، می‌دانی که HTML اسکلت و محتوای صفحه را می‌سازد: عنوان، پاراگراف، عکس، دکمه و... . اما HTML به‌تنهایی خیلی زشت است — یک متن سیاه‌وسفید ساده روی پس‌زمینه سفید. اینجاست که CSS وارد می‌شود.

CSS مخفف Cascading Style Sheets (برگه‌های سبک آبشاری) است. وظیفه‌اش این است که به مرورگر بگوید عناصر HTML چطور دیده شوند: چه رنگی، چه اندازه‌ای، کجای صفحه، با چه فاصله‌ای، با چه انیمیشنی و... .

📌 یک تشبیه ساده

اگر یک صفحه‌ی وب را به یک انسان تشبیه کنیم: HTML اسکلت و اندام‌هاست، CSS لباس، آرایش و ظاهر است، و JavaScript رفتار و حرکت است. هر سه با هم یک سایت کامل می‌سازند.

کلمه‌ی «Cascading» یعنی چه؟

یعنی «آبشاری». چند فایل و قانون مختلف می‌توانند روی یک عنصر تأثیر بگذارند و این قوانین مثل آبشار روی هم می‌ریزند. CSS قانون‌هایی دارد که تعیین می‌کند وقتی چند دستور با هم تناقض دارند، کدام برنده شود (این را در فصل اولویت کامل توضیح می‌دهیم).

اولین کد CSS تو

بیا یک پاراگراف ساده را رنگی و بزرگ کنیم. نگران فهمیدن جزئیات نباش، فقط ببین چطور است:

CSS
p {
  color: deeppink;      /* رنگ متن */
  font-size: 24px;     /* اندازه فونت */
  font-weight: bold;   /* ضخامت */
}
خروجی زنده ↓

این پاراگراف با CSS بالا استایل گرفته!

تاریخچه‌ی کوتاه CSS

نسخهسالچه آورد
CSS1۱۹۹۶رنگ، فونت، حاشیه — پایه‌ها
CSS2۱۹۹۸Positioning، media types
CSS3۱۹۹۹+به «ماژول‌ها» شکست: انیمیشن، Flexbox، Grid، Transform و...
CSS امروززندهدیگر شماره‌ی نسخه ندارد؛ هر ماژول جدا رشد می‌کند (مثل HTML Living Standard)
💡 نکته مهم برای مبتدی‌ها

امروز کسی نمی‌گوید «CSS3»؛ فقط می‌گوییم «CSS». ماژول‌های جدید مرتب اضافه می‌شوند. در این دایره‌المعارف هر جا ویژگی نسبتاً جدیدی باشد، با برچسب نوین مشخصش می‌کنیم.

۱

سینتکس و قواعد نگارش CSS

دستور زبان دقیق CSS را کالبدشکافی کنیم

هر قانون (Rule) در CSS از چند بخش ساخته شده. بیا با دقت یک قانون را تشریح کنیم تا هرگز گیج نشوی.

آناتومی یک قانون (Rule)

آناتومی قانون CSS
  ┌── سلکتور (Selector): چه چیزی را استایل بدهیم؟
h1 {
  ┌── پراپرتی    ┌── مقدار (Value)
  color: blue;   ← یک «اعلان» (Declaration)
  font-size: 32px;
}
▲                    ▲
آکولاد باز           ; جداکننده اعلان‌ها
  • سلکتور (Selector): مشخص می‌کند کدام عناصر استایل بگیرند (اینجا همه‌ی h1ها).
  • بلوک اعلان (Declaration Block): هر چیز داخل آکولاد { }.
  • اعلان (Declaration): یک جفت پراپرتی: مقدار.
  • پراپرتی (Property): چه ویژگی‌ای را تغییر دهیم؟ (مثلاً color).
  • مقدار (Value): چه مقداری؟ (مثلاً blue).
  • سمی‌کالن (;): هر اعلان را از بعدی جدا می‌کند — فراموشش نکن!
⚠️ پرتکرارترین اشتباه مبتدی‌ها

فراموش کردن ; در انتهای اعلان! اگر بنویسی color: red font-size: 20px; هر دو اعلان نادیده گرفته می‌شوند. همیشه بعد از هر مقدار یک ; بگذار.

کامنت در CSS

برای یادداشت‌گذاری که مرورگر آن را اجرا نمی‌کند:

کامنت
/* این یک کامنت تک‌خطی است */

/*
  کامنت
  چندخطی هم همینطوری
*/

body { margin: 0; /* حذف فاصله پیش‌فرض */ }
📌 توجه

در CSS فقط کامنت /* */ وجود دارد. کامنت تک‌خطی // (مثل JavaScript) در CSS خالص کار نمی‌کند.

حساسیت به حروف و فاصله

  • پراپرتی‌ها و مقادیر کلیدواژه‌ای معمولاً حساس به حروف نیستند (COLOR = color)، اما قرارداد این است که همیشه حروف کوچک بنویسی.
  • نام کلاس‌ها و IDها حساس به حروف هستند (.Box با .box فرق دارد).
  • فاصله‌ها و خطوط خالی اضافی نادیده گرفته می‌شوند، پس می‌توانی کد را تمیز و خوانا بنویسی.

چند مقدار و چند سلکتور

گروه‌بندی
/* یک قانون برای چند سلکتور (با کاما) */
h1, h2, h3 {
  font-family: Tahoma, sans-serif;
}
۲

سه روش افزودن CSS به HTML

کجا و چطور CSS بنویسیم؟

سه راه برای وصل کردن CSS به HTML وجود دارد. هر کدام جا و کاربرد خودش را دارد.

۱. Inline (درون‌خطی) کمترین توصیه با صفت style مستقیماً روی یک تگ

CSS را داخل صفت style همان عنصر می‌نویسی. فقط روی همان یک عنصر اثر دارد.

HTML
<p style="color: red; font-size: 20px;">سلام</p>
💀 چرا توصیه نمی‌شود؟

قابل استفاده مجدد نیست، کد را شلوغ می‌کند و بالاترین اولویت را دارد که باعث دردسر می‌شود. فقط برای تست‌های سریع یا ایمیل HTML استفاده‌اش کن.

۲. Internal (داخلی) متوسط داخل تگ <style> در بخش head

تمام CSS را داخل یک تگ <style> در <head> می‌نویسی. روی کل همان صفحه اثر دارد.

HTML
<head>
  <style>
    p { color: red; }
  </style>
</head>

خوب برای صفحات تک و کوچک یا فایل‌های آفلاین (مثل همین دایره‌المعارف!).

۳. External (خارجی) بهترین روش ✅ فایل .css جدا و لینک با تگ <link>

CSS را در یک فایل جدا با پسوند .css می‌نویسی و با تگ <link> به HTML وصلش می‌کنی. حرفه‌ای‌ترین راه.

HTML (در head)
<link rel="stylesheet" href="styles.css">
styles.css (فایل جدا)
p { color: red; }
💡 چرا بهترین است؟

یک فایل CSS را به صدها صفحه وصل می‌کنی؛ یک‌بار تغییر بده، همه‌جا اعمال می‌شود. مرورگر هم فایل را cache می‌کند پس سایت سریع‌تر می‌شود.

روش چهارم: @import

می‌توانی داخل یک فایل CSS، فایل دیگری را وارد کنی. اما کند است و کمتر توصیه می‌شود:

CSS
@import "reset.css";
@import url("theme.css") screen;
۳

انواع سلکتور (Selectors)

چطور دقیقاً عنصری که می‌خواهی را نشانه بگیری

سلکتور قلب CSS است. تا وقتی ندانی چطور عنصر مورد نظر را «انتخاب» کنی، نمی‌توانی استایلش دهی. بیا از ساده‌ترین تا پیشرفته‌ترین را ببینیم.

Universal — * سلکتور همه عناصر صفحه را انتخاب می‌کند
CSS
* { margin: 0; box-sizing: border-box; }

معروف‌ترین کاربردش «ریست» کردن فاصله‌های پیش‌فرض همه‌ی عناصر است.

Type — نام تگ سلکتور همه عناصر از یک نوع
CSS
p { line-height: 1.6; }   /* همه پاراگراف‌ها */
a { color: blue; }       /* همه لینک‌ها */
Class — .نام سلکتور پرکاربردترین سلکتور — با نقطه

کلاس‌ها قابل استفاده مجددند: یک عنصر می‌تواند چند کلاس داشته باشد و یک کلاس روی چند عنصر.

HTML + CSS
/* CSS */
.btn { padding: 10px; }
.btn.primary { background: blue; }  /* عنصری که هر دو کلاس را دارد */

<!-- HTML -->
<button class="btn primary">دکمه</button>
ID — #نام سلکتور منحصربه‌فرد — با هشتگ

هر ID باید در صفحه یکتا باشد. اولویت بالایی دارد، پس با احتیاط استفاده کن.

CSS
#header { background: black; }
⚠️ توصیه حرفه‌ای

برای استایل‌دهی، کلاس را به ID ترجیح بده. IDها را بیشتر برای لینک داخلی (#section) و JavaScript نگه دار.

Attribute — [attr] سلکتور انتخاب بر اساس صفت‌ها
CSS
[disabled]          /* هر عنصری که صفت disabled دارد */
[type="text"]       /* مقدار دقیقاً برابر */
[href^="https"]     /* شروع‌شده با (^) */
[href$=".pdf"]      /* پایان‌یافته با ($) */
[class*="col"]      /* شامل (*) */
[lang|="en"]        /* en یا en-... (|) */
[title~="hello"]    /* یک کلمه از لیست (~) */
الگویعنی
[a=v]دقیقاً برابر
[a^=v]شروع با v
[a$=v]پایان با v
[a*=v]شامل v
[a~=v]یک کلمه‌ی کامل v
[a|=v]v یا v-…
[a=v i]بدون حساسیت به حروف (i)
۴

ترکیب‌کننده‌ها (Combinators)

رابطه‌ی بین عناصر را نشانه بگیر

گاهی می‌خواهی عنصری را فقط وقتی انتخاب کنی که داخل یا کنار عنصر دیگری باشد. اینجا ترکیب‌کننده‌ها وارد می‌شوند.

نمادنامیعنی
A BDescendant (فاصله)هر B داخل A (هر عمقی)
A > BChildفقط B که فرزند مستقیم A است
A + BAdjacent siblingاولین B که بلافاصله بعد A می‌آید
A ~ BGeneral siblingهمه B‌های بعد A (هم‌سطح)
CSS
nav a { ... }      /* هر لینک داخل nav، هر عمقی */
ul > li { ... }    /* فقط li که فرزند مستقیم ul است */
h2 + p { ... }     /* پاراگراف بلافاصله بعد از h2 */
h2 ~ p { ... }     /* همه پاراگراف‌های هم‌سطح بعد h2 */
💡 تفاوت فاصله و >

در div p هر پاراگراف داخل div انتخاب می‌شود، حتی اگر چند لایه عمیق‌تر باشد. اما در div > p فقط پاراگراف‌هایی که مستقیماً فرزند div هستند انتخاب می‌شوند.

۵

شبه‌کلاس‌ها و شبه‌عنصرها

Pseudo-classes & Pseudo-elements

این‌ها به تو اجازه می‌دهند بر اساس حالت عنصر (مثل ماوس روی آن) یا بخش‌هایی که در HTML وجود ندارند، استایل بدهی.

شبه‌کلاس (با یک دونقطه :)

حالتِ یک عنصر را نشانه می‌گیرد.

حالت‌های تعاملی شبه‌کلاس hover, focus, active, visited
CSS
a:hover { color: red; }       /* وقتی ماوس رویش است */
input:focus { border: 2px solid blue; } /* وقتی فعال است */
button:active { transform: scale(0.95); } /* لحظه کلیک */
a:visited { color: purple; }   /* لینک بازدیدشده */
input:disabled { opacity: 0.5; }
input:checked { ... }  /* چک‌باکس تیک‌خورده */
خروجی زنده — ماوس را روی دکمه ببر ↓
شبه‌کلاس‌های ساختاری شبه‌کلاس nth-child, first/last-child
CSS
li:first-child { ... }   /* اولین فرزند */
li:last-child { ... }    /* آخرین فرزند */
li:nth-child(2) { ... }  /* دومین */
li:nth-child(odd) { ... } /* فرد: ۱،۳،۵... */
li:nth-child(even) { ... }/* زوج: ۲،۴،۶... */
li:nth-child(3n) { ... } /* هر سومی */
p:only-child { ... }     /* تنها فرزند */
p:empty { ... }          /* خالی */
:not(.active) { ... }    /* همه به‌جز .active */
💡 جدول راه‌راه (zebra)

محبوب‌ترین کاربرد: tr:nth-child(even) { background: #eee; } برای رنگی کردن یک‌درمیان ردیف‌های جدول.

شبه‌عنصر (با دو دونقطه ::)

بخشی از عنصر یا محتوای ساختگی را استایل می‌دهد.

::before / ::after شبه‌عنصر محتوای ساختگی قبل/بعد عنصر

قدرتمندترین شبه‌عنصرها. یک محتوای مجازی (با پراپرتی content) قبل یا بعد محتوای واقعی اضافه می‌کنند.

CSS
.tag::before { content: "🏷️ "; }
a::after { content: " ↗"; }
/* content خالی هم برای خط و شکل کاربرد دارد */
.line::after { content: ""; display: block; height: 2px; background: red; }
⚠️ نکته کلیدی

بدون پراپرتی content (حتی اگر content: "" باشد) شبه‌عنصر اصلاً نمایش داده نمی‌شود.

شبه‌عنصرکاربرد
::first-lineاولین خط متن
::first-letterاولین حرف (drop cap)
::selectionمتن انتخاب‌شده با ماوس
::placeholderمتن راهنمای input
::markerنشانه‌ی لیست‌ها
۶

اولویت (Specificity) و Cascade

وقتی چند قانون با هم می‌جنگند، کی برنده می‌شود؟

این یکی از مهم‌ترین و گیج‌کننده‌ترین مفاهیم CSS است. وقتی دو قانون مختلف می‌خواهند رنگ یک عنصر را تعیین کنند، CSS بر اساس قوانینی تصمیم می‌گیرد کدام برنده شود.

ترتیب تصمیم‌گیری (Cascade)

  1. !important: هر اعلانی که !important داشته باشد برنده می‌شود (تا حد امکان استفاده‌اش نکن!).
  2. اولویت (Specificity): سلکتور خاص‌تر برنده می‌شود.
  3. ترتیب: اگر اولویت برابر بود، آخرین قانون نوشته‌شده برنده است.

محاسبه اولویت — سیستم سه‌رقمی

به هر سلکتور یک امتیاز سه‌بخشی می‌دهیم: (ID, Class, Type)

نوع سلکتورامتیازمثال
Inline style۱،۰،۰،۰ (بالاترین)style="..."
ID۰،۱،۰،۰#header
Class / Attribute / Pseudo-class۰،۰،۱،۰.btn / [type] / :hover
Type / Pseudo-element۰،۰،۰،۱div / ::before
Universal *۰،۰،۰،۰*
مثال محاسبه
p                /* (0,0,0,1) = 1 */
.box             /* (0,0,1,0) = 10 */
#main            /* (0,1,0,0) = 100 */
#main .box p     /* (0,1,1,1) = 111 ← برنده! */
.box.active p    /* (0,0,2,1) = 21 */
💀 از !important فرار کن

!important همه‌ی قوانین اولویت را دور می‌زند و دیباگ را جهنم می‌کند. فقط در شرایط بسیار خاص (مثل override کردن استایل کتابخانه‌ها) استفاده‌اش کن.

💡 توصیه طلایی

سلکتورهایت را ساده و کم‌اولویت نگه دار. بیشتر با کلاس کار کن. اینطوری وقتی لازم شد چیزی را override کنی، راحت‌تر است.

ارث‌بری (Inheritance)

بعضی پراپرتی‌ها به فرزندان ارث می‌رسند (مثل color، font-family) و بعضی نه (مثل border، margin). می‌توانی با مقادیر کلیدی کنترلش کنی:

مقداریعنی
inheritمقدار را از والد بگیر
initialبه مقدار پیش‌فرض اصلی برگرد
unsetاگر ارثی است inherit، وگرنه initial
revertبه استایل پیش‌فرض مرورگر برگرد
۷

باکس مدل (Box Model)

هر عنصر یک جعبه است — این مفهوم را عمیق بفهم

در CSS، هر عنصر یک جعبه‌ی مستطیلی است. این جعبه از چهار لایه ساخته شده که از داخل به بیرون عبارتند از: محتوا، padding، border، margin. درک این مدل، نصف یادگیری CSS است.

لایه‌های باکس
┌─────────── margin (فاصله بیرونی) ───────────┐
│  ┌──────── border (حاشیه) ────────────────┐  │
│  │  ┌───── padding (فاصله داخلی) ───────┐  │  │
│  │  │                                  │  │  │
│  │  │        content (محتوا)           │  │  │
│  │  │                                  │  │  │
│  │  └──────────────────────────────────┘  │  │
│  └────────────────────────────────────────┘  │
└──────────────────────────────────────────────┘
لایهتوضیح فارسی
contentخود محتوا (متن، عکس)
paddingفاصله بین محتوا و حاشیه (داخلی)
borderخط دور جعبه
marginفاصله این جعبه از جعبه‌های دیگر (بیرونی)

کنترل هر طرف جداگانه

CSS — شورت‌هند
/* ۴ مقدار: بالا راست پایین چپ (ساعتگرد) */
margin: 10px 20px 30px 40px;

/* ۲ مقدار: بالا‌وپایین | راست‌وچپ */
padding: 10px 20px;

/* ۱ مقدار: هر چهار طرف */
margin: 0;

/* جداگانه */
margin-top: 10px;
padding-inline: 20px; /* راست+چپ منطقی (RTL/LTR) */

box-sizing — مهم‌ترین تنظیم باکس

به‌صورت پیش‌فرض، width فقط عرض محتوا را تعیین می‌کند و padding و border به آن اضافه می‌شوند! این باعث محاسبات گیج‌کننده می‌شود.

CSS
/* پیش‌فرض: width = فقط محتوا */
box-sizing: content-box;
عرض کل = width + padding + border

/* بهتر: width = کل جعبه (با padding و border) */
box-sizing: border-box;
عرض کل = دقیقاً همان width

/* توصیه: روی همه عناصر اعمالش کن */
* { box-sizing: border-box; }
💡 قانون شماره یک هر پروژه

تقریباً همه‌ی توسعه‌دهنده‌ها در ابتدای CSS این را می‌نویسند: * { box-sizing: border-box; }. زندگی‌ات را راحت می‌کند چون دیگر width دقیقاً همانی است که می‌نویسی.

فروپاشی margin (Margin Collapse)

یک رفتار عجیب: وقتی margin عمودی دو عنصر کنار هم قرار می‌گیرند، با هم جمع نمی‌شوند بلکه بزرگ‌ترشان برنده می‌شود. مثلاً margin-bottom پاراگراف ۲۰px و margin-top پاراگراف بعدی ۳۰px → فاصله نهایی ۳۰px (نه ۵۰px).

۸

display و جریان عناصر

block، inline، inline-block، none و بیشتر

پراپرتی display تعیین می‌کند یک عنصر چطور در صفحه «جریان» پیدا کند و با بقیه چیدمان شود.

display: blockچیدمانکل عرض را می‌گیرد، خط جدید می‌سازد

عناصری مثل div، p، h1 پیش‌فرض block هستند. می‌توانی width، height، margin عمودی بدهی.

block ↓
بلاک ۱
بلاک ۲ (خط جدید)
display: inlineچیدمانفقط اندازه محتوا، در یک خط

عناصری مثل span، a، strong. width/height نمی‌گیرند و margin عمودی هم اثر ندارد.

inline ↓ یک دو سه (همه یک خط)
display: inline-blockچیدمانترکیب هر دو

هم در یک خط می‌ماند (مثل inline) و هم width/height/margin می‌گیرد (مثل block). عالی برای دکمه‌ها و آیتم‌های منو.

inline-block ↓ ۹۰px ۱۲۰px
مقدارکاربرد
noneعنصر کاملاً ناپدید می‌شود (جا هم نمی‌گیرد)
flexفعال‌سازی Flexbox (فصل ۱۵)
gridفعال‌سازی Grid (فصل ۱۶)
inline-flex / inline-gridنسخه inline آن‌ها
contentsخود جعبه را حذف، فرزندان را نگه می‌دارد
📌 none در برابر visibility:hidden

display:none عنصر را کاملاً حذف می‌کند (جا نمی‌گیرد). اما visibility:hidden آن را نامرئی می‌کند ولی جایش را نگه می‌دارد.

۹

Positioning — موقعیت‌دهی

عنصرها را دقیقاً هر جا که می‌خواهی بگذار

پراپرتی position همراه با top/right/bottom/left به تو کنترل دقیق موقعیت می‌دهد.

مقداررفتار
staticپیش‌فرض — جریان عادی، top/left اثر ندارد
relativeنسبت به جای خودش جابه‌جا می‌شود (جایش حفظ می‌ماند)
absoluteنسبت به نزدیک‌ترین والدِ position‌دار — از جریان خارج می‌شود
fixedنسبت به پنجره مرورگر — با اسکرول حرکت نمی‌کند
stickyترکیب relative و fixed — تا یک نقطه عادی، بعد می‌چسبد
CSS
/* الگوی پرتکرار: فرزند absolute داخل والد relative */
.card { position: relative; }
.badge {
  position: absolute;
  top: 8px; right: 8px;
}

/* هدر چسبان بالای صفحه */
header { position: sticky; top: 0; }

z-index — لایه‌بندی

وقتی عناصر روی هم می‌افتند، z-index تعیین می‌کند کدام جلوتر باشد. عدد بزرگ‌تر = جلوتر. فقط روی عناصرِ position‌دار (غیر static) اثر دارد.

CSS
.modal { position: fixed; z-index: 1000; }
.overlay { z-index: 999; }
⚠️ نکته‌ی z-index

z-index داخل «context»های جدا کار می‌کند. گاهی z-index بزرگ کار نمی‌کند چون والد یک stacking context جدا ساخته. حواست به opacity، transform و filter روی والد باشد.

۱۰

واحدها (Units)

px، em، rem، %، vw و خانواده‌ی بزرگ واحدها

وقتی می‌نویسی width: 100، CSS نمی‌فهمد ۱۰۰ چی! باید واحد بدهی. واحدها دو دسته‌اند: مطلق (ثابت) و نسبی (وابسته به چیز دیگر).

واحدهای مطلق

واحدتوضیح
pxپیکسل — رایج‌ترین، ثابت
cm, mm, inسانتی‌متر، میلی‌متر، اینچ — بیشتر برای چاپ
pt, pcpoint و pica — چاپ

واحدهای نسبی (مهم‌تر!)

واحدنسبت به چه؟
%درصدی از والد
emfont-size عنصرِ فعلی (یا والد)
remfont-size عنصر ریشه (html) — توصیه‌شده
vw / vh۱٪ عرض / ارتفاع viewport
vmin / vmax۱٪ کوچک‌ترین / بزرگ‌ترین بُعد viewport
chعرض کاراکتر «0»
frکسری از فضای آزاد (مخصوص Grid)
dvh / svh / lvhارتفاع viewport پویا/کوچک/بزرگ موبایل (نوین)
CSS
html { font-size: 16px; }
h1   { font-size: 2rem; }  /* = 32px (2×16) */
.box { width: 50%; height: 100vh; }  /* تمام ارتفاع صفحه */
💡 rem چرا بهتر از em است؟

em به والد وابسته است و در عناصر تودرتو ضرب می‌شود (می‌تواند غیرقابل‌پیش‌بینی شود). rem همیشه به ریشه برمی‌گردد، پس قابل پیش‌بینی است. برای فونت‌ها از rem استفاده کن.

🔮 واحدهای نوین موبایل

در موبایل، نوار آدرس مرورگر باز و بسته می‌شود و 100vh دردسرساز است. واحدهای جدید dvh (پویا)، svh (کوچک) و lvh (بزرگ) این مشکل را حل کرده‌اند.

۱۱

رنگ‌ها در CSS

هفت روش برای گفتن یک رنگ

CSS راه‌های مختلفی برای تعریف رنگ دارد. همه به یک رنگ ختم می‌شوند اما هرکدام مزیتی دارد.

روشمثالتوضیح
نامred, tomato۱۴۸ نام آماده
HEX#ff0000شانزده‌شانزدهی RGB
HEX + آلفا#ff000080۸ رقمی با شفافیت
RGBrgb(255 0 0)قرمز/سبز/آبی ۰-۲۵۵
RGBArgb(255 0 0 / 50%)با شفافیت
HSLhsl(0 100% 50%)رنگ/اشباع/روشنایی — انسانی‌تر
HWB / LAB / LCHoklch(...)فضاهای رنگی نوین
CSS — همه قرمزِ نیمه‌شفاف
color: red;
color: #ff0000;
color: rgb(255 0 0 / 50%);   /* سینتکس مدرن */
color: rgba(255, 0, 0, 0.5);   /* سینتکس قدیمی */
color: hsl(0 100% 50% / .5);
پالت زنده ↓
HEX
RGB
HSL
RGBA
💡 چرا HSL محبوب است؟

در HSL فقط با تغییر عدد روشنایی (L) می‌توانی سایه‌های روشن‌تر و تیره‌تر یک رنگ بسازی، بدون اینکه کل رنگ را عوض کنی. برای ساخت پالت رنگی عالی است.

🔮 oklch — آینده‌ی رنگ

فضاهای رنگی جدید مثل oklch() رنگ‌های زنده‌تر و یکنواخت‌تری نسبت به دید انسان می‌دهند و در مرورگرهای مدرن پشتیبانی می‌شوند.

currentColor و شفافیت

CSS
.icon { border: 1px solid currentColor; } /* همان رنگ متن */
.faded { opacity: 0.5; } /* شفافیت کل عنصر */
۱۲

پس‌زمینه (Background)

رنگ، تصویر، گرادیان و کنترل کامل

پس‌زمینه یکی از پرکاربردترین قابلیت‌های CSS است. می‌توانی رنگ، عکس، چند لایه و گرادیان داشته باشی.

پراپرتیکاربرد
background-colorرنگ پس‌زمینه
background-imageتصویر یا گرادیان
background-repeatتکرار: repeat / no-repeat / repeat-x
background-positionمحل تصویر: center / top right / 50% 20%
background-sizecover / contain / 100px
background-attachmentfixed (پارالاکس) / scroll
backgroundشورت‌هند همه با هم
CSS
.hero {
  background-image: url("bg.jpg");
  background-size: cover;     /* پر کردن کامل بدون اعوجاج */
  background-position: center;
  background-repeat: no-repeat;
  /* شورت‌هند معادل: */
  background: url("bg.jpg") center/cover no-repeat;
}

گرادیان‌ها (Gradients)

CSS
/* خطی */
background: linear-gradient(90deg, red, blue);
/* شعاعی (دایره‌ای) */
background: radial-gradient(circle, yellow, orange);
/* مخروطی (چرخان) */
background: conic-gradient(red, green, blue, red);
/* با نقاط توقف دقیق */
background: linear-gradient(red 0%, red 50%, blue 50%);
گرادیان‌های زنده ↓
linear
radial
conic
📌 چند پس‌زمینه

می‌توانی چند تصویر/گرادیان را با کاما روی هم بگذاری. اولی بالاترین لایه است: background: linear-gradient(...), url(bg.png);

۱۳

تایپوگرافی و متن

کنترل کامل فونت و نمایش متن
پراپرتیکاربرد
font-familyنوع فونت (با fallback)
font-sizeاندازه فونت
font-weightضخامت: 100–900 یا normal/bold
font-stylenormal / italic / oblique
line-heightارتفاع خط (فاصله خطوط)
letter-spacingفاصله حروف
word-spacingفاصله کلمات
text-alignچینش: right / center / justify
text-decorationunderline / line-through / none
text-transformuppercase / lowercase / capitalize
text-indentتورفتگی خط اول
text-shadowسایه متن
white-spacenowrap / pre / pre-wrap
text-overflowellipsis (سه‌نقطه برای متن بلند)
CSS
body {
  font-family: "Vazirmatn", Tahoma, sans-serif; /* fallback مهم! */
  font-size: 16px;
  line-height: 1.7;   /* بدون واحد = ضریب فونت */
}
/* شورت‌هند font (ترتیب مهم است) */
h1 { font: bold 2rem/1.2 Tahoma; }

فونت سفارشی با @font-face

CSS
@font-face {
  font-family: "MyFont";
  src: url("myfont.woff2") format("woff2");
  font-display: swap; /* جلوگیری از متن نامرئی */
}

متن چندخطی با سه‌نقطه

CSS
/* یک خط با سه‌نقطه */
.ellipsis {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* چند خط (مثلاً ۳ خط) */
.clamp {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
💡 line-height بدون واحد

همیشه line-height را بدون واحد بنویس (مثل 1.6) نه با px. اینطوری متناسب با اندازه فونت هر عنصر تنظیم می‌شود.

۱۴

بوردر، گوشه و سایه

border، border-radius، box-shadow و outline

border

CSS
/* شورت‌هند: ضخامت | نوع | رنگ */
border: 2px solid #22d3ee;
border-top: 1px dashed red; /* فقط بالا */
/* انواع: solid, dashed, dotted, double, groove, ridge, inset, outset */

border-radius — گوشه‌های گرد

CSS
border-radius: 12px;        /* هر چهار گوشه */
border-radius: 10px 0 10px 0; /* هر گوشه جدا */
border-radius: 50%;         /* دایره کامل! */
شکل‌های زنده ↓
12px
دایره
میکس

box-shadow — سایه جعبه

CSS
/* X | Y | تاری | گسترش | رنگ */
box-shadow: 0 4px 12px rgba(0,0,0,.2);
/* سایه داخلی */
box-shadow: inset 0 0 10px black;
/* چند سایه با کاما */
box-shadow: 0 2px 4px #0003, 0 8px 16px #0002;
سایه‌های زنده ↓
نرم
رنگی
داخلی
📌 outline در برابر border

outline شبیه border است اما جای اشغال نمی‌کند و باکس را جابه‌جا نمی‌کند. برای حالت :focus عالی است (و برای دسترسی‌پذیری حذفش نکن!).

۱۵

Flexbox — چیدمان انعطاف‌پذیر

قدرتمندترین ابزار چیدمان یک‌بعدی

Flexbox برای چیدمان عناصر در یک ردیف یا یک ستون ساخته شده. وسط‌چین کردن، توزیع فضا و ترتیب‌دهی را بی‌نهایت ساده می‌کند. کافیست به والد display: flex بدهی.

مفهوم محورها

  • محور اصلی (Main axis): جهتی که آیتم‌ها در آن می‌چینند (با flex-direction تعیین می‌شود).
  • محور متقاطع (Cross axis): عمود بر محور اصلی.

پراپرتی‌های والد (Container)

پراپرتیکاربرد
display: flexفعال‌سازی
flex-directionrow / row-reverse / column / column-reverse
flex-wrapnowrap / wrap (شکستن به خط بعد)
justify-contentچینش در محور اصلی
align-itemsچینش در محور متقاطع
align-contentچینش خطوط چندگانه
gapفاصله بین آیتم‌ها

justify-content (محور اصلی)

flex-startابتدا
centerوسط
flex-endانتها
space-betweenفاصله بین، بدون فاصله لبه
space-aroundفاصله دور هر آیتم
space-evenlyفاصله کاملاً مساوی
CSS — وسط‌چین کامل (پرکاربردترین!)
.center {
  display: flex;
  justify-content: center;  /* افقی */
  align-items: center;      /* عمودی */
  min-height: 100vh;
}
justify-content: space-between ↓
۱
۲
۳
justify-content: center + align-items: center ↓
وسط
چین

پراپرتی‌های فرزند (Items)

CSS
.item {
  flex-grow: 1;    /* چقدر فضای اضافه بگیرد */
  flex-shrink: 1;  /* چقدر کوچک شود */
  flex-basis: 200px; /* اندازه پایه */
  /* شورت‌هند: grow shrink basis */
  flex: 1 1 200px;
  align-self: flex-end; /* فقط این آیتم */
  order: 2;        /* تغییر ترتیب نمایش */
}
💡 flex: 1 جادویی

نوشتن flex: 1 روی همه‌ی آیتم‌ها باعث می‌شود فضا را به‌طور مساوی بین خودشان تقسیم کنند. ساده‌ترین راه برای ستون‌های هم‌عرض.

۱۶

CSS Grid — چیدمان دوبعدی

سطر و ستون را همزمان کنترل کن

اگر Flexbox برای یک خط است، Grid برای چیدمان دوبعدی (سطر و ستون با هم) است. قدرتمندترین سیستم چیدمان CSS برای صفحه‌بندی کامل.

تعریف شبکه

CSS
.grid {
  display: grid;
  /* ۳ ستون مساوی */
  grid-template-columns: 1fr 1fr 1fr;
  /* یا کوتاه‌تر: */
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: 100px auto;
  gap: 16px;  /* فاصله سلول‌ها */
}
repeat(3, 1fr) ↓
۱
۲
۳
۴
۵
۶

واحد fr و توابع کمکی

الگویعنی
1fr 2frستون دوم دو برابر اولی
repeat(4, 1fr)۴ ستون مساوی
minmax(100px, 1fr)حداقل ۱۰۰px، حداکثر کشسان
auto-fit / auto-fillتعداد ستون خودکار
CSS — گرید ریسپانسیو بدون media query!
.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 20px;
}
/* خودش تعداد ستون را با عرض صفحه تنظیم می‌کند! */

جای‌گذاری آیتم‌ها

CSS
.hero {
  grid-column: 1 / 3;  /* از خط ۱ تا ۳ (۲ ستون) */
  grid-row: 1 / 2;
  /* یا با span: */
  grid-column: span 2;   /* ۲ ستون اشغال کن */
}

نواحی نام‌گذاری‌شده (Template Areas)

CSS — چیدمان کامل صفحه
.page {
  display: grid;
  grid-template-areas:
    "header header"
    "sidebar main"
    "footer footer";
}
header  { grid-area: header; }
.side   { grid-area: sidebar; }
💡 Grid یا Flexbox؟

قانون ساده: برای چیدمان یک‌بُعدی (یک ردیف یا ستون مثل منو) Flexbox، برای چیدمان دوبُعدی (شبکه کامل مثل گالری یا صفحه‌بندی) Grid. اغلب با هم ترکیبشان می‌کنیم.

۱۷

طراحی ریسپانسیو

یک سایت برای همه دستگاه‌ها — موبایل تا دسکتاپ

ریسپانسیو یعنی صفحه‌ات روی هر اندازه‌ی صفحه‌نمایش (موبایل، تبلت، لپ‌تاپ، تلویزیون) خوب دیده شود. ابزار اصلی: @media queries.

گام صفر: متا viewport (در HTML)

HTML — بدون این، ریسپانسیو کار نمی‌کند!
<meta name="viewport" content="width=device-width, initial-scale=1.0">

Media Queries

CSS
/* استایل پایه برای موبایل (Mobile-first) */
.container { width: 100%; }

/* تبلت به بالا */
@media (min-width: 768px) {
  .container { width: 750px; }
}
/* دسکتاپ به بالا */
@media (min-width: 1024px) {
  .container { width: 980px; }
}
شرطیعنی
min-width: 768pxصفحه ۷۶۸px یا بزرگ‌تر
max-width: 767pxصفحه ۷۶۷px یا کوچک‌تر
orientation: landscapeافقی
prefers-color-scheme: darkکاربر تم تاریک می‌خواهد
prefers-reduced-motionکاربر انیمیشن کم می‌خواهد
hover: hoverدستگاه قابلیت hover دارد
💡 رویکرد Mobile-First

اول برای موبایل بنویس (بدون media query)، بعد با min-width برای صفحه‌های بزرگ‌تر اضافه کن. این روش سبک‌تر، سریع‌تر و حرفه‌ای‌تر است.

ابزارهای ریسپانسیو بدون media query

CSS
/* clamp: حداقل، ایده‌آل، حداکثر — فونت سیال */
font-size: clamp(1rem, 2.5vw, 2rem);

/* عکس و ویدیو کشسان */
img { max-width: 100%; height: auto; }
🔮 Container Queries — نسل بعد

به‌جای واکنش به اندازه‌ی کل صفحه، حالا می‌توانی به اندازه‌ی والدِ یک عنصر واکنش نشان دهی! با container-type و @container. آینده‌ی طراحی کامپوننت‌محور.

۱۸

Transform — تبدیل‌ها

جابه‌جایی، چرخش، مقیاس و کجی

transform به تو اجازه می‌دهد عنصر را بدون به‌هم‌ریختن چیدمان بقیه، حرکت دهی، بچرخانی، بزرگ/کوچک یا کج کنی. سریع و بهینه (با GPU).

تابعکاربرد
translate(x, y)جابه‌جایی
translateX / translateY / translateZجابه‌جایی یک محور
rotate(45deg)چرخش
scale(1.5)بزرگ‌نمایی
skew(10deg)کج کردن
matrix(...)همه با هم (سطح پایین)
perspective() / rotate3d()سه‌بعدی
CSS
.box {
  transform: translate(20px, 0) rotate(15deg) scale(1.2);
  transform-origin: center; /* نقطه مرجع تبدیل */
}
/* ترفند وسط‌چینِ مطلق: */
.centered {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
}
transform زنده ↓
rotate
scale
skew
translateY
۱۹

Transition — انتقال نرم

تغییرات را نرم و زیبا کن

وقتی یک پراپرتی تغییر می‌کند (مثلاً در hover)، transition باعث می‌شود تغییر به‌جای ناگهانی، نرم و تدریجی باشد. مهم‌ترین ابزار تعامل بصری.

CSS
.btn {
  background: blue;
  /* پراپرتی | مدت | تابع زمان | تأخیر */
  transition: background 0.3s ease 0s;
}
.btn:hover { background: red; }

/* چند پراپرتی با کاما */
transition: color .2s, transform .3s;
/* همه پراپرتی‌ها */
transition: all .3s ease;

توابع زمان‌بندی (Timing Functions)

easeپیش‌فرض — شروع و پایان نرم
linearسرعت ثابت
ease-inشروع کند
ease-outپایان کند
ease-in-outهر دو نرم
cubic-bezier(...)منحنی سفارشی
steps(n)پله‌ای (برای انیمیشن فریم‌به‌فریم)
transition زنده — hover کن ↓
⚠️ نکته عملکرد

برای انیمیشن نرم و بدون لگ، فقط transform و opacity را انیمیت کن. انیمیت کردن width، height یا margin باعث محاسبه دوباره چیدمان (reflow) و کندی می‌شود.

۲۰

Animation — انیمیشن با @keyframes

حرکت‌های پیچیده و تکرارشونده بدون JavaScript

اگر transition فقط بین دو حالت است، animation به تو اجازه می‌دهد چند مرحله تعریف کنی و حرکت‌های پیچیده، تکرارشونده و خودکار بسازی.

دو قدم: تعریف + اعمال

CSS
/* قدم ۱: تعریف مراحل */
@keyframes bounce {
  0%   { transform: translateY(0); }
  50%  { transform: translateY(-30px); }
  100% { transform: translateY(0); }
}

/* قدم ۲: اعمال به عنصر */
.ball {
  /* نام | مدت | تابع | تأخیر | تکرار | جهت */
  animation: bounce 1s ease-in-out 0s infinite;
}
زیرپراپرتیکاربرد
animation-nameنام @keyframes
animation-durationمدت یک دور
animation-iteration-countتعداد تکرار (یا infinite)
animation-directionnormal / reverse / alternate
animation-delayتأخیر شروع
animation-fill-modeforwards / backwards (حالت قبل/بعد)
animation-play-staterunning / paused
انیمیشن زنده ↓
bounce
spin
pulse
💡 from / to

اگر فقط دو مرحله داری، به‌جای 0% و 100% می‌توانی از کلیدواژه‌های from و to استفاده کنی.

۲۱

فیلتر و افکت‌های بصری

filter، backdrop-filter، blend modes و clip-path

filter — افکت روی عنصر

CSS
filter: blur(5px);            /* تاری */
filter: brightness(1.5);      /* روشنایی */
filter: grayscale(100%);     /* سیاه‌وسفید */
filter: drop-shadow(0 4px 8px black);
/* چند فیلتر با هم: */
filter: contrast(1.2) saturate(1.5) hue-rotate(90deg);
فیلترهای زنده ↓
blur
grayscale
bright
hue

backdrop-filter — افکت روی پشتِ عنصر (Glassmorphism)

پشتِ یک عنصر شفاف را تار می‌کند — همان افکت «شیشه‌ای» محبوب که در همین صفحه هم استفاده شده!

CSS
.glass {
  background: rgba(255,255,255,.1);
  backdrop-filter: blur(12px);
}

clip-path — برش شکل

CSS
clip-path: circle(50%);
clip-path: polygon(50% 0, 100% 100%, 0 100%); /* مثلث */
clip-path زنده ↓
📌 mix-blend-mode

پراپرتی mix-blend-mode (مثل multiply، screen، overlay) نحوه‌ی ترکیب رنگ عنصر با لایه‌های زیرش را تعیین می‌کند — درست مثل لایه‌ها در فتوشاپ.

۲۲

متغیرهای CSS (Custom Properties)

مقادیر را یک‌بار تعریف کن، همه‌جا استفاده کن

متغیرهای CSS (که رسماً Custom Properties نام دارند) به تو اجازه می‌دهند یک مقدار را در یک‌جا ذخیره کنی و در کل صفحه ازش استفاده کنی. تغییر در یک نقطه = تغییر همه‌جا. ستون فقرات سیستم‌های طراحی و تم‌سازی.

تعریف و استفاده

CSS
/* تعریف (معمولاً در :root برای دسترسی سراسری) */
:root {
  --main-color: #22d3ee;
  --spacing: 16px;
  --radius: 12px;
}

/* استفاده با تابع var() */
.btn {
  background: var(--main-color);
  padding: var(--spacing);
  border-radius: var(--radius);
}
📌 :root چیست؟

:root همان عنصر <html> است اما با اولویت بالاتر. متغیرهای تعریف‌شده در آن، در کل سند قابل دسترسند.

مقدار پیش‌فرض و ارث‌بری

CSS
/* اگر متغیر تعریف نشده باشد، مقدار دوم استفاده می‌شود */
color: var(--text-color, black);

/* متغیرها ارث می‌رسند — می‌توانی محلی بازنویسی کنی */
.card { --main-color: tomato; }
/* حالا داخل .card رنگ tomato است */

تغییر تم با یک خط (همان دکمه‌ی این صفحه!)

CSS
:root { --bg: #0a0e1a; --text: white; }
html[data-theme="light"] { --bg: white; --text: black; }
body { background: var(--bg); color: var(--text); }
/* فقط با JS صفت data-theme را عوض کن — کل تم تغییر می‌کند! */
💡 تفاوت با متغیرهای Sass

متغیرهای CSS زنده هستند: در مرورگر و با JavaScript قابل تغییرند. اما متغیرهای Sass/Less هنگام کامپایل ثابت می‌شوند. این مزیت بزرگ CSS Variables است.

۲۳

توابع کاربردی CSS

calc، clamp، min، max و دوستان

CSS توابعی دارد که محاسبات ریاضی و تصمیم‌گیری پویا را ممکن می‌کنند — قدرتی که قبلاً فقط با JavaScript ممکن بود.

calc()تابعمحاسبات ریاضی، حتی با واحدهای مختلف
CSS
width: calc(100% - 40px);  /* ترکیب درصد و پیکسل! */
height: calc(100vh - 60px);
font-size: calc(1rem + 1vw);
⚠️ فاصله مهم است

دور علامت‌های + و - حتماً فاصله بگذار: calc(100% - 10px) درست، اما calc(100%-10px) غلط است!

min() / max()تابعکوچک‌ترین/بزرگ‌ترین مقدار را انتخاب کن
CSS
width: min(90%, 1200px); /* هرکدام کوچک‌تر بود */
padding: max(20px, 5%); /* هرگز کمتر از 20px */
clamp()تابعقهرمان طراحی سیال (Fluid)

سه مقدار می‌گیرد: حداقل، ایده‌آل، حداکثر. مقدار بین دو حد، سیال تغییر می‌کند. عالی برای فونت ریسپانسیو بدون media query.

CSS
/* clamp(حداقل, ایده‌آل, حداکثر) */
font-size: clamp(1rem, 2vw + 1rem, 3rem);
width: clamp(300px, 80%, 1200px);
تابعکاربرد
var()خواندن متغیر CSS
url()آدرس تصویر/فونت/فایل
attr()خواندن مقدار صفت HTML
rgb()/hsl()/oklch()توابع رنگ
linear-gradient()گرادیان
translate()/rotate()/scale()تبدیل‌ها
repeat()/minmax()توابع Grid
env()متغیرهای محیطی (notch موبایل)
۲۴

ویژگی‌های نوین و آینده CSS

جدیدترین قابلیت‌هایی که CSS را متحول کرده‌اند

CSS مدرن دیگر زبان ساده‌ی استایل نیست؛ قابلیت‌هایی دارد که قبلاً به JavaScript نیاز داشتند. این‌ها جدیدترین‌ها هستند.

:has() — والد سلکتورنوینانتخاب والد بر اساس فرزند!

سال‌ها آرزوی توسعه‌دهندگان بود: انتخاب یک عنصر بر اساس آنچه داخلش است.

CSS
/* کارتی که داخلش عکس دارد */
.card:has(img) { padding: 0; }
/* فرمی که input نامعتبر دارد */
form:has(:invalid) { border: 2px solid red; }
@container — کوئری کانتینرنوینواکنش به اندازه والد، نه کل صفحه
CSS
.sidebar { container-type: inline-size; }
@container (min-width: 400px) {
  .card { display: flex; }
}
aspect-ratioنویننسبت ابعاد ثابت
CSS
.video { aspect-ratio: 16 / 9; } /* همیشه نسبت 16:9 */
.square { aspect-ratio: 1; }      /* مربع کامل */
ویژگیکاربرد
gap (در flex)فاصله آیتم‌های flex (بدون margin)
insetشورت‌هند top/right/bottom/left
scroll-snapاسکرول چفت‌شونده (اسلایدر)
accent-colorرنگ چک‌باکس/رادیو
:is() / :where()گروه‌بندی سلکتورها
@layerمدیریت لایه‌های اولویت (Cascade Layers)
subgridبه ارث بردن گرید والد
color-mix()ترکیب دو رنگ
@propertyتعریف نوع‌دار متغیر (انیمیشن متغیر)
view-transitionانتقال نرم بین صفحات
🔮 آینده هیجان‌انگیز است

CSS هر روز قدرتمندتر می‌شود. ویژگی‌هایی مثل تو‌درتویی بومی (Nesting)، توابع رنگ پیشرفته و انیمیشن‌های اسکرول‌محور (scroll-driven) در حال فراگیر شدن‌اند. همیشه MDN و Can I Use را چک کن.

📚

مرجع سریع و تقلب‌نامه

پرکاربردترین پراپرتی‌ها در یک نگاه

الگوهای پرتکرار (Snippets طلایی)

CSS — ریست استاندارد
*, *::before, *::after {
  margin: 0; padding: 0; box-sizing: border-box;
}
CSS — وسط‌چین کامل
.center {
  display: grid;
  place-items: center; /* کوتاه‌ترین راه وسط‌چینی! */
}
CSS — کانتینر مرکزی ریسپانسیو
.container {
  width: min(90%, 1200px);
  margin-inline: auto;
}

جدول جامع پراپرتی‌ها

دستهپراپرتی‌های کلیدی
متنcolor, font, line-height, text-align, text-decoration
جعبهwidth, height, padding, margin, border, box-sizing
پس‌زمینهbackground, background-image, background-size
چیدمانdisplay, position, float, flex, grid, gap
flexjustify-content, align-items, flex-direction, flex
gridgrid-template-columns, grid-area, repeat, minmax
افکتopacity, box-shadow, filter, backdrop-filter, transform
حرکتtransition, animation, @keyframes
بصریoverflow, visibility, z-index, cursor, clip-path

مسیر یادگیری پیشنهادی

  1. پایه: سینتکس → سلکتورها → باکس مدل → رنگ و متن
  2. چیدمان: display → position → Flexbox → Grid
  3. ریسپانسیو: واحدها → media queries → clamp و توابع
  4. تعامل: transition → transform → animation
  5. حرفه‌ای: متغیرها → ویژگی‌های نوین (:has, @container)
  6. قدم بعد: یک کتابخانه (مثل Tailwind) یا پیش‌پردازنده (Sass)
💡 مهم‌ترین توصیه پایانی

CSS با تمرین یاد گرفته می‌شود، نه فقط خواندن. هر مفهومی را که اینجا دیدی، در یک فایل واقعی امتحان کن. ابزار CodePen برای تمرین سریع عالی است. اشتباه کن، خراب کن، دوباره بساز — این بهترین معلم است.

📌 منابع رسمی برای ادامه
  • MDN Web Docs — مرجع کامل و رسمی هر پراپرتی
  • Can I Use — پشتیبانی مرورگرها
  • CSS-Tricks — راهنماها و ترفندها