نموذج الصندوق CSS

نموذج الصندوق هو أساس تخطيط CSS. في عالم CSS، كل عنصر HTML يُعامل كـ "صندوق" مستطيل يتكون من منطقة المحتوى والحشو والحدود والهامش.

مرجع سريع لخصائص نموذج الصندوق

الخاصية القيم الشائعة الغرض
width 300px، 50%، auto عرض منطقة المحتوى
height 200px، auto ارتفاع منطقة المحتوى
padding 20px، 10px 20px، 10px 20px 15px 5px حشو داخلي (المحتوى إلى الحدود)
border 2px solid #333 حدود (عرض + نمط + لون)
margin 10px، 20px auto، 0 auto هامش خارجي (العنصر إلى عناصر أخرى)
box-sizing content-box (افتراضي)، border-box نطاق حساب العرض/الارتفاع

أجزاء نموذج الصندوق الأربعة

من الداخل إلى الخارج:

┌─────────────────────────────────────┐  ← هامش
│  ┌───────────────────────────────┐  │  ← حدود
│  │  ┌─────────────────────────┐  │  │  ← حشو
│  │  │                         │  │  │
│  │  │     منطقة المحتوى       │  │  │
│  │  │                         │  │  │
│  │  └─────────────────────────┘  │  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

1. منطقة المحتوى

المنطقة التي يوجد فيها المحتوى الفعلي، مثل النصوص والصور. العرض والارتفاع يُتحكّم بهما بخاصيتي width وheight.

2. الحشو

المسافة بين منطقة المحتوى والحدود، تُستخدم لإنشاء مسافة بيضاء بين المحتوى والحدود.

مثال

HTML
<style>
.box {
  padding: 20px;  /* 20px من جميع الجوانب */
  background: #fce4ec;
  border: 2px solid #e91e63;
}
</style>
<div class="box">هذا العنصر يحتوي على حشو يُنشئ 20px من المسافة بين المحتوى والحدود</div>
▶ جرّب الكود

3. الحدود

خط الحدود الذي يلف حول الحشو ومنطقة المحتوى.

مثال

HTML
<style>
.box {
  border: 2px solid #333;
  padding: 16px;
  background: #f9f9f9;
}
</style>
<div class="box">هذا العنصر يحتوي على حدود تلف حول الحشو من الخارج</div>
▶ جرّب الكود

4. الهامش

المسافة بين الحدود والعناصر الأخرى، تُستخدم للتحكم في المسافة بين العناصر.

مثال

HTML
<style>
.box {
  margin: 10px;  /* 10px من جميع الجوانب */
  background: #e8f5e9;
  border: 1px solid #66bb6a;
  padding: 10px;
}
</style>
<div class="box">صندوق 1 - لديه هامش 10px</div>
<div class="box">صندوق 2 - مسافة 20px من صندوق 1</div>
<div class="box">صندوق 3 - مسافة 20px من صندوق 2</div>
▶ جرّب الكود
💡 ملاحظة: الهوامش العلوية والسفلية لعناصر المستوى القطري "تتداخل" (تأخذ القيمة الأكبر بدلاً من الجمع). الهوامش اليمنى واليسرى لا تتداخل.

الحجم الفعلي للعنصر

هذا هو الجزء الأكثر إرباكاً — عرض وارتفاع العنصر لا يساويان أبعاد منطقة المحتوى.

بشكل افتراضي (box-sizing: content-box):

العرض الكلي للعنصر = width + padding-left + padding-right + border-left + border-right
الارتفاع الكلي للعنصر = height + padding-top + padding-bottom + border-top + border-bottom

على سبيل المثال:

مثال

HTML
<style>
.box {
  width: 200px;
  height: 100px;
  padding: 20px;
  border: 2px solid black;
  background: #e3f2fd;
  text-align: center;
  line-height: 1.5;
}
</style>
<div class="box">
  منطقة المحتوى 200×100 بكسل<br>
  العرض الفعلي 244×144 بكسل
</div>
▶ جرّب الكود

الحجم الفعلي لعرض هذا الصندوق هو:

إذا كنت تعتقد أن هذا الصندوق 200×100 فقط، فأنت مخطئ! كثير من المبتدئين يتعثرون هنا.

خاصية box-sizing

لحل مشكلة "الحجم الفعلي أكبر من المُعيَّن"، قدّم CSS3 خاصية box-sizing.

content-box (افتراضي)

width وheight تشملان منطقة المحتوى فقط؛ الحشو والحدود لا تُدرجان. هذا هو الافتراضي وמקור "الفخ".

border-box

width وheight تشملان المحتوى + الحشو + الحدود؛ الحدود والحشو لن "يُوسّعا" العنصر:

مثال: مقارنة content-box و border-box

HTML
<style>
.container {
  display: flex;
  justify-content: space-around;
}
.box {
  width: 300px;
  height: 200px;
  border: 10px solid indianred;
}
.item {
  width: 100%;
  background: rgba(49, 115, 187, 0.3);
  border: solid #5B6DCD 10px;
  padding: 15px;
}
.s1 { box-sizing: content-box; }
.s2 { box-sizing: border-box; }
</style>
<div class="container">
  <div class="box">
    <h3>content-box (افتراضي)</h3>
    <div class="item s1">width: 100% + padding + border = يفيض عن الأصل</div>
  </div>
  <div class="box">
    <h3>border-box</h3>
    <div class="item s2">width: 100% يشمل padding + border = يناسب تماماً</div>
  </div>
</div>
▶ جرّب الكود
💡 مقارنة: في وضع content-box، العناصر الابنة تفيض عن الأصل؛ في وضع border-box، العناصر الابنة تناسب تماماً. لهذا يوصي المشاريع الحديثة بتعيين box-sizing: border-box عالمياً.

إعداد border-box العالمي

كثير من المشاريع تُعيّن هذا عالمياً في إعادة التعيين:

مثال

HTML
<style>
*, *::before, *::after {
  box-sizing: border-box;
}
</style>
<div class="box-demo">صندوق عرض</div>
▶ جرّب الكود

تصحيح نموذج الصندوق

استخدم أدوات المطور في المتصفح لفحص نموذج الصندوق بصرياً:

💡 نصيحة التصحيح: اضغط F12 لفتح أدوات المطور، ثم في علامة التبويب المُحسوبة في لوحة العناصر، يمكنك رؤية المحتوى والحشو والحدود والهوامش لكل عنصر — هذه هي الطريقة الأسرع لتشخيص مشاكل التخطيط.

  1. انقر بزر الماوس الأيمن على عنصر في الصفحة، واختر "فحص"
  2. حدد العنصر في لوحة العناصر
  3. انتقل إلى لوحة مُحسوبة أو تخطيط
  4. سترى مخطط نموذج الصندوق يُظهر قيم المحتوى والحشو والحدود والهامش

اختلافات نموذج الصندوق بين أنواع العناصر


❓ أسئلة شائعة

س هل أستخدم content-box أم border-box؟
ج معظم المشاريع تختار `border-box`. مع border-box، الحشو والحدود لن يُوسّعا أبعاد العنصر، مما يجعل حسابات التخطيط أكثر بديهية. كثير من الأُطر (Bootstrap، Tailwind) تُعيّن border-box عالمياً. ما لم تكن لديك احتياجات خاصة، لا تستخدم content-box الافتراضي.
س كيف أرى نموذج الصندوق في المتصفح؟
ج اضغط F12 لفتح أدوات المطور، حدد عنصراً في لوحة العناصر، ولوحة المُحسوبة أو الأنماط على اليمين ستُظهر البنية ذات الطبقات الأربع لنموذج الصندوق (محتوى/حشو/حدود/هامش). هذه هي الطريقة الأسرع لتشخيص مشاكل التخطيط — يُنصح بشدة بجعلها عادةً.
س كل من الهامش والحشو يُنشئان مسافة — متى أستخدم أيهما؟
ج تذكر مبدأ واحد: هل يجب أن يغطي لون الخلفية هذه المنطقة؟ مع الحشو، الخلفية تغطيه؛ مع الهامش، لا تغطيه. ببساطة: المسافة داخل العنصر تستخدم الحشو؛ المسافة بين العناصر تستخدم الهامش.

📖 ملخص

📝 تمارين

أساسي

  1. أنشئ صندوق 200×200 بحشو 30px وحدود 5px solid. استخدم أدوات المطور في المتصفح للتحقق من الأبعاد الفعلية للعرض والتحقق من صيغة نموذج الصندوق.
  2. انسخ الصندوق أعلاه، أضف box-sizing: border-box، وراقب تغييرات الحجم الفعلي، وقارن مع التمرين السابق.

متوسط

  1. أنشئ صفحة بصندوقين جنباً إلى جنب، اضبط هوامشهما، وراقب ظاهرة "تداخل الهامش" (الهوامش العلوية/Sفلية لعناصر المستوى القطري تأخذ الأكبر بدلاً من الجمع).
  2. استخدم border-box لإنشاء "تخطيط عمودين بعرض 50% لكل منهما ومسافة 20px بينهما".

تحدٍ

  1. أنشئ مكوّن بطاقة بـ:
    • عرض ثابت 300px
    • حشو 20px
    • حدود 1px solid #ddd
    • حدود نصف قطرها 8px
    • استخدم border-box لضمان أن العرض الكلي دائماً 300px
  2. أنشئ تخطيط نموذج باستخدام حسابات نموذج الصندوق لمحاذاة حقول الإدخال والأزرار بشكل مثالي.
100%