Kodax

نموذج الصندوق (Box Model) — تصميم CSS

نموذج الصندوق (Box Model)

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

┌──────────── margin (الهامش: مسافة خارجية شفافة) ────────────┐
│  ┌──────── border (الحد) ─────────────────────────────────┐  │
│  │  ┌──── padding (الحشو: مسافة داخلية بلون الخلفية) ───┐  │  │
│  │  │            content (المحتوى)                       │  │  │
│  │  └────────────────────────────────────────────────────┘  │  │
│  └──────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

افتح أدوات المطور وانقر على عنصر: تبويب Computed يرسم هذا الصندوق بأرقامه الحقيقية.

box-sizing: لماذا border-box؟

.box {
    width: 300px;
    padding: 20px;
    border: 2px solid;
}

- content-box (الافتراضي القديم): العرض الحقيقي = 300 + 40 + 4 = 344px! الحشو والحد يُضافان.

- border-box: العرض الحقيقي = 300px، والمحتوى يتقلص ليتسع للحشو والحد.

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

هذا السطر في بداية كل مشروع تقريباً — يجعل الأحجام كما تكتبها.

الاختصارات (الاتجاهات مع عقارب الساعة)

.a { padding: 16px; }               /* الجهات الأربع */
.b { padding: 8px 16px; }           /* أعلى/أسفل 8، الجانبان 16 */
.c { padding: 8px 16px 24px; }      /* أعلى 8، الجانبان 16، أسفل 24 */
.d { padding: 8px 12px 16px 20px; } /* أعلى، يمين، أسفل، يسار */

⚠️ القيم الأربع فيزيائية: "يمين" هي يمين الشاشة دائماً حتى في الصفحات العربية. للجهات حسب اتجاه النص استخدم الخصائص المنطقية: padding-inline و padding-block (درس كامل لاحقاً).

الحدود

.card {
    border: 1px solid #e5e7eb;        /* سماكة، نمط، لون */
    border-radius: 12px;              /* زوايا دائرية */
}
.avatar { border-radius: 50%; }       /* دائرة (إن كان العرض = الارتفاع) */
.tab { border-block-end: 3px solid currentColor; }

انهيار الهوامش (Margin Collapse)

هامشان رأسيان متجاوران بين عنصري كتلة لا يُجمعان، بل يُؤخذ الأكبر:

h2 { margin-bottom: 24px; }
p { margin-top: 16px; }
/* المسافة بينهما 24px وليس 40px */

يحدث للهوامش الرأسية فقط، ولا يحدث داخل Flexbox و Grid. إن فاجأتك مسافة "مفقودة"، هذا السبب غالباً.

التوسيط الأفقي

.container {
    max-width: 1100px;
    margin-inline: auto;     /* هامش تلقائي على الجانبين = توسيط */
    padding-inline: 16px;    /* مسافة عن حواف الشاشة الصغيرة */
}

max-width بدل width: على الشاشة الصغيرة يتقلص العنصر بدل أن يتجاوزها.

الظلال

box-shadow: 0 4px 12px rgb(0 0 0 / 10%); — إزاحة أفقية، رأسية، تمويه، لون. الظلال الخفيفة أجمل من الداكنة.

تمرين

صمم بطاقة مشروع: عرض أقصى 360px، حشو 20px، حد رمادي فاتح، زوايا 12px، ظل خفيف، وهامش سفلي 24px. ضع ثلاث بطاقات تحت بعضها ولاحظ انهيار الهوامش في أدوات المطور.

/* إعداد box-sizing للكل */
*, *::before, *::after {
    box-sizing: border-box;
}

/* مثال على Box Model */
.card {
    /* المحتوى */
    width: 300px;
    height: auto;
    
    /* الحشو - من الداخل */
    padding: 20px;
    /* أو بالتفصيل */
    padding-top: 20px;
    padding-right: 20px;
    padding-bottom: 20px;
    padding-left: 20px;
    /* أو مختصر: padding: top right bottom left */
    padding: 20px 15px 20px 15px;
    
    /* الحدود */
    border: 2px solid #3498db;
    border-radius: 10px;
    
    /* الهامش - من الخارج */
    margin: 20px;
    /* أو للتوسيط أفقياً */
    margin: 20px auto;
}

/* حدود متعددة */
.fancy-border {
    border: 3px solid;
    border-color: #e74c3c #f39c12 #2ecc71 #3498db;
    /* أعلى يمين أسفل يسار */
}

/* ظل الصندوق */
.shadow-box {
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}

/* ظل داخلي */
.inner-shadow {
    box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1);
}
اختبر فهمك