دنیای کامل CSS
از صفر تا صد
ادامهی رسمی دایرهالمعارف HTML — اینبار با تمرکز کامل روی CSS. هر مفهوم، هر ویژگی و هر تکنیک با مثال، خروجی زنده و توضیح قدمبهقدم برای کسی که هیچ آشناییای با این دنیا ندارد.
نوشتهشده توسط صدرا حاتمی | Sadra Hatami
CSS چیست و چرا وجود دارد؟
از لباس صفحه تا کنترل کامل ظاهراگر HTML را یاد گرفته باشی، میدانی که HTML اسکلت و محتوای صفحه را میسازد: عنوان، پاراگراف، عکس، دکمه و... . اما HTML بهتنهایی خیلی زشت است — یک متن سیاهوسفید ساده روی پسزمینه سفید. اینجاست که CSS وارد میشود.
CSS مخفف Cascading Style Sheets (برگههای سبک آبشاری) است. وظیفهاش این است که به مرورگر بگوید عناصر HTML چطور دیده شوند: چه رنگی، چه اندازهای، کجای صفحه، با چه فاصلهای، با چه انیمیشنی و... .
اگر یک صفحهی وب را به یک انسان تشبیه کنیم: HTML اسکلت و اندامهاست، CSS لباس، آرایش و ظاهر است، و JavaScript رفتار و حرکت است. هر سه با هم یک سایت کامل میسازند.
کلمهی «Cascading» یعنی چه؟
یعنی «آبشاری». چند فایل و قانون مختلف میتوانند روی یک عنصر تأثیر بگذارند و این قوانین مثل آبشار روی هم میریزند. 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)
┌── سلکتور (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 وجود دارد. هر کدام جا و کاربرد خودش را دارد.
CSS را داخل صفت style همان عنصر مینویسی. فقط روی همان یک عنصر اثر دارد.
<p style="color: red; font-size: 20px;">سلام</p>قابل استفاده مجدد نیست، کد را شلوغ میکند و بالاترین اولویت را دارد که باعث دردسر میشود. فقط برای تستهای سریع یا ایمیل HTML استفادهاش کن.
تمام CSS را داخل یک تگ <style> در <head> مینویسی. روی کل همان صفحه اثر دارد.
<head>
<style>
p { color: red; }
</style>
</head>خوب برای صفحات تک و کوچک یا فایلهای آفلاین (مثل همین دایرهالمعارف!).
CSS را در یک فایل جدا با پسوند .css مینویسی و با تگ <link> به HTML وصلش میکنی. حرفهایترین راه.
<link rel="stylesheet" href="styles.css">p { color: red; }یک فایل CSS را به صدها صفحه وصل میکنی؛ یکبار تغییر بده، همهجا اعمال میشود. مرورگر هم فایل را cache میکند پس سایت سریعتر میشود.
روش چهارم: @import
میتوانی داخل یک فایل CSS، فایل دیگری را وارد کنی. اما کند است و کمتر توصیه میشود:
@import "reset.css";
@import url("theme.css") screen;انواع سلکتور (Selectors)
چطور دقیقاً عنصری که میخواهی را نشانه بگیریسلکتور قلب CSS است. تا وقتی ندانی چطور عنصر مورد نظر را «انتخاب» کنی، نمیتوانی استایلش دهی. بیا از سادهترین تا پیشرفتهترین را ببینیم.
* { margin: 0; box-sizing: border-box; }معروفترین کاربردش «ریست» کردن فاصلههای پیشفرض همهی عناصر است.
p { line-height: 1.6; } /* همه پاراگرافها */
a { color: blue; } /* همه لینکها */کلاسها قابل استفاده مجددند: یک عنصر میتواند چند کلاس داشته باشد و یک کلاس روی چند عنصر.
/* CSS */
.btn { padding: 10px; }
.btn.primary { background: blue; } /* عنصری که هر دو کلاس را دارد */
<!-- HTML -->
<button class="btn primary">دکمه</button>هر ID باید در صفحه یکتا باشد. اولویت بالایی دارد، پس با احتیاط استفاده کن.
#header { background: black; }برای استایلدهی، کلاس را به ID ترجیح بده. IDها را بیشتر برای لینک داخلی (#section) و JavaScript نگه دار.
[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 B | Descendant (فاصله) | هر B داخل A (هر عمقی) |
| A > B | Child | فقط B که فرزند مستقیم A است |
| A + B | Adjacent sibling | اولین B که بلافاصله بعد A میآید |
| A ~ B | General sibling | همه Bهای بعد A (همسطح) |
nav a { ... } /* هر لینک داخل nav، هر عمقی */
ul > li { ... } /* فقط li که فرزند مستقیم ul است */
h2 + p { ... } /* پاراگراف بلافاصله بعد از h2 */
h2 ~ p { ... } /* همه پاراگرافهای همسطح بعد h2 */در div p هر پاراگراف داخل div انتخاب میشود، حتی اگر چند لایه عمیقتر باشد. اما در div > p فقط پاراگرافهایی که مستقیماً فرزند div هستند انتخاب میشوند.
شبهکلاسها و شبهعنصرها
Pseudo-classes & Pseudo-elementsاینها به تو اجازه میدهند بر اساس حالت عنصر (مثل ماوس روی آن) یا بخشهایی که در HTML وجود ندارند، استایل بدهی.
شبهکلاس (با یک دونقطه :)
حالتِ یک عنصر را نشانه میگیرد.
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 { ... } /* چکباکس تیکخورده */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 */محبوبترین کاربرد: tr:nth-child(even) { background: #eee; } برای رنگی کردن یکدرمیان ردیفهای جدول.
شبهعنصر (با دو دونقطه ::)
بخشی از عنصر یا محتوای ساختگی را استایل میدهد.
قدرتمندترین شبهعنصرها. یک محتوای مجازی (با پراپرتی content) قبل یا بعد محتوای واقعی اضافه میکنند.
.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)
- !important: هر اعلانی که !important داشته باشد برنده میشود (تا حد امکان استفادهاش نکن!).
- اولویت (Specificity): سلکتور خاصتر برنده میشود.
- ترتیب: اگر اولویت برابر بود، آخرین قانون نوشتهشده برنده است.
محاسبه اولویت — سیستم سهرقمی
به هر سلکتور یک امتیاز سهبخشی میدهیم: (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 همهی قوانین اولویت را دور میزند و دیباگ را جهنم میکند. فقط در شرایط بسیار خاص (مثل 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 | فاصله این جعبه از جعبههای دیگر (بیرونی) |
کنترل هر طرف جداگانه
/* ۴ مقدار: بالا راست پایین چپ (ساعتگرد) */
margin: 10px 20px 30px 40px;
/* ۲ مقدار: بالاوپایین | راستوچپ */
padding: 10px 20px;
/* ۱ مقدار: هر چهار طرف */
margin: 0;
/* جداگانه */
margin-top: 10px;
padding-inline: 20px; /* راست+چپ منطقی (RTL/LTR) */box-sizing — مهمترین تنظیم باکس
بهصورت پیشفرض، width فقط عرض محتوا را تعیین میکند و padding و border به آن اضافه میشوند! این باعث محاسبات گیجکننده میشود.
/* پیشفرض: 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 تعیین میکند یک عنصر چطور در صفحه «جریان» پیدا کند و با بقیه چیدمان شود.
عناصری مثل div، p، h1 پیشفرض block هستند. میتوانی width، height، margin عمودی بدهی.
عناصری مثل span، a، strong. width/height نمیگیرند و margin عمودی هم اثر ندارد.
هم در یک خط میماند (مثل inline) و هم width/height/margin میگیرد (مثل block). عالی برای دکمهها و آیتمهای منو.
| مقدار | کاربرد |
|---|---|
| none | عنصر کاملاً ناپدید میشود (جا هم نمیگیرد) |
| flex | فعالسازی Flexbox (فصل ۱۵) |
| grid | فعالسازی Grid (فصل ۱۶) |
| inline-flex / inline-grid | نسخه inline آنها |
| contents | خود جعبه را حذف، فرزندان را نگه میدارد |
display:none عنصر را کاملاً حذف میکند (جا نمیگیرد). اما visibility:hidden آن را نامرئی میکند ولی جایش را نگه میدارد.
Positioning — موقعیتدهی
عنصرها را دقیقاً هر جا که میخواهی بگذارپراپرتی position همراه با top/right/bottom/left به تو کنترل دقیق موقعیت میدهد.
| مقدار | رفتار |
|---|---|
| static | پیشفرض — جریان عادی، top/left اثر ندارد |
| relative | نسبت به جای خودش جابهجا میشود (جایش حفظ میماند) |
| absolute | نسبت به نزدیکترین والدِ positionدار — از جریان خارج میشود |
| fixed | نسبت به پنجره مرورگر — با اسکرول حرکت نمیکند |
| sticky | ترکیب relative و fixed — تا یک نقطه عادی، بعد میچسبد |
/* الگوی پرتکرار: فرزند absolute داخل والد relative */
.card { position: relative; }
.badge {
position: absolute;
top: 8px; right: 8px;
}
/* هدر چسبان بالای صفحه */
header { position: sticky; top: 0; }z-index — لایهبندی
وقتی عناصر روی هم میافتند، z-index تعیین میکند کدام جلوتر باشد. عدد بزرگتر = جلوتر. فقط روی عناصرِ positionدار (غیر static) اثر دارد.
.modal { position: fixed; z-index: 1000; }
.overlay { z-index: 999; }z-index داخل «context»های جدا کار میکند. گاهی z-index بزرگ کار نمیکند چون والد یک stacking context جدا ساخته. حواست به opacity، transform و filter روی والد باشد.
واحدها (Units)
px، em، rem، %، vw و خانوادهی بزرگ واحدهاوقتی مینویسی width: 100، CSS نمیفهمد ۱۰۰ چی! باید واحد بدهی. واحدها دو دستهاند: مطلق (ثابت) و نسبی (وابسته به چیز دیگر).
واحدهای مطلق
| واحد | توضیح |
|---|---|
| px | پیکسل — رایجترین، ثابت |
| cm, mm, in | سانتیمتر، میلیمتر، اینچ — بیشتر برای چاپ |
| pt, pc | point و pica — چاپ |
واحدهای نسبی (مهمتر!)
| واحد | نسبت به چه؟ |
|---|---|
| % | درصدی از والد |
| em | font-size عنصرِ فعلی (یا والد) |
| rem | font-size عنصر ریشه (html) — توصیهشده |
| vw / vh | ۱٪ عرض / ارتفاع viewport |
| vmin / vmax | ۱٪ کوچکترین / بزرگترین بُعد viewport |
| ch | عرض کاراکتر «0» |
| fr | کسری از فضای آزاد (مخصوص Grid) |
| dvh / svh / lvh | ارتفاع viewport پویا/کوچک/بزرگ موبایل (نوین) |
html { font-size: 16px; }
h1 { font-size: 2rem; } /* = 32px (2×16) */
.box { width: 50%; height: 100vh; } /* تمام ارتفاع صفحه */em به والد وابسته است و در عناصر تودرتو ضرب میشود (میتواند غیرقابلپیشبینی شود). rem همیشه به ریشه برمیگردد، پس قابل پیشبینی است. برای فونتها از rem استفاده کن.
در موبایل، نوار آدرس مرورگر باز و بسته میشود و 100vh دردسرساز است. واحدهای جدید dvh (پویا)، svh (کوچک) و lvh (بزرگ) این مشکل را حل کردهاند.
رنگها در CSS
هفت روش برای گفتن یک رنگCSS راههای مختلفی برای تعریف رنگ دارد. همه به یک رنگ ختم میشوند اما هرکدام مزیتی دارد.
| روش | مثال | توضیح |
|---|---|---|
| نام | red, tomato | ۱۴۸ نام آماده |
| HEX | #ff0000 | شانزدهشانزدهی RGB |
| HEX + آلفا | #ff000080 | ۸ رقمی با شفافیت |
| RGB | rgb(255 0 0) | قرمز/سبز/آبی ۰-۲۵۵ |
| RGBA | rgb(255 0 0 / 50%) | با شفافیت |
| HSL | hsl(0 100% 50%) | رنگ/اشباع/روشنایی — انسانیتر |
| HWB / LAB / LCH | oklch(...) | فضاهای رنگی نوین |
color: red;
color: #ff0000;
color: rgb(255 0 0 / 50%); /* سینتکس مدرن */
color: rgba(255, 0, 0, 0.5); /* سینتکس قدیمی */
color: hsl(0 100% 50% / .5);در HSL فقط با تغییر عدد روشنایی (L) میتوانی سایههای روشنتر و تیرهتر یک رنگ بسازی، بدون اینکه کل رنگ را عوض کنی. برای ساخت پالت رنگی عالی است.
فضاهای رنگی جدید مثل oklch() رنگهای زندهتر و یکنواختتری نسبت به دید انسان میدهند و در مرورگرهای مدرن پشتیبانی میشوند.
currentColor و شفافیت
.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-size | cover / contain / 100px |
| background-attachment | fixed (پارالاکس) / scroll |
| background | شورتهند همه با هم |
.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)
/* خطی */
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%);میتوانی چند تصویر/گرادیان را با کاما روی هم بگذاری. اولی بالاترین لایه است: background: linear-gradient(...), url(bg.png);
تایپوگرافی و متن
کنترل کامل فونت و نمایش متن| پراپرتی | کاربرد |
|---|---|
| font-family | نوع فونت (با fallback) |
| font-size | اندازه فونت |
| font-weight | ضخامت: 100–900 یا normal/bold |
| font-style | normal / italic / oblique |
| line-height | ارتفاع خط (فاصله خطوط) |
| letter-spacing | فاصله حروف |
| word-spacing | فاصله کلمات |
| text-align | چینش: right / center / justify |
| text-decoration | underline / line-through / none |
| text-transform | uppercase / lowercase / capitalize |
| text-indent | تورفتگی خط اول |
| text-shadow | سایه متن |
| white-space | nowrap / pre / pre-wrap |
| text-overflow | ellipsis (سهنقطه برای متن بلند) |
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
@font-face {
font-family: "MyFont";
src: url("myfont.woff2") format("woff2");
font-display: swap; /* جلوگیری از متن نامرئی */
}متن چندخطی با سهنقطه
/* یک خط با سهنقطه */
.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 را بدون واحد بنویس (مثل 1.6) نه با px. اینطوری متناسب با اندازه فونت هر عنصر تنظیم میشود.
بوردر، گوشه و سایه
border، border-radius، box-shadow و outlineborder
/* شورتهند: ضخامت | نوع | رنگ */
border: 2px solid #22d3ee;
border-top: 1px dashed red; /* فقط بالا */
/* انواع: solid, dashed, dotted, double, groove, ridge, inset, outset */border-radius — گوشههای گرد
border-radius: 12px; /* هر چهار گوشه */
border-radius: 10px 0 10px 0; /* هر گوشه جدا */
border-radius: 50%; /* دایره کامل! */box-shadow — سایه جعبه
/* 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 است اما جای اشغال نمیکند و باکس را جابهجا نمیکند. برای حالت :focus عالی است (و برای دسترسیپذیری حذفش نکن!).
Flexbox — چیدمان انعطافپذیر
قدرتمندترین ابزار چیدمان یکبعدیFlexbox برای چیدمان عناصر در یک ردیف یا یک ستون ساخته شده. وسطچین کردن، توزیع فضا و ترتیبدهی را بینهایت ساده میکند. کافیست به والد display: flex بدهی.
مفهوم محورها
- محور اصلی (Main axis): جهتی که آیتمها در آن میچینند (با flex-direction تعیین میشود).
- محور متقاطع (Cross axis): عمود بر محور اصلی.
پراپرتیهای والد (Container)
| پراپرتی | کاربرد |
|---|---|
| display: flex | فعالسازی |
| flex-direction | row / row-reverse / column / column-reverse |
| flex-wrap | nowrap / wrap (شکستن به خط بعد) |
| justify-content | چینش در محور اصلی |
| align-items | چینش در محور متقاطع |
| align-content | چینش خطوط چندگانه |
| gap | فاصله بین آیتمها |
justify-content (محور اصلی)
| flex-start | ابتدا |
| center | وسط |
| flex-end | انتها |
| space-between | فاصله بین، بدون فاصله لبه |
| space-around | فاصله دور هر آیتم |
| space-evenly | فاصله کاملاً مساوی |
.center {
display: flex;
justify-content: center; /* افقی */
align-items: center; /* عمودی */
min-height: 100vh;
}پراپرتیهای فرزند (Items)
.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 روی همهی آیتمها باعث میشود فضا را بهطور مساوی بین خودشان تقسیم کنند. سادهترین راه برای ستونهای همعرض.
CSS Grid — چیدمان دوبعدی
سطر و ستون را همزمان کنترل کناگر Flexbox برای یک خط است، Grid برای چیدمان دوبعدی (سطر و ستون با هم) است. قدرتمندترین سیستم چیدمان CSS برای صفحهبندی کامل.
تعریف شبکه
.grid {
display: grid;
/* ۳ ستون مساوی */
grid-template-columns: 1fr 1fr 1fr;
/* یا کوتاهتر: */
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 100px auto;
gap: 16px; /* فاصله سلولها */
}واحد fr و توابع کمکی
| الگو | یعنی |
|---|---|
| 1fr 2fr | ستون دوم دو برابر اولی |
| repeat(4, 1fr) | ۴ ستون مساوی |
| minmax(100px, 1fr) | حداقل ۱۰۰px، حداکثر کشسان |
| auto-fit / auto-fill | تعداد ستون خودکار |
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
}
/* خودش تعداد ستون را با عرض صفحه تنظیم میکند! */جایگذاری آیتمها
.hero {
grid-column: 1 / 3; /* از خط ۱ تا ۳ (۲ ستون) */
grid-row: 1 / 2;
/* یا با span: */
grid-column: span 2; /* ۲ ستون اشغال کن */
}نواحی نامگذاریشده (Template Areas)
.page {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
}
header { grid-area: header; }
.side { grid-area: sidebar; }قانون ساده: برای چیدمان یکبُعدی (یک ردیف یا ستون مثل منو) Flexbox، برای چیدمان دوبُعدی (شبکه کامل مثل گالری یا صفحهبندی) Grid. اغلب با هم ترکیبشان میکنیم.
طراحی ریسپانسیو
یک سایت برای همه دستگاهها — موبایل تا دسکتاپریسپانسیو یعنی صفحهات روی هر اندازهی صفحهنمایش (موبایل، تبلت، لپتاپ، تلویزیون) خوب دیده شود. ابزار اصلی: @media queries.
گام صفر: متا viewport (در HTML)
<meta name="viewport" content="width=device-width, initial-scale=1.0">Media Queries
/* استایل پایه برای موبایل (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 دارد |
اول برای موبایل بنویس (بدون media query)، بعد با min-width برای صفحههای بزرگتر اضافه کن. این روش سبکتر، سریعتر و حرفهایتر است.
ابزارهای ریسپانسیو بدون media query
/* clamp: حداقل، ایدهآل، حداکثر — فونت سیال */
font-size: clamp(1rem, 2.5vw, 2rem);
/* عکس و ویدیو کشسان */
img { max-width: 100%; height: auto; }بهجای واکنش به اندازهی کل صفحه، حالا میتوانی به اندازهی والدِ یک عنصر واکنش نشان دهی! با container-type و @container. آیندهی طراحی کامپوننتمحور.
Transform — تبدیلها
جابهجایی، چرخش، مقیاس و کجیtransform به تو اجازه میدهد عنصر را بدون بههمریختن چیدمان بقیه، حرکت دهی، بچرخانی، بزرگ/کوچک یا کج کنی. سریع و بهینه (با GPU).
| تابع | کاربرد |
|---|---|
| translate(x, y) | جابهجایی |
| translateX / translateY / translateZ | جابهجایی یک محور |
| rotate(45deg) | چرخش |
| scale(1.5) | بزرگنمایی |
| skew(10deg) | کج کردن |
| matrix(...) | همه با هم (سطح پایین) |
| perspective() / rotate3d() | سهبعدی |
.box {
transform: translate(20px, 0) rotate(15deg) scale(1.2);
transform-origin: center; /* نقطه مرجع تبدیل */
}
/* ترفند وسطچینِ مطلق: */
.centered {
position: absolute;
top: 50%; left: 50%;
transform: translate(-50%, -50%);
}Transition — انتقال نرم
تغییرات را نرم و زیبا کنوقتی یک پراپرتی تغییر میکند (مثلاً در hover)، transition باعث میشود تغییر بهجای ناگهانی، نرم و تدریجی باشد. مهمترین ابزار تعامل بصری.
.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) | پلهای (برای انیمیشن فریمبهفریم) |
برای انیمیشن نرم و بدون لگ، فقط transform و opacity را انیمیت کن. انیمیت کردن width، height یا margin باعث محاسبه دوباره چیدمان (reflow) و کندی میشود.
Animation — انیمیشن با @keyframes
حرکتهای پیچیده و تکرارشونده بدون JavaScriptاگر transition فقط بین دو حالت است، animation به تو اجازه میدهد چند مرحله تعریف کنی و حرکتهای پیچیده، تکرارشونده و خودکار بسازی.
دو قدم: تعریف + اعمال
/* قدم ۱: تعریف مراحل */
@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-direction | normal / reverse / alternate |
| animation-delay | تأخیر شروع |
| animation-fill-mode | forwards / backwards (حالت قبل/بعد) |
| animation-play-state | running / paused |
اگر فقط دو مرحله داری، بهجای 0% و 100% میتوانی از کلیدواژههای from و to استفاده کنی.
فیلتر و افکتهای بصری
filter، backdrop-filter، blend modes و clip-pathfilter — افکت روی عنصر
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);backdrop-filter — افکت روی پشتِ عنصر (Glassmorphism)
پشتِ یک عنصر شفاف را تار میکند — همان افکت «شیشهای» محبوب که در همین صفحه هم استفاده شده!
.glass {
background: rgba(255,255,255,.1);
backdrop-filter: blur(12px);
}clip-path — برش شکل
clip-path: circle(50%);
clip-path: polygon(50% 0, 100% 100%, 0 100%); /* مثلث */پراپرتی mix-blend-mode (مثل multiply، screen، overlay) نحوهی ترکیب رنگ عنصر با لایههای زیرش را تعیین میکند — درست مثل لایهها در فتوشاپ.
متغیرهای CSS (Custom Properties)
مقادیر را یکبار تعریف کن، همهجا استفاده کنمتغیرهای CSS (که رسماً Custom Properties نام دارند) به تو اجازه میدهند یک مقدار را در یکجا ذخیره کنی و در کل صفحه ازش استفاده کنی. تغییر در یک نقطه = تغییر همهجا. ستون فقرات سیستمهای طراحی و تمسازی.
تعریف و استفاده
/* تعریف (معمولاً در :root برای دسترسی سراسری) */
:root {
--main-color: #22d3ee;
--spacing: 16px;
--radius: 12px;
}
/* استفاده با تابع var() */
.btn {
background: var(--main-color);
padding: var(--spacing);
border-radius: var(--radius);
}:root همان عنصر <html> است اما با اولویت بالاتر. متغیرهای تعریفشده در آن، در کل سند قابل دسترسند.
مقدار پیشفرض و ارثبری
/* اگر متغیر تعریف نشده باشد، مقدار دوم استفاده میشود */
color: var(--text-color, black);
/* متغیرها ارث میرسند — میتوانی محلی بازنویسی کنی */
.card { --main-color: tomato; }
/* حالا داخل .card رنگ tomato است */تغییر تم با یک خط (همان دکمهی این صفحه!)
:root { --bg: #0a0e1a; --text: white; }
html[data-theme="light"] { --bg: white; --text: black; }
body { background: var(--bg); color: var(--text); }
/* فقط با JS صفت data-theme را عوض کن — کل تم تغییر میکند! */متغیرهای CSS زنده هستند: در مرورگر و با JavaScript قابل تغییرند. اما متغیرهای Sass/Less هنگام کامپایل ثابت میشوند. این مزیت بزرگ CSS Variables است.
توابع کاربردی CSS
calc، clamp، min، max و دوستانCSS توابعی دارد که محاسبات ریاضی و تصمیمگیری پویا را ممکن میکنند — قدرتی که قبلاً فقط با JavaScript ممکن بود.
width: calc(100% - 40px); /* ترکیب درصد و پیکسل! */
height: calc(100vh - 60px);
font-size: calc(1rem + 1vw);دور علامتهای + و - حتماً فاصله بگذار: calc(100% - 10px) درست، اما calc(100%-10px) غلط است!
width: min(90%, 1200px); /* هرکدام کوچکتر بود */
padding: max(20px, 5%); /* هرگز کمتر از 20px */سه مقدار میگیرد: حداقل، ایدهآل، حداکثر. مقدار بین دو حد، سیال تغییر میکند. عالی برای فونت ریسپانسیو بدون media query.
/* 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 نیاز داشتند. اینها جدیدترینها هستند.
سالها آرزوی توسعهدهندگان بود: انتخاب یک عنصر بر اساس آنچه داخلش است.
/* کارتی که داخلش عکس دارد */
.card:has(img) { padding: 0; }
/* فرمی که input نامعتبر دارد */
form:has(:invalid) { border: 2px solid red; }.sidebar { container-type: inline-size; }
@container (min-width: 400px) {
.card { display: flex; }
}.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 | انتقال نرم بین صفحات |
مرجع سریع و تقلبنامه
پرکاربردترین پراپرتیها در یک نگاهالگوهای پرتکرار (Snippets طلایی)
*, *::before, *::after {
margin: 0; padding: 0; box-sizing: border-box;
}.center {
display: grid;
place-items: center; /* کوتاهترین راه وسطچینی! */
}.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 |
| flex | justify-content, align-items, flex-direction, flex |
| grid | grid-template-columns, grid-area, repeat, minmax |
| افکت | opacity, box-shadow, filter, backdrop-filter, transform |
| حرکت | transition, animation, @keyframes |
| بصری | overflow, visibility, z-index, cursor, clip-path |
مسیر یادگیری پیشنهادی
- پایه: سینتکس → سلکتورها → باکس مدل → رنگ و متن
- چیدمان: display → position → Flexbox → Grid
- ریسپانسیو: واحدها → media queries → clamp و توابع
- تعامل: transition → transform → animation
- حرفهای: متغیرها → ویژگیهای نوین (:has, @container)
- قدم بعد: یک کتابخانه (مثل Tailwind) یا پیشپردازنده (Sass)
CSS با تمرین یاد گرفته میشود، نه فقط خواندن. هر مفهومی را که اینجا دیدی، در یک فایل واقعی امتحان کن. ابزار CodePen برای تمرین سریع عالی است. اشتباه کن، خراب کن، دوباره بساز — این بهترین معلم است.
- MDN Web Docs — مرجع کامل و رسمی هر پراپرتی
- Can I Use — پشتیبانی مرورگرها
- CSS-Tricks — راهنماها و ترفندها