هوامش وحشو CSS

المسافات في CSS تأتي بنوعين: حشو وهامش. هما خصائص أساسية للتحكم في "الفراغ الداخلي" و"المسافة الخارجية" للعناصر.

مرجع سريع لخصائص المسافات

الخاصية القيم الشائعة الغرض
padding 16px، 10px 20px، 10px 5px 15px 20px حشو (أعلى، يمين، أسفل، يسار)
padding-top/right/bottom/left 16px، 5% حشو جانب واحد
margin 20px، 0 auto، 10px 0 20px 0 هامش (أعلى، يمين، أسفل، يسار)
margin-top/right/bottom/left 10px، auto هامش جانب واحد
auto margin: 0 auto توسيط عناصر قطعية أفقياً
💡 قاعدة اختصار الهامش: 4 قيم (أعلى، يمين، أسفل، يسار) → 3 قيم (أعلى، يمين+يسار، أسفل) → 2 قيم (أعلى+أسفل، يمين+يسار) → 1 قيمة (جميع الجوانب متساوية).

الحشو

padding هو المسافة بين منطقة المحتوى والحدود — "الفراغ الداخلي" للعنصر.

مثال

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

تعيين جوانب فردية

مثال

HTML
<style>
.box {
  padding-top: 10px;
  padding-right: 20px;
  padding-bottom: 30px;
  padding-left: 40px;
  background: #fce4ec;
  border: 1px solid #e91e63;
}
</style>
<div class="box">حشو مختلف: أعلى 10px، يمين 20px، أسفل 30px، يسار 40px</div>
▶ جرّب الكود

قواعد اختصار الحشو

💡 خدعة الذاكرة: اختصار الحشو/الهامش يبدأ من "الأعلى" مع عقارب الساعة — أعلى، يمين، أسفل، يسار. لا تتذكر؟ فكّر "مع عقارب الساعة من الساعة 12." قيمتان تعنيان "أعلى+أسفل، يمين+يسار."

CSS
/* قيمة واحدة: جميع الجوانب متساوية */
padding: 20px;

/* قيمتان: أعلى+أسفل، يمين+يسار */
padding: 10px 20px;

/* ثلاث قيم: أعلى، يمين+يسار، أسفل */
padding: 10px 20px 30px;

/* أربع قيم: أعلى، يمين، أسفل، يسار (مع عقارب الساعة) */
padding: 10px 20px 30px 40px;

حالات استخدام الحشو الشائعة

مثال

HTML
<style>
/* إضافة حشو للزر لقابلية نقر أفضل */
.button {
  padding: 12px 24px;
  background: #3498db;
  color: white;
  border: none;
  border-radius: 4px;
}

/* فراغ محتوى البطاقة */
.card {
  padding: 20px;
  border: 1px solid #ddd;
  border-radius: 8px;
  background: #f9f9f9;
}

/* منطقة نقر عنصر التنقل */
.nav-item {
  padding: 10px 16px;
  background: #e8eaf6;
  display: inline-block;
}
</style>
<button class="button">زر</button>
<div class="card">محتوى البطاقة مع مسافة مريحة من الحدود</div>
<nav class="nav-item">عنصر تنقل</nav>
▶ جرّب الكود

ملاحظات الحشو

📌 ملاحظة العنصر السطري: حشو <span> و<a> والعناصر السطرية الأخرى يعمل فقط أفقياً. إذا أردت مناطق نقر مثالية على العناصر السطرية، اضبط display: inline-block.

الهامش

margin هو المسافة بين حدود العنصر والعناصر الأخرى — "المسافة الخارجية" للعنصر.

مثال

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

قواعد اختصار الهامش

نفس الحشو:

CSS
margin: 20px;            /* جميع الجوانب متساوية */
margin: 10px 20px;       /* أعلى+أسفل، يمين+يسار */
margin: 10px 20px 30px;  /* أعلى، يمين+يسار، أسفل */
margin: 10px 20px 30px 40px; /* أعلى، يمين، أسفل، يسار */

حالات استخدام الهامش الشائعة

مثال

HTML
<style>
/* توسيط حاوية */
.container {
  width: 1200px;
  margin: 0 auto;   /* توسيط أفقي */
  background: #e3f2fd;
  padding: 10px;
}

/* مسافة بين العناصر */
.box {
  margin-bottom: 20px;
}

/* مسافة تحت العناوين */
h1 {
  margin-bottom: 16px;
}
</style>
<div class="container">عنصر حاوية مع عناصر أبناء بداخلها</div>
<div class="box">عنصر صندوق يوضح تنسيق نموذج الصندوق</div>
<h1>عنوان المستوى الأول</h1>
▶ جرّب الكود

استخدام margin: auto للتوسيط

margin: 0 auto يمكنه توسيط عنصر قطعي أفقياً داخل أصله:

مثال

HTML
<style>
.box {
  width: 400px;      /* يجب تحديد العرض */
  margin: 0 auto;    /* توسيط أفقي */
}
</style>
<div class="box">عنصر صندوق يوضح تنسيق نموذج الصندوق</div>
▶ جرّب الكود

تداخل الهامش

⚠️ فخ كلاسيكي: الهوامش العمودية المتجاورة تتداخل في الأكبر — يُسمى "تداخل الهامش." أبسط إصلاح هو إضافة overflow: hidden أو padding: 1px لعنصر الأصل. استخدام حاوية flex يمنع هذا أيضاً.

هذا مفهوم CSS مهم — الهوامش العمودية المتجاورة تتداخل في واحد، تأخذ القيمة الأكبر.

السيناريو 1: أشقاء متجاورون

مثال

HTML
<style>
.box1 {
  margin-bottom: 30px;
}
.box2 {
  margin-top: 20px;
}
/* المسافة الفعلية 30px (القيمة الأكبر)، وليست 50px */
</style>
<div class="box1">صندوق 1</div>
<div class="box2">صندوق 2</div>
▶ جرّب الكود

السيناريو 2: عناصر أصلية-تابعة

عندما لا يحتوي الأصل على حشو أو حدود أو محتوى، هامش الابن "يخترق" خارج الأصل:

مثال

HTML
<style>
.parent {
  background: #eee;
  /* لا حشو أو حدود */
}
.child {
  margin-top: 20px;  /* هذا الهامش يجعل الأصل "يسقط" أيضاً */
}
</style>
<div class="parent">حاوية أصلية</div>
<div class="child">محتوى تابع</div>
▶ جرّب الكود

طرق التجنب:

السيناريو 3: عناصر فارغة

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

حالات عدم تداخل الهامش

اختيار الحشو مقابل الهامش

السيناريو استخدم أيهما
منع نص الزر من لمس الحواف حشو
إبعاد بطاقتين عن بعضهما هامش
إبعاد المحتوى عن الحدود حشو
توسيط حاوية في الصفحة margin: auto
التحكم في حجم منطقة الخلفية حشو

طريقة قرار بسيطة: هل يجب أن تغطي الخلفية هذه المنطقة؟ إذا نعم، استخدم حشو؛ إذا لا، استخدم هامش.


❓ أسئلة شائعة

س ما هو تداخل الهامش؟
ج الهوامش العمودية المتجاورة تتداخل في الأكبر. مثلاً، عنصر لديه `margin-bottom: 30px`، والتالي لديه `margin-top: 20px` — المسافة الفعلية 30px وليست 50px. إضافة `overflow: hidden` للأصل أو استخدام تخطيط flex يمنع هذا.
س ماذا لو جعل الحشو العناصر كبيرة جداً؟
ج اضبط عالمياً `box-sizing: border-box`. هذا يشمل الحشو والحدود في العرض/الارتفاع الكلي للعنصر، مانعاً التوسع. تقريباً جميع المشاريع الحديثة تفعل هذا.
س ما شروط توسيط margin: 0 auto؟
ج يجب أن يكون للعنصر عرض صريح (ليس auto) ويجب أن يكون عنصراً قطيعياً (display: block). العناصر السطرية وعناصر المستوى القطري بدون عرض مُعيَّن لا يمكن توسيطها بـ margin: auto.

📖 ملخص

📝 تمارين

  1. أنشئ صفحة "مجموعة بطاقات" بـ 3 بطاقات، باستخدام الهامش للتحكم في المسافة بين البطاقات.
  2. أنشئ شريط تنقل باستخدام الحشو للتحكم في المسافة من النص إلى الحدود في كل عنصر تنقل.
  3. وضح "تداخل الهامش" وحله ب طريقتين مختلفتين على الأقل.
  4. استخدم margin: 0 auto لتوسيط حاوية بعرض 800px أفقياً في الصفحة.
100%