Kodax

التموضع (Position) — تصميم CSS

التموضع (position)

position يخرج العنصر من ترتيبه الطبيعي (التدفق) أو يزيحه عنه.

| القيمة | يحتفظ بمكانه في التدفق؟ | الإزاحة نسبةً إلى | الاستخدام النموذجي |

|---|---|---|---|

| static | ✅ | — (top وأخواتها لا تعمل) | الافتراضي |

| relative | ✅ | موقعه الأصلي | أب مرجعي لعنصر absolute |

| absolute | ❌ | أقرب أب غير static | شارة على بطاقة، قائمة منسدلة |

| fixed | ❌ | نافذة المتصفح | زر عائم، رأس ثابت، نافذة منبثقة |

| sticky | ✅ | يلتصق عند حد معين أثناء التمرير | رأس جدول، قائمة جانبية |

relative + absolute: الثنائي الأهم

.card {
    position: relative;          /* لا يتحرك، لكنه يصبح المرجع */
}
.badge {
    position: absolute;
    top: 12px;
    inset-inline-end: 12px;      /* الزاوية "البعيدة": يسار في rtl */
}
<article class="card">
    <span class="badge">جديد</span>
    <h3>دورة CSS</h3>
</article>

بدون position: relative على البطاقة، تبحث الشارة عن أقرب أب مُموضَع، وإن لم تجد تتموضع نسبةً إلى الصفحة كلها — فتظهر في زاوية الشاشة. هذا أشهر خطأ في position.

الإزاحات

- top و bottom و left و right: فيزيائية.

- inset-inline-start و inset-inline-end: منطقية — تنعكس تلقائياً مع rtl.

- inset: 0 اختصار للأربع (يملأ الأب بالكامل).

fixed

.back-to-top {
    position: fixed;
    bottom: 24px;
    inset-inline-end: 24px;
}

العنصر الثابت يغطي المحتوى تحته. رأس ثابت بارتفاع 64px يحتاج padding-top: 64px على body وإلا غطى بداية الصفحة. وعلى الجوال، العناصر الثابتة الكبيرة تسرق مساحة ثمينة.

sticky

thead th {
    position: sticky;
    top: 0;
    background: white;     /* بدون خلفية سيظهر المحتوى من خلفه */
}

- يحتاج قيمة إزاحة (top: 0) وإلا لا يلتصق.

- يلتصق داخل أبيه فقط: عندما ينتهي الأب يذهب معه.

- لا يعمل إن كان أحد الآباء overflow: hidden (أشهر سبب لـ "sticky لا يعمل").

التوسيط بـ absolute (أسلوب قديم)

top: 50%; left: 50%; transform: translate(-50%, -50%); — ما زال شائعاً، لكن Flexbox و Grid (place-items: center) أبسط في أغلب الحالات.

متى لا تستخدم position؟

لترتيب العناصر بجانب بعضها أو بناء التخطيط. هذه مهمة Flexbox و Grid. التموضع للعناصر التي "تطفو" فوق غيرها.

تمرين

أضف إلى بطاقات المشاريع شارة "جديد" في زاويتها، وزر "للأعلى" ثابتاً في أسفل الشاشة، واجعل رأس جدول الدراسة sticky. جرّب حذف position: relative من البطاقة ولاحظ أين تذهب الشارة.

/* Static - الافتراضي */
.static-box {
    position: static;
    /* top, left, etc. لا تعمل */
}

/* Relative - نسبي */
.relative-box {
    position: relative;
    top: 20px;    /* ينزل 20px */
    left: 30px;   /* يتحرك 30px لليمين */
}

/* Absolute - مطلق */
.container {
    position: relative; /* مهم للأبناء */
}

.absolute-box {
    position: absolute;
    top: 0;
    right: 0;
    /* سيكون في الزاوية العليا اليمنى للـ container */
}

/* Fixed - ثابت */
.fixed-header {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 1000;
    background: white;
}

.back-to-top {
    position: fixed;
    bottom: 20px;
    right: 20px;
    z-index: 999;
}

/* Sticky - لاصق */
.sticky-nav {
    position: sticky;
    top: 0;
    background: white;
    z-index: 100;
}

/* z-index للتراكب */
.modal-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.5);
    z-index: 1000;
}

.modal-content {
    position: fixed;
    z-index: 1001; /* فوق الـ overlay */
}
اختبر فهمك