مدل جعبهای
در CSS هر عنصر یک جعبه است. اگر این جمله را عمیقاً بفهمید، نیمی از مشکلات چیدمان صفحه برایتان حل میشود.
۱. مدل جعبهای چیست
مرورگر هر عنصر HTML را به شکل یک جعبه مستطیلی میبیند، حتی یک کلمه ساده. این جعبه از چهار لایه تشکیل شده که از داخل به بیرون اینطور هستند:
- محتوا: خود متن یا تصویر.
- فاصله داخلی یا padding: فاصله بین محتوا و خط دور جعبه.
- حاشیه یا border: خط دور جعبه.
- فاصله بیرونی یا margin: فاصله این جعبه تا جعبههای همسایه.
یک مقایسه که کار را آسان میکند: یک عکس قابشده روی دیوار را تصور کنید. خود عکس محتوا است. حاشیه سفید دور عکس داخل قاب، padding است. خود چوب قاب، border است. و فاصله این قاب تا قاب بعدی روی دیوار، margin است.
padding فضای داخل جعبه است و رنگ پسزمینه دارد. margin فضای بیرون جعبه است و همیشه خالی و بیرنگ است.
۲. عرض و ارتفاع
.box {
width: 300px;
height: 150px;
background-color: #2f4f4f;
color: white;
}
.half {
width: 50%;
height: 100px;
background-color: #ff6347;
}
عرض و ارتفاع: نمونه 01-width-height
شرح مثال
-
widthعرض وheightارتفاع جعبه را مشخص میکند. -
وقتی مقدار را با
pxمیدهیم، اندازه ثابت است و هر قدر پنجره مرورگر تغییر کند، عوض نمیشود. -
وقتی با درصد میدهیم، اندازه نسبت به عنصر والد
محاسبه میشود.
width: 50%یعنی نصف عرض جعبهای که این جعبه داخلش قرار دارد.
اول اینکه width و height روی عنصرهای درونخطی مانند span و a اثری ندارند. باید اول با display رفتارشان را عوض کرد. دوم اینکه معمولاً بهتر است height را تعیین نکنید و بگذارید ارتفاع جعبه خودش را با محتوایش تنظیم کند. وگرنه اگر متن طولانی شود، از جعبه بیرون میزند.
۳. حاشیه
.box1 {
border: 2px solid #2f4f4f;
}
.box2 {
border: 5px dashed #ff6347;
}
.box3 {
border: 3px dotted gray;
}
.box4 {
border-bottom: 4px solid #2f4f4f;
}
حاشیه: نمونه 02-border
شرح مثال
ویژگی border سه مقدار را با هم و در یک خط میگیرد:
- ضخامت مانند
2px - نوع خط مانند
solid - رنگ مانند
2f4f4f#
پرکاربردترین انواع خط:
| مقدار | نتیجه |
|---|---|
solid | خط پیوسته. پرکاربردترین حالت. |
dashed | خطچین |
dotted | نقطهچین |
none | بدون حاشیه |
اگر تنها یک طرف را بخواهید، از نسخههای جهتدار استفاده کنید: border-top، border-bottom، border-right و border-left. مانند box4. در مثال بالا که تنها زیرش خط دارد. این تکنیک برای زیر عنوانها بسیار به کار میآید.
۴. فاصله داخلی
.box1 {
padding: 20px; /* هر چهار طرف */
}
.box2 {
padding: 10px 30px; /* بالا و پایین، سپس چپ و راست */
}
.box3 {
padding: 10px 20px 30px 40px; /* بالا، راست، پایین، چپ */
}
.box4 {
padding-top: 25px;
padding-bottom: 25px;
}
فاصله داخلی: نمونههای 03-padding و 03-padding2
شرح مثال
padding بسته به تعداد عددهایی که میدهید،
رفتار متفاوتی دارد. این قاعده برای margin هم دقیقاً همین است:
| تعداد مقدار | معنی |
|---|---|
| یک مقدار | هر چهار طرف یکسان |
| دو مقدار | اولی بالا و پایین، دومی چپ و راست |
| چهار مقدار | به ترتیب ساعتگرد: بالا، راست، پایین، چپ |
برای به خاطر سپردن ترتیب چهارتایی، از بالا شروع کنید و در جهت عقربههای ساعت بچرخید.
متنی که به لبه جعبه چسبیده باشد، خواندنش سخت و ظاهرش ناخوشایند است. padding به محتوا فضای نفس کشیدن میدهد. اگر طرح شما «شلوغ» به نظر میرسد، در نود درصد موارد راهحل اضافه کردن padding است.
۵. فاصله بیرونی
.card {
margin: 20px;
background-color: white;
padding: 15px;
}
.center-box {
width: 400px;
margin: 0 auto; /* وسطچین کردن جعبه */
}
.spaced {
margin-bottom: 30px;
}
فاصله بیرونی: نمونه 04-margin
شرح مثال
margin از نظر نوشتاری دقیقاً مانند padding است، اما یک قابلیت ویژه دارد که بسیار به کار میآید:
margin: 0 auto; یعنی «فاصله بالا و پایین صفر، و فاصله چپ و راست را خودت به طور مساوی تقسیم کن». نتیجهاش وسطچین شدن خود جعبه است. این کلاسیکترین روش وسطچین کردن یک جعبه در CSS است، اما حتماً باید عرض جعبه مشخص باشد، وگرنه کار نمیکند.
اگر دو جعبه زیر هم باشند و جعبه بالایی margin-bottom: 30px و پایینی margin-top: 20px داشته باشد، فاصله بینشان پنجاه پیکسل نمیشود؛ سی پیکسل میشود. یعنی بزرگترشان برنده است و کوچکتر داخلش ادغام میشود. این رفتار تنها برای margin بالا و پایین اتفاق میافتد و برای چپ و راست و برای padding هرگز. اگر روزی دیدید فاصلهها آنطور که انتظار دارید جمع نمیشوند، علتش همین است.
۶. گرد کردن گوشهها
.rounded {
border-radius: 10px;
}
.more-rounded {
border-radius: 25px;
}
.pill {
border-radius: 50px;
padding: 10px 25px;
}
.circle {
width: 150px;
height: 150px;
border-radius: 50%;
}
گردی گوشهها: نمونه 05-border-radius
شرح مثال
-
border-radiusبا مقدار پیکسلی، گوشهها را به همان اندازه گرد میکند. عدد بزرگتر یعنی گوشه گردتر. -
border-radius: 50%حالت ویژهای است: جعبه را کاملاً دایره میکند. به شرطی که عرض و ارتفاع برابر باشند، وگرنه بیضی میشود. - برای ساختن دکمههای قرصیشکل، یک عدد بزرگ مانند
50pxبدهید.
نکته جالب اینکه برای گرد کردن گوشهها اصلاً لازم نیست جعبه border داشته باشد. نام ویژگی گمراهکننده است، اما border-radius روی رنگ پسزمینه و تصویر هم اثر میگذارد. دایرهای کردن عکس پروفایل دقیقاً با همین یک خط انجام میشود.
۷. box-sizing و حل یک مشکل قدیمی
این بخش کوتاه است اما یکی از مهمترین بخشهای کل کتاب است. فرض کنید این کد را مینویسید:
.box {
width: 200px;
padding: 20px;
border: 5px solid black;
}
عرض واقعی این جعبه روی صفحه چند پیکسل است؟ شهود میگوید ۲۰۰. اما جواب ۲۵۰ است. چون به طور پیشفرض، مرورگر padding و border را به عرض اضافه میکند:
۲۰۰ محتوا، بهعلاوه ۲۰ پیکسل padding از هر طرف که میشود ۴۰، بهعلاوه ۵ پیکسل حاشیه از هر طرف که میشود ۱۰. جمعاً ۲۵۰ پیکسل.
این رفتار دردسرساز است. اگر دو جعبه بخواهید که هر کدام پنجاه درصد عرض بگیرند، به محض اضافه کردن کمی padding، جمعشان از صد درصد بیشتر میشود و جعبه دوم به خط بعد میپرد. خوشبختانه راهحل تنها یک خط است:
* {
box-sizing: border-box;
}
حل مشکل: نمونه 06-box-sizing
شرح مثال
علامت ستاره یعنی «همه عنصرهای صفحه» و در فصل پنجم کامل معرفی میشود.
مقدار border-box به مرورگر میگوید:
«وقتی میگویم عرض ۲۰۰ پیکسل، یعنی عرض کل جعبه شامل padding و border
باید ۲۰۰ باشد. خودت محتوا را کوچکتر کن تا این عدد رعایت شود.»
| حالت | معنی width: 200px | عرض نهایی |
|---|---|---|
content-box (پیشفرض) |
تنها محتوا ۲۰۰ باشد | ۲۵۰ پیکسل |
border-box |
کل جعبه ۲۰۰ باشد | ۲۰۰ پیکسل |
تقریباً همه طراحان حرفهای، این سه خط را در ابتدای هر فایل CSS مینویسند و بعد کار را شروع میکنند. از این پس ما هم همین کار را میکنیم.
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
شروع استاندارد هر فایل CSS از این به بعد
دو خط اول، فاصلههای پیشفرضی را که مرورگر خودش به عنوانها و پاراگرافها میدهد صفر میکنند، تا کنترل کامل فاصلهها دست خودمان باشد.
۸. نمونه نهایی فصل
<body>
<div class="card">
<h2>دوره طراحی وب</h2>
<p>پانزده جلسه آموزش عملی HTML و CSS</p>
<p class="price">۵۰۰ هزار تومان</p>
</div>
<div class="card">
<h2>دوره جاوااسکریپت</h2>
<p>بیست جلسه برنامهنویسی سمت کاربر</p>
<p class="price">۷۰۰ هزار تومان</p>
</div>
</body>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background-color: #f5f5f5;
font-family: Tahoma, sans-serif;
padding: 40px;
}
.card {
width: 400px;
margin: 0 auto 25px auto;
padding: 25px 30px;
background-color: white;
border: 1px solid #dddddd;
border-top: 4px solid #ff6347;
border-radius: 10px;
}
.card h2 {
color: #2f4f4f;
margin-bottom: 12px;
}
.card p {
color: #666666;
margin-bottom: 8px;
}
.price {
color: #ff6347;
font-size: 20px;
padding-top: 12px;
border-top: 1px solid #eeeeee;
}
نمونه نهایی فصل: نمونه 07-final-example
شرح مثال
در این کارت، هر پنج ویژگی این فصل نقشی دارند:
-
width: 400pxعرض کارت را ثابت میکند وmargin: 0 auto 25px autoآن را وسطچین میکند و بیست و پنج پیکسل هم از کارت بعدی فاصله میگیرد. چون چهار مقدار دادهایم، ترتیبشان بالا، راست، پایین، چپ است. -
padding: 25px 30pxبه محتوا فضا میدهد. بیست و پنج از بالا و پایین، سی از چپ و راست. - دو خط
borderپشت سر هم آمدهاند. اول یک حاشیه نازک دور تا دور، بعد تنها بالای کارت با یک خط نارنجی ضخیم بازنویسی شده است. چون خط دوم پایینتر نوشته شده، برای لبه بالا برنده میشود. این یک تکنیک بسیار رایج در طراحی کارت است. -
border-radius: 10pxگوشهها را نرم میکند. -
کلاس
priceبا یک خط بالای خودش، از بقیه متن جدا شده است.padding-topباعث میشود قیمت به آن خط نچسبد.
و مهمتر از همه، چون box-sizing: border-box را در بالای
فایل نوشتهایم، عرض کارت دقیقاً ۴۰۰ پیکسل است، نه ۴۶۲ پیکسل که
با احتساب padding و border به دست میآمد.
پوشه 04-box-model شامل نمونههای
01-width-height تا 07-final-example.
خلاصه فصل
| ویژگی | کارش |
|---|---|
width و height | عرض و ارتفاع جعبه |
border | خط دور جعبه: ضخامت، نوع، رنگ |
padding | فاصله داخل جعبه، بین محتوا و حاشیه |
margin | فاصله بیرون جعبه، تا همسایهها |
margin: 0 auto | وسطچین کردن خود جعبه |
border-radius | گرد کردن گوشهها، با ۵۰٪ دایره میشود |
box-sizing: border-box | عرض یعنی عرض کل جعبه |
تمرینهای فصل چهار
- یک کارت پروفایل بسازید: عکس دایرهای، نام، یک جمله معرفی، همه داخل یک جعبه با گوشه گرد.
- سه کارت زیر هم بسازید که هر کدام رنگ حاشیه بالای متفاوتی داشته باشند.
- یک جعبه با عرض ۳۰۰ پیکسل بسازید و آن را با
margin: 0 autoوسط صفحه بیاورید. - یک بار
box-sizing: border-boxرا حذف کنید و ببینید چیدمان چگونه به هم میریزد. - چهار جعبه بسازید و روی هر کدام یکی از حالتهای
solid،dashed،dottedوnoneرا امتحان کنید.