تخطَّ إلى المحتوى

position و z-index في CSS: تحديد مكان العناصر

الدرس 12 من 19 · CSS

شارة «جديد» فوق زاوية صورة المنتج، وشريط علوي يبقى ثابتاً وأنت تمرر الصفحة، وزر «العودة للأعلى» الملتصق بأسفل الشاشة. كل هذه عناصر خرجت من الترتيب العادي للصفحة ووقفت في مكان تحدده أنت. الخاصية المسؤولة عن ذلك هي position، وهي موضوع هذا الدرس.

المتصفح يرتب العناصر افتراضياً واحداً بعد الآخر كما كُتبت في HTML. هذا يسمى الانسياب العادي (Normal Flow)، وقيمة position فيه هي static.

والعنصر بقيمة static يتجاهل خصائص التحريك الأربع: top و right و bottom و left. لكي تعمل هذه الخصائص يجب أن تغيّر position أولاً.

relative: تحريك من المكان الأصلي

Section titled “relative: تحريك من المكان الأصلي”
.box {
position: relative;
top: 10px;
left: 20px;
}

العنصر يتحرك نسبةً إلى مكانه الأصلي: ينزل 10 بكسل ويبتعد 20 بكسل عن اليسار. والمهم أن مكانه الأصلي يبقى محجوزاً، فالعناصر الأخرى لا تتحرك.

لاحظ أن top: 10px تعني «ابتعد عن الأعلى 10 بكسل»، أي تحرك إلى الأسفل.

لكن أشهر استخدام لـ relative ليس التحريك نفسه، بل أن تجعل العنصر مرجعاً لأبنائه، كما سترى الآن.

.card {
position: relative;
}
.badge {
position: absolute;
top: 8px;
left: 8px;
}

العنصر بقيمة absolute:

  • يخرج من الانسياب: لا يحجز مكاناً، وباقي العناصر تتصرف كأنه غير موجود.
  • يتحدد مكانه نسبةً إلى أقرب أب له position غير static.

هنا الشارة تقف على بعد 8 بكسل من أعلى البطاقة ويسارها، وتتحرك مع البطاقة أينما ذهبت.

تخيّل ملصقاً على صندوق: تلصقه في زاوية الصندوق، فإذا نقلت الصندوق انتقل الملصق معه. الصندوق هو الأب relative، والملصق هو الابن absolute.

.to-top {
position: fixed;
bottom: 20px;
left: 20px;
}

العنصر يثبت نسبةً إلى نافذة المتصفح نفسها، ولا يتحرك مهما مررت الصفحة. يُستخدم لزر العودة للأعلى، وأزرار المحادثة، والأشرطة الثابتة.

وهو يخرج من الانسياب مثل absolute، فقد يغطي جزءاً من المحتوى. انتبه لذلك على الشاشات الصغيرة.

.table-header {
position: sticky;
top: 0;
}

sticky مزيج ذكي: العنصر يتصرف عادياً ويتحرك مع الصفحة، حتى يصل إلى المسافة المحددة من حافة الشاشة، وعندها يلتصق ويبقى ظاهراً.

  • يجب تحديد top أو غيرها، وإلا لن يلتصق.
  • يبقى ملتصقاً ما دام أبوه ظاهراً، ثم يغادر معه.

يناسب عناوين الأقسام في القوائم الطويلة، ورؤوس الجداول، والشريط العلوي.

القيمة يحجز مكانه؟ يقيس مكانه من
static نعم لا يتحرك
relative نعم مكانه الأصلي
absolute لا أقرب أب له position
fixed لا نافذة المتصفح
sticky نعم نافذة التمرير عند الالتصاق

لتمديد عنصر على أبيه كله تحتاج أربعة أسطر: top: 0 و right: 0 و bottom: 0 و left: 0. الخاصية inset تختصرها:

.overlay {
position: absolute;
inset: 0;
background: rgb(0 0 0 / 0.5);
}

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

عندما يتراكب عنصران، من يظهر فوق الآخر؟ الأصل أن المكتوب لاحقاً في HTML يظهر فوق. وتغيّر ذلك بـ z-index:

.header {
position: sticky;
top: 0;
z-index: 10;
}
.modal {
position: fixed;
z-index: 100;
}

الرقم الأكبر يظهر فوق الأصغر. تخيّل أوراقاً فوق بعضها على المكتب: z-index هو ترتيب الورقة في الكومة.

و z-index تعمل فقط مع عنصر له position غير static.

مرّر داخل صندوق النتيجة ولاحظ الشريط الملتصق في الأعلى والزر الثابت في الأسفل. ثم احذف السطر position: relative من .card وشاهد أين تذهب الشارة:

جرّب بنفسكCSS
أو اضغط Ctrl + Enter

الناتج

  • absolute بلا أب relative: العنصر يقيس من الصفحة كلها ويظهر في مكان غير متوقع.
  • z-index لا تعمل: العنصر static. أضف له position: relative.
  • sticky لا يلتصق: نسيت top، أو أن أحد آبائه له overflow: hidden.
  • ترتيب الصفحة كلها بـ absolute: الصفحة تنكسر مع أول تغيير في حجم الشاشة. الترتيب العام وظيفة Flexbox و Grid، و position للحالات الخاصة.

سؤال

عنصر له position: absolute. نسبةً إلى ماذا يتحدد مكانه؟

سؤال

أي قيمة تجعل الشريط العلوي يتحرك مع الصفحة ثم يثبت عند وصوله أعلى الشاشة؟

  • static هي القيمة الافتراضية، والعنصر فيها لا يتحرك.
  • relative تحرّك العنصر من مكانه الأصلي، وتجعله مرجعاً لأبنائه.
  • absolute تُخرج العنصر من الانسياب وتضعه نسبةً إلى أقرب أب له position.
  • fixed تثبته على الشاشة، و sticky تلصقه عند الوصول.
  • z-index ترتب الطبقات، والرقم الأكبر فوق.