مدل جعبه ای در CSS
مدل جعبهای (Box Model) یکی از بنیادهای طراحی وب است که توضیح میدهد هر عنصر HTML چگونه فضای صفحه را اشغال میکند. فهم صحیح این مدل برای طراحی واکنشگرا، قرارگیری عناصر و محاسبه دقیق عرض و ارتفاع ضروری است. در این مقاله به صورت نظاممند اجزای مدل، تفاوتهای رایج، نکات عملکردی و مثالهای عملی را بررسی میکنیم.
اجزای اصلی مدل جعبهای
- content: محتوای اصلی عنصر (متن، تصویر، ویدیو و …).
- padding: فضای داخلی بین محتوا و خط مرزی (border).
- border: خط یا قاب دور padding و content.
- margin: فضای بیرونی بین این عنصر و عناصر اطراف.
به طور پیشفرض، عرض/ارتفاع تنظیمشده در CSS مربوط به بخش content است مگر اینکه خصوصیت box-sizing تغییر کند.
نحوه محاسبه عرض و ارتفاع
برای حالت پیشفرض (box-sizing: content-box)، اندازه کلی افقی یک عنصر از جمع موارد زیر حاصل میشود:
- width (content)
- padding-left + padding-right
- border-left-width + border-right-width
- margin-left + margin-right
برای box-sizing: border-box، عرض شامل padding و border میشود و تنها margin بیرونی به آن اضافه میگردد. این حالت در طراحی واکنشگرا بسیار مفید است چون محاسبات سادهتر و پیشبینیپذیرتر میشود.
مثال پایه
/* English code shown inside code block */.box {
width: 300px;
padding: 20px;
border: 5px solid #333;
margin: 10px;
}
در این مثال، با content-box پیشفرض، عرض نهایی عنصر برابر است با 300 + 20*2 + 5*2 = 350px (بدون محاسبه margin). اگر margin را هم اضافه کنیم، فضای کل افقی بیشتر میشود.
استفاده از box-sizing: border-box
/* Apply border-box globally */*,
*::before,
*::after {
box-sizing: border-box;
}
این الگو معمولی در پروژههای مدرن است تا همه عناصر اندازهای که میدهید را شامل padding و border بدانند. بدین ترتیب میتوان سطرها و ستونها را بدون محاسبات پیچیده طراحی کرد.
نمونهای که نشان میدهد چرا border-box بهتر است
.card {
width: 300px;
padding: 20px;
border: 2px solid #ddd;
box-sizing: border-box;
}
در این حالت، عرض نهایی همیشه 300px خواهد ماند و padding یا border فضای اضافی صفحه را افزایش نمیدهد — مناسب برای شبکهبندی (grid) و ستونبندی.
حاشیههای همگرا (Margin Collapse)
وقتی دو بلاکعنصر عمودی پشت سر هم قرار میگیرند، حاشیههای عمودی آنها ممکن است «همگرا» شوند و فقط بزرگترینِ آنها اعمال شود. این رفتار برای تازهکارها گیجکننده است اما کاملاً نرمال است. برای جلوگیری از همگرایی میتوان از padding، border سطح پدر یا overflow استفاده کرد.
مثال collapse و راهحل
.parent {
border: 1px solid #ccc; /* prevents margin collapse */}
.child {
margin-top: 20px;
}
اضافه کردن border یا padding به عنصر پدر جلوی همگرایی margin را میگیرد. همینطور overflow: auto یا ایجاد یک context جدید (مثلاً flex container) میتواند رفتار را تغییر دهد.
چگونه مدل جعبهای در Flexbox و Grid رفتار میکند
در Flexbox و Grid، قوانین اندازهگیری همچنان بر اساس box model اعمال میشود اما توزیع فضا و alignment میتواند ابعاد را تحت تاثیر قرار دهد. بهعنوان مثال، عنصر فلکس ممکن است برای تطابق با فضای در دسترس shrink یا grow کند که باید در محاسبات عرض و padding مدنظر قرار گیرد.
عملکرد و بهینهسازی
- از کشیدن بزرگترین عملیات رزایز CSS (مثل box-shadow با spread بسیار) برای عناصر بسیاری اجتناب کنید تا رندر سریعتر باشد.
- استفاده از
will-changeرا محدود کنید؛ فقط در مواردی به کار ببرید که واقعا انیمیشن وجود دارد. - اعمال
box-sizing: border-boxبه صورت جهانی باعث کاهش نیاز به محاسبات دستی میشود.
جدول خلاصه خصوصیات مرتبط
| خصوصیت | توضیح |
|---|---|
| width, height | اندازه محتوا (مگر border-box تنظیم شده باشد) |
| padding | فضای داخلی بین محتوا و border |
| border | قاب اطراف عنصر |
| margin | فضای بیرونی بین عنصر و دیگر عناصر |
| box-sizing | تعریف میکند کدام بخشها در عرض/ارتفاع لحاظ شوند |
مثال پیشرفته: کارت واکنشگرا با محاسبه درست
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
padding: 16px;
box-sizing: border-box;
}
.card {
background: #fff;
padding: 16px;
border: 1px solid #eee;
box-sizing: border-box; /* ensures consistency inside grid */}
در این نمونه، استفاده از box-sizing: border-box در container و card باعث میشود که gap و padding باعث تغییر عرض ستونها نشوند و طراحی شبکه ثابت و قابل پیشبینی بماند.
نکات حرفهای و تلههای رایج
- فراموش نکنید که تصاویر پیشفرض display: inline هستند و padding/border ممکن است روی خط مبنا تاثیر بگذارد؛ اغلب بهتر است
display:blockیاmax-width:100%برای تصاویر استفاده کنید. - برای اجتناب از محاسبات پیچیده در طراحیهای چندستونی، از
box-sizing: border-boxبه صورت جهانی استفاده کنید. - در هنگام کار با
transformوposition، اندازهها ممکن است بصری با آنچه در DOM محاسبه میشود متفاوت به نظر برسند؛ از ابزارهای توسعه مرورگر برای تایید اندازهها بهره ببرید.
در پایان، مدل جعبهای یک مفهوم ساده اما قدرتمند است که رعایت دقیق آن کیفیت طراحی، پاسخگویی و نگهداری کد را به طور چشمگیری بهبود میبخشد. با درک دقیق padding، border، margin و انتخاب مناسب box-sizing میتوانید طرحهایی قابل پیشبینی و مقاوم در برابر تغییرات ایجاد کنید.
آیا این مطلب برای شما مفید بود ؟




