طراحی وب با HTML و CSS فهرست مطالب
فصل ۴

مدل جعبه‌ای

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

در این فصل با این مباحث آشنا می‌شوید
  1. مدل جعبه‌ای چیست
  2. عرض و ارتفاع
  3. حاشیه
  4. فاصله داخلی
  5. فاصله بیرونی
  6. گرد کردن گوشه‌ها
  7. box-sizing و حل یک مشکل قدیمی
  8. نمونه نهایی فصل

۱. مدل جعبه‌ای چیست

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

  1. محتوا: خود متن یا تصویر.
  2. فاصله داخلی یا padding: فاصله بین محتوا و خط دور جعبه.
  3. حاشیه یا border: خط دور جعبه.
  4. فاصله بیرونی یا margin: فاصله این جعبه تا جعبه‌های همسایه.

یک مقایسه که کار را آسان می‌کند: یک عکس قاب‌شده روی دیوار را تصور کنید. خود عکس محتوا است. حاشیه سفید دور عکس داخل قاب، padding است. خود چوب قاب، border است. و فاصله این قاب تا قاب بعدی روی دیوار، margin است.

فرق padding و 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 روی عنصرهای درون‌خطی مانند 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 سه مقدار را با هم و در یک خط می‌گیرد:

  1. ضخامت مانند 2px
  2. نوع خط مانند solid
  3. رنگ مانند 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 به محتوا فضای نفس کشیدن می‌دهد. اگر طرح شما «شلوغ» به نظر می‌رسد، در نود درصد موارد راه‌حل اضافه کردن 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

اگر دو جعبه زیر هم باشند و جعبه بالایی 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 داشته باشد. نام ویژگی گمراه‌کننده است، اما 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

شرح مثال

در این کارت، هر پنج ویژگی این فصل نقشی دارند:

و مهم‌تر از همه، چون 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عرض یعنی عرض کل جعبه

تمرین‌های فصل چهار

  1. یک کارت پروفایل بسازید: عکس دایره‌ای، نام، یک جمله معرفی، همه داخل یک جعبه با گوشه گرد.
  2. سه کارت زیر هم بسازید که هر کدام رنگ حاشیه بالای متفاوتی داشته باشند.
  3. یک جعبه با عرض ۳۰۰ پیکسل بسازید و آن را با margin: 0 auto وسط صفحه بیاورید.
  4. یک بار box-sizing: border-box را حذف کنید و ببینید چیدمان چگونه به هم می‌ریزد.
  5. چهار جعبه بسازید و روی هر کدام یکی از حالت‌های solid، dashed، dotted و none را امتحان کنید.
فصل قبل: آشنایی با CSS فصل بعد: انتخابگرها و پس‌زمینه