Box Model، Margin، Padding، Border و Outline در CSS
بهنام نوبخت · ۱۴۰۵/۶/۲۸
وقتی با CSS شروع به طراحی صفحات وب میکنید، خیلی زود با یک سؤال مهم روبهرو میشوید: چرا یک عنصر با وجود اینکه برای آن width مشخص کردهایم، بزرگتر از چیزی است که انتظار داشتیم؟ چرا فاصله بین دو عنصر ایجاد شده؟ چرا متن داخل یک کارت به لبههای آن چسبیده است؟ و چرا اضافه کردن یک border باعث میشود اندازه ظاهری عنصر تغییر کند؟
پاسخ بسیاری از این سؤالها در مفهومی به نام CSS Box Model قرار دارد.
تقریباً هر عنصر قابل مشاهده در صفحه وب را میتوان مانند یک جعبه در نظر گرفت. این جعبه از قسمتهای مختلفی تشکیل شده است: محتوا، Padding، Border و Margin. شناخت درست این چهار بخش به شما کمک میکند اندازه و فاصله عناصر را دقیقتر کنترل کنید و مشکلات رایج طراحی صفحات را راحتتر پیدا کنید.
در این مقاله ابتدا Box Model را بهصورت ساده یاد میگیریم، سپس با padding، border، margin و outline کار میکنیم و در نهایت با box-sizing یاد میگیریم چگونه اندازه عناصر را قابل پیشبینیتر کنیم.
Box Model چیست؟
مدل جعبهای یا Box Model روشی است که CSS برای محاسبه و نمایش فضای اشغالشده توسط عناصر استفاده میکند.
بهصورت ساده، یک عنصر CSS را میتوان به این شکل تصور کرد:
┌─────────────────────────────────────────┐
│ Margin │
│ ┌─────────────────────────────────┐ │
│ │ Border │ │
│ │ ┌─────────────────────────┐ │ │
│ │ │ Padding │ │ │
│ │ │ ┌─────────────────┐ │ │ │
│ │ │ │ Content │ │ │ │
│ │ │ └─────────────────┘ │ │ │
│ │ └─────────────────────────┘ │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
از داخل به خارج:
Content — محتوای عنصر
Padding — فاصله بین محتوا و Border
Border — خط یا حاشیه اطراف عنصر
Margin — فاصله بیرونی عنصر با عناصر اطراف
MDN نیز Box Model را بر اساس همین چهار ناحیه توضیح میدهد: content، padding، border و margin.
Content چیست؟
Content یا محتوای عنصر، قسمت اصلی آن است.
برای مثال در این کد:
<div class="box">
سلام، به سایت من خوش آمدید.
</div>متن داخل div همان Content است.
اگر تصویر داخل عنصر قرار داشته باشد، تصویر بخشی از محتوای آن عنصر محسوب میشود.
<div class="box">
<img src="image.jpg" alt="تصویر نمونه">
</div>بنابراین Content میتواند شامل موارد مختلفی مانند:
متن
تصویر
لینک
فرم
دکمه
عناصر HTML دیگر
باشد.
Padding چیست؟
padding فاصله داخل عنصر است؛ یعنی فاصله بین محتوا و Border.
فرض کنید یک کارت دارید:
<div class="card">
<h2>عنوان محصول</h2>
<p>توضیحات محصول</p>
</div>اگر هیچ Padding نداشته باشید، محتوای کارت ممکن است بیش از حد به لبههای آن نزدیک شود.
.card {
padding: 20px;
}حالا از چهار طرف محتوا، ۲۰ پیکسل فاصله ایجاد میشود.
┌──────────────────────────────┐
│ Padding │
│ ┌────────────────────┐ │
│ │ Content │ │
│ └────────────────────┘ │
│ Padding │
└──────────────────────────────┘Padding معمولاً برای ایجاد فضای داخلی عناصر استفاده میشود.
انواع Padding
میتوان Padding هر چهار طرف را بهصورت جداگانه مشخص کرد.
Padding بالا
padding-top: 20px;Padding راست
padding-right: 20px;Padding پایین
padding-bottom: 20px;Padding چپ
padding-left: 20px;مثلاً:
.card {
padding-top: 20px;
padding-right: 30px;
padding-bottom: 20px;
padding-left: 30px;
}Shorthand برای Padding
میتوانیم به جای نوشتن چهار ویژگی جداگانه، از padding استفاده کنیم.
یک مقدار
padding: 20px;یعنی هر چهار طرف:
top = 20px
right = 20px
bottom = 20px
left = 20pxدو مقدار
padding: 10px 20px;به این معنی است:
top = 10px
bottom = 10px
right = 20px
left = 20pxسه مقدار
padding: 10px 20px 30px;یعنی:
top = 10px
right = 20px
left = 20px
bottom = 30pxچهار مقدار
padding: 10px 20px 30px 40px;ترتیب همیشه:
Top → Right → Bottom → Leftیعنی:
top = 10px
right = 20px
bottom = 30px
left = 40pxیک روش ساده برای به خاطر سپردن این ترتیب این است:
ساعتگرد حرکت میکنیم.
Top
↑
Left ← → Right
↓
BottomBorder چیست؟
border یا حاشیه، خطی است که اطراف Padding و Content قرار میگیرد.
برای مثال:
.card {
border: 1px solid #ddd;
}ساختار به این صورت است:
┌──────────────────────────────┐
│ Border │
│ ┌──────────────────────┐ │
│ │ Padding │ │
│ │ ┌──────────────┐ │ │
│ │ │ Content │ │ │
│ │ └──────────────┘ │ │
│ └──────────────────────┘ │
└──────────────────────────────┘Border معمولاً از سه بخش تشکیل میشود:
border-width
border-style
border-colorضخامت Border
border-width: 2px;نوع Border
border-style: solid;برخی مقدارهای رایج:
solid
dashed
dotted
doubleمثلاً:
border-style: dashed;یا:
border-style: dotted;رنگ Border
border-color: #333;روش کوتاه نوشتن Border
در بیشتر مواقع از Shorthand استفاده میکنیم:
border: 1px solid #333;یعنی:
1px → ضخامت
solid → نوع
#333 → رنگBorder برای هر طرف
همانند Padding میتوان برای هر طرف Border جداگانه تعریف کرد.
border-top: 2px solid red;
border-right: 1px solid blue;
border-bottom: 2px solid green;
border-left: 1px solid orange;همچنین میتوان ویژگیهای یک سمت را جداگانه تنظیم کرد:
border-top-width: 3px;
border-top-style: solid;
border-top-color: red;Margin چیست؟
margin فاصله خارج از Border است.
به زبان ساده:
Padding فضای داخل عنصر است، اما Margin فضای بیرون عنصر است.
مثلاً:
.card {
margin: 20px;
}باعث میشود عنصر از عناصر اطراف خود فاصله بگیرد.
Margin
┌──────────────────────────────┐
│ ┌──────────────────────┐ │
│ │ Border │ │
│ │ ┌──────────────┐ │ │
│ │ │ Content │ │ │
│ │ └──────────────┘ │ │
│ └──────────────────────┘ │
└──────────────────────────────┘MDN نیز Margin را فضای بیرونی اطراف Border معرفی میکند که برای جدا کردن عنصر از عناصر اطراف استفاده میشود.
تفاوت Padding و Margin
این تفاوت را باید بهخوبی یاد بگیرید.
فرض کنید یک کارت داریم:
.card {
padding: 20px;
margin: 20px;
}padding باعث میشود:
Border
↓
┌──────────────────────┐
│ Padding │
│ ┌──────────────┐ │
│ │ Content │ │
│ └──────────────┘ │
└──────────────────────┘اما margin باعث ایجاد فاصله با عناصر بیرونی میشود:
Margin
↓
┌───────┐
│ Card │
└───────┘
↑
Marginبهصورت خلاصه:
ویژگی | محل فاصله | کاربرد |
|---|---|---|
| داخل عنصر | فاصله محتوا از لبه |
| خارج عنصر | فاصله عنصر از اطراف |
انواع Margin
مانند Padding:
margin-top: 20px;
margin-right: 20px;
margin-bottom: 20px;
margin-left: 20px;و Shorthand:
margin: 20px;یا:
margin: 10px 20px;یا:
margin: 10px 20px 30px;یا:
margin: 10px 20px 30px 40px;همان ترتیب قبلی برقرار است:
Top → Right → Bottom → Leftقرار دادن عنصر در مرکز با Margin
یکی از کاربردهای بسیار مهم margin استفاده از auto است.
فرض کنید یک عنصر داریم:
.container {
width: 600px;
margin: 0 auto;
}در این حالت، وقتی فضای کافی در اطراف عنصر وجود داشته باشد، مرورگر مقدار مناسب حاشیه چپ و راست را بهصورت خودکار محاسبه میکند و عنصر را در مرکز قرار میدهد.
مثلاً:
<div class="container">
محتوای من
</div>.container {
width: 600px;
margin: 0 auto;
padding: 20px;
background-color: #eee;
}این روش در طراحی صفحات بسیار رایج است.
البته در طراحیهای مدرن، مخصوصاً هنگام کار با Flexbox و Grid، روشهای دیگری نیز برای مرکز کردن عناصر خواهیم داشت که در مقالات آینده یاد میگیریم.
Margin Collapse چیست؟
یکی از رفتارهای مهم Margin که ممکن است در ابتدا کمی عجیب به نظر برسد، Margin Collapse است.
در برخی شرایط، Margin عمودی دو عنصر Block به جای اینکه با هم جمع شوند، ممکن است در هم ادغام شوند و فقط بزرگترین مقدار باقی بماند.
مثلاً:
.box1 {
margin-bottom: 30px;
}
.box2 {
margin-top: 20px;
}ممکن است انتظار داشته باشید فاصله بین دو عنصر:
30 + 20 = 50pxباشد.
اما در بعضی شرایط، Marginها Collapse میشوند و فاصله نهایی میتواند برابر با مقدار بزرگتر، یعنی 30px باشد. این رفتار به شرایط و ساختار عناصر بستگی دارد.
در این مرحله لازم نیست تمام قوانین Margin Collapse را حفظ کنید. مهم است بدانید چنین رفتاری وجود دارد تا اگر در آینده با فاصلهای غیرمنتظره مواجه شدید، بدانید یکی از احتمالات همین موضوع است.
Outline چیست؟
outline شباهت زیادی به Border دارد، اما دقیقاً همان Border نیست.
مثلاً:
button {
outline: 2px solid blue;
}Outline معمولاً خارج از Border رسم میشود و برخلاف Border، بخشی از اندازه اصلی Box Model محسوب نمیشود.
به همین دلیل اضافه کردن Outline معمولاً باعث نمیشود اندازه Layout عنصر مانند اضافه کردن Border تغییر کند.
تفاوت Border و Outline
ویژگی | Border | Outline |
|---|---|---|
اطراف عنصر نمایش داده میشود | بله | بله |
بخشی از Box Model است | بله | خیر |
میتواند اندازه ظاهری Box را تحت تأثیر قرار دهد | بله | معمولاً خیر |
برای طراحی کارتها مناسب است | بله | معمولاً کمتر |
برای نمایش Focus مناسب است | بله | بله |
یکی از کاربردهای مهم Outline، مشخص کردن عنصر دارای Focus است.
مثلاً هنگام حرکت با صفحهکلید، مرورگر ممکن است روی یک دکمه یا لینک Outline نمایش دهد تا کاربر بداند Focus روی کدام عنصر قرار دارد.
به همین دلیل نباید بدون دلیل این ویژگی را حذف کنیم:
button {
outline: none;
}اگر Outline مربوط به Focus را حذف میکنید، باید یک روش واضح و قابل مشاهده جایگزین آن کنید تا کاربران بتوانند Focus را تشخیص دهند.
Box Sizing چیست؟
حالا به یکی از مهمترین بخشهای Box Model میرسیم:
box-sizingاین ویژگی تعیین میکند width و height چگونه در اندازه نهایی عنصر محاسبه شوند.
دو مقدار مهم آن عبارتاند از:
content-boxو:
border-boxcontent-box
مقدار پیشفرض box-sizing، content-box است.
یعنی اگر بنویسیم:
.box {
width: 300px;
padding: 20px;
border: 5px solid black;
}در حالت content-box:
Width content = 300px
Padding left = 20px
Padding right = 20px
Border left = 5px
Border right = 5pxپس عرض نهایی:
300 + 20 + 20 + 5 + 5
= 350pxخواهد بود.
یعنی:
.box {
width: 300px;
}به این معنی نیست که کل جعبه دقیقاً 300 پیکسل است؛ بلکه در content-box، مقدار Width مربوط به Content است.
border-box
حالا اگر بنویسیم:
.box {
box-sizing: border-box;
width: 300px;
padding: 20px;
border: 5px solid black;
}در این حالت width: 300px شامل:
Content
Padding
Border
میشود.
بنابراین عرض کلی عنصر همان:
300pxباقی میماند.
فضای Content کوچکتر میشود تا Padding و Border در همین 300 پیکسل جا بگیرند.
مقایسه content-box و border-box
content-box
.box {
box-sizing: content-box;
width: 300px;
padding: 20px;
border: 5px solid black;
}عرض نهایی:
350pxborder-box
.box {
box-sizing: border-box;
width: 300px;
padding: 20px;
border: 5px solid black;
}عرض نهایی:
300pxاین تفاوت در طراحی Layout اهمیت زیادی دارد.
یک تنظیم رایج برای پروژهها
بسیاری از توسعهدهندگان برای قابل پیشبینیتر شدن اندازه عناصر، border-box را برای عناصر صفحه فعال میکنند:
html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
}با این کار، عناصر و pseudo-elementها از این مدل اندازهگیری استفاده میکنند.
در پروژههای آموزشی و واقعی ممکن است این کد را زیاد ببینید. border-box معمولاً مدیریت اندازه عناصر را سادهتر میکند.
یک مثال کامل از Box Model
بیایید یک کارت ساده ایجاد کنیم.
HTML
<div class="card">
<h2>دوره طراحی وب</h2>
<p>
در این دوره با HTML و CSS و اصول طراحی صفحات وب آشنا میشوید.
</p>
<a href="#">مشاهده دوره</a>
</div>CSS
.card {
width: 350px;
padding: 24px;
border: 1px solid #ddd;
margin: 30px auto;
background-color: #ffffff;
}در این مثال:
width
↓
عرض Content
padding
↓
فاصله متن از Border
border
↓
حاشیه اطراف کارت
margin
↓
فاصله کارت از عناصر اطرافساخت یک کارت زیباتر
حالا میتوانیم همان کارت را کمی بهتر طراحی کنیم:
.card {
width: 350px;
box-sizing: border-box;
padding: 24px;
margin: 30px auto;
border: 1px solid #ddd;
background-color: #fff;
}عنوان:
.card h2 {
margin-top: 0;
margin-bottom: 12px;
}متن:
.card p {
margin-bottom: 20px;
}لینک:
.card a {
display: inline-block;
padding: 10px 16px;
background-color: #222;
color: white;
text-decoration: none;
}در این مثال از چند مفهوم قبلی نیز استفاده کردیم:
رنگها
فونتها
Text
Padding
Margin
Border
Width
Box Sizing
تفاوت فاصله داخلی و خارجی در یک مثال واقعی
فرض کنید یک کارت داریم:
.card {
padding: 20px;
margin: 30px;
}اگر کارت این باشد:
Margin
←──────────────→
┌───────────────────┐
│ Border │
│ ┌───────────┐ │
│ │ Padding │ │
│ │ ┌─────┐ │ │
│ │ │Text │ │ │
│ │ └─────┘ │ │
│ └───────────┘ │
└───────────────────┘میتوانیم بگوییم:
Padding: «محتوای من را از لبههای خودم دور کن.»
Margin: «من را از عناصر اطرافم دور کن.»
این یکی از سادهترین روشها برای به خاطر سپردن تفاوت این دو ویژگی است.
استفاده از Box Model در طراحی کارتهای سایت
تقریباً در هر سایت واقعی با کارتها مواجه میشوید:
کارت محصول
کارت مقاله
کارت دوره آموزشی
کارت کاربر
کارت قیمت
کارت خدمات
کارت خبر
مثلاً:
<div class="product-card">
<h2>سرور مجازی</h2>
<p>
سرور مجازی با منابع اختصاصی و پایدار.
</p>
<strong>شروع قیمت: 750 هزار تومان</strong>
</div>CSS:
.product-card {
width: 320px;
box-sizing: border-box;
padding: 24px;
margin: 20px;
border: 1px solid #ddd;
background-color: #fff;
}در آینده با Flexbox و Grid یاد میگیریم چگونه چندین کارت را کنار هم قرار دهیم و یک Layout حرفهای بسازیم.
چگونه مشکلات Box Model را پیدا کنیم؟
گاهی یک عنصر آنطور که انتظار داریم نمایش داده نمیشود.
مثلاً:
.box {
width: 100%;
padding: 20px;
border: 2px solid black;
}ممکن است متوجه شوید عنصر از عرض والد خود بزرگتر شده است.
یکی از اولین چیزهایی که باید بررسی کنید box-sizing است:
.box {
box-sizing: border-box;
}همچنین میتوانید از ابزارهای Developer Tools مرورگر استفاده کنید.
در مرورگر:
Right Click
↓
Inspect
↓
Elementsمعمولاً در بخش مربوط به Box Model میتوانید مقدارهای:
Margin
Border
Padding
Contentرا مشاهده کنید.
این ابزار یکی از بهترین روشها برای درک واقعی Box Model هنگام طراحی صفحات است.
اشتباهات رایج در Box Model
1. اشتباه گرفتن Margin و Padding
اشتباه:
برای ایجاد فاصله متن از لبه کارت از Margin خود کارت استفاده کنیم.
در چنین شرایطی معمولاً padding انتخاب مناسبتری است.
2. فراموش کردن Border در محاسبه اندازه
مثلاً:
.box {
width: 300px;
border: 10px solid black;
}در content-box، عرض نهایی 300 پیکسل نخواهد بود.
3. استفاده نکردن از box-sizing در Layoutهای حساس
در طراحیهایی که اندازه عناصر باید دقیق باشد، border-box میتواند مدیریت اندازه را بسیار سادهتر کند.
4. حذف Outline بدون جایگزین
این کد:
button {
outline: none;
}میتواند تجربه کاربرانی را که با صفحهکلید کار میکنند، ضعیف کند.
اگر Focus را حذف میکنید، باید یک حالت Focus مناسب جایگزین کنید.
مثلاً:
button:focus-visible {
outline: 3px solid blue;
}5. استفاده بیش از حد از Margin
گاهی به جای اینکه ساختار داخلی یک عنصر را با Padding درست کنیم، Marginهای مختلف روی عناصر داخلی قرار میدهیم.
قبل از اضافه کردن Margin، از خودتان بپرسید:
آیا میخواهم فاصله داخل این عنصر باشد یا خارج آن؟
تمرینهای مقاله
تمرین ۱ — Box Model
یک div بسازید:
<div class="box">
این یک جعبه است.
</div>و برای آن موارد زیر را تعیین کنید:
width: 300px
padding: 20px
border: 5px solid
margin: 30pxسپس محاسبه کنید در حالت content-box عرض نهایی چند پیکسل خواهد بود.
تمرین ۲ — Padding
یک کارت بسازید و مقدار Padding آن را تغییر دهید:
.card {
padding: 10px;
}سپس امتحان کنید:
padding: 30px;و تفاوت را مشاهده کنید.
تمرین ۳ — Margin
دو کارت زیر هم بسازید:
<div class="card">کارت اول</div>
<div class="card">کارت دوم</div>و برای آنها Margin ایجاد کنید.
مثلاً:
.card {
margin-bottom: 20px;
}تمرین ۴ — Border
چند نوع Border مختلف امتحان کنید:
border: 2px solid black;border: 2px dashed black;border: 3px dotted black;border: 5px double black;تفاوت ظاهری آنها را بررسی کنید.
تمرین ۵ — Box Sizing
دو عنصر با مشخصات یکسان بسازید:
.box {
width: 300px;
padding: 20px;
border: 5px solid black;
}یکی را با:
box-sizing: content-box;و دیگری را با:
box-sizing: border-box;نمایش دهید.
سپس اندازه واقعی هر دو را با Developer Tools بررسی کنید.
جمعبندی
Box Model یکی از پایهایترین مفاهیم CSS است و تقریباً در تمام طراحیهای وب با آن سروکار خواهید داشت.
هر عنصر را میتوان به چهار بخش اصلی تقسیم کرد:
Content
↓
Padding
↓
Border
↓
MarginContent محتوای اصلی عنصر است.
Padding فاصله بین محتوا و Border است.
Border حاشیه اطراف Padding و Content است.
Margin فاصله بیرونی عنصر با عناصر اطراف است.
همچنین box-sizing مشخص میکند width و height چگونه در محاسبه اندازه عنصر در نظر گرفته شوند. مقدار border-box در بسیاری از Layoutها باعث میشود کنترل اندازه عناصر سادهتر و قابل پیشبینیتر باشد.
اگر Box Model را بهخوبی یاد بگیرید، بسیاری از مشکلاتی که هنگام طراحی صفحات با CSS با آنها مواجه میشوید، بسیار سادهتر قابل حل خواهند بود.
نظرات
هنوز نظری ثبت نشده است.