Menu
flag Ar iconالعربيةdown icon

نموذج الصندوق في CSS: المحتوى وpadding وborder وmargin

كل عنصر صندوق من أربع طبقات: المحتوى، والحشو padding، والحد border، والهامش margin. تعلّم كيف تضيف كل طبقة إلى الحجم، وكيف تغيّر box-sizing: border-box الحساب، وشاهد كل طبقة مقيسة مباشرة.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

الطبقات الأربع لكل صندوق

كل عنصر في الصفحة يُرسم كمستطيل من أربع طبقات، من الداخل إلى الخارج:

  1. المحتوى: النص أو الصورة أو العناصر الأبناء، وحجمه تحدده width وheight.
  2. الحشو (padding): مسافة داخل الصندوق، بين المحتوى والحد. تظهر فيها خلفية العنصر.
  3. الحد (border): الخط المحيط بالحشو.
  4. الهامش (margin): مسافة خارج الحد تدفع الصناديق الأخرى بعيدًا. شفاف دائمًا.

في المثال لكل طبقة لونها: المحتوى أزرق، والحشو أخضر، والحد داكن، والمنطقة الكهرمانية حول الصندوق هي الهامش (يرسمها غلاف، لأن الهامش نفسه شفاف).

السطر تحت الصندوق يقيسه المتصفح: 160 + 20 + 20 + 10 + 10 = 220px. يضيف الهامش 24px أخرى على كل جانب من ذلك، لكنه خارج الصندوق، فلا يدخل في الـ 220.

حساب العرض: content-box مقابل border-box

افتراضيًا (box-sizing: content-box) تضبط width المحتوى وحده. يُضاف الحشو والحد فوقه، فيصبح الصندوق أعرض من الرقم الذي كتبته. أما مع box-sizing: border-box فتكون width هي الصندوق كله، ويتقلص المحتوى ليفسح مكانًا للحشو والحد.

content-box (الافتراضي)border-box
معنى widthالمحتوىالمحتوى + الحشو + الحد
width: 200px; padding: 20px; border: 5pxعرضه 250pxعرضه 200px
منطقة المحتوى في هذه الحالة200px150px
الهامشخارجي، لا يُحسبخارجي، لا يُحسب

إعادة الضبط border-box

لأن border-box تجعل الأحجام تتجمع بشكل منطقي، يبدأ كل ملف أنماط حديث تقريبًا بهذه القاعدة:

*,
*::before,
*::after {
  box-sizing: border-box;
}

تظهر أهميتها أكثر مع النسب المئوية. عمودان بعرض width: 50% مع حشو لا يتسعان في سطر واحد تحت content-box، لأن كلًا منهما 50% زائد حشوه:

(تعليقات HTML تزيل المسافة بين العمودين من نوع inline-block، والتي كانت ستضيف بضع بكسلات.)

رؤية نموذج الصندوق في DevTools

كل متصفح يرسم نموذج الصندوق لك. انقر بالزر الأيمن على عنصر، واختر Inspect، وافتح تبويب Computed (أو Layout في Firefox): يعرض مخطط حجم المحتوى في الوسط، تحيط به قيم الحشو والحد والهامش. ومرور المؤشر فوق عنصر في لوحة Elements يلوّن الصفحة أيضًا: المحتوى أزرق، والحشو أخضر، والهامش برتقالي.

الصناديق السطرية تتبع قواعد مختلفة

يصف نموذج الصندوق أعلاه الصناديق الكتلية مثل <div> و<p>. أما العناصر السطرية مثل <span> و<a> و<strong> فتلتف داخل سطر النص، وتتعامل مع المسافة العمودية بشكل مختلف:

الخاصيةعلى عنصر سطري
width، heightتُتجاهل
الحشو والحد والهامش الأفقيةتُطبق، وتدفع العناصر المجاورة جانبيًا
الحشو والحد العموديانيُرسمان، لكنهما لا يدفعان الأسطر التي فوقهما وتحتهما
الهامش العمودييُتجاهل

تعطي display: inline-block العنصر الموجود داخل السطر نموذج الصندوق الكامل: عرضه وارتفاعه وحشوه وهامشه كلها تشغل مساحة. راجع padding في CSS وmargin في CSS لكل طبقة بالتفصيل.

أخطاء شائعة

  • إضافة حشو إلى صندوق ثابت العرض والتساؤل لماذا كبر. تحت content-box يُضاف الحشو والحد إلى width. استخدم border-box.
  • توقع أن يأخذ الهامش لون الخلفية. الهامش شفاف دائمًا؛ استخدم الحشو للمسافة الملونة.
  • ضبط height أو هامش عمودي على عنصر سطري. لا يحدث شيء؛ استخدم display: inline-block أو block.
  • نسيان الحدود في الحساب. حد بعرض 1px على عنصر width: 100% يجعله أعرض بـ 2px تحت content-box، وقد يسبب ذلك شريط تمرير أفقيًا.
  • الخلط بين الهامش والحشو. باختصار: الحشو داخل الحد، والهامش خارجه. تضعهما صفحة الفرق بين margin وpadding جنبًا إلى جنب.

الأسئلة الشائعة

ما هو نموذج الصندوق في CSS؟

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

ماذا تفعل box-sizing: border-box؟

تجعل width وheight تشملان الحشو والحد. الصندوق الذي عرضه width: 200px مع padding: 20px وحد بعرض 5px يصبح عرضه 200px بالضبط، وتتقلص منطقة المحتوى إلى 150px لتتسع. أما القيمة الافتراضية content-box فتضيف الحشو والحد فوقه، فيصبح العرض 250px.

كيف يُحسب العرض الكلي للعنصر؟

مع content-box الافتراضية: العرض + الحشو الأيمن والأيسر + الحد الأيمن والأيسر. ومع border-box: قيمة width فقط. الهامش خارج الصندوق في الحالتين، فيضيف إلى المساحة التي يشغلها العنصر لا إلى عرضه نفسه.

هل الهامش margin جزء من نموذج الصندوق؟

نعم، هو الطبقة الخارجية، لكنه شفاف دائمًا ولا يُحسب أبدًا في عرض العنصر نفسه أو خلفيته. وظيفته فقط دفع الصناديق المجاورة بعيدًا.

هل أضبط box-sizing: border-box على كل العناصر؟

معظم المشاريع تفعل ذلك، عبر *, *::before, *::after { box-sizing: border-box; } في أعلى ملف الأنماط. يجعل هذا العروض بالنسب المئوية والحشو تتجمع كما يتوقع الناس، وأطر العمل مثل Bootstrap وTailwind تأتي بإعادة الضبط نفسها.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن