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

خاصية position في CSS: absolute وrelative وfixed وsticky

تضع position: absolute العنصر عند إحداثيات دقيقة داخل أقرب سلف مُموضَع. تعلّم كيف تعمل absolute مع position: relative، ثم fixed وsticky، وخصائص top/right/bottom/left وinset، ولماذا لا يلتصق sticky أحيانًا.

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

position: absolute في مثال واحد

العنصر ذو الموضع المطلق يُرفع من التدفق العادي ويوضع عبر top وright وbottom وleft. تُقاس هذه الإزاحات من أقرب سلف له position غير static، ولهذا يأخذ الأب position: relative:

احذف position: relative من .card وستقفز الشارة إلى أعلى يمين الصفحة كلها، لأنه لم يعد لها سلف مُموضَع. هذا السطر الواحد يفسر معظم أسئلة «position absolute لا تعمل».

أمور يجب معرفتها عن العناصر المطلقة:

  • لا تشغل مساحة. يُرتَّب العنوان والفقرة كأن الشارة غير موجودة.
  • يتقلص عرضها ليناسب محتواها، ما لم تضبط width أو left وright معًا.
  • تُقاس الإزاحات حتى حافة الحشو للكتلة الحاوية، داخل حدها.

قيم position الخمس

القيمةفي التدفق؟الإزاحات تُقاس منالاستخدام المعتاد
static (الافتراضي)نعمالإزاحات تُتجاهلالعناصر العادية
relativeنعم، وتُحفظ مساحتهموضعه العادي نفسهمرجع للأبناء المطلقين، وإزاحات صغيرة
absoluteلاأقرب سلف مُموضَع (أو الصفحة)الشارات، والتلميحات، والطبقات، وأزرار الإغلاق
fixedلانافذة العرضالترويسات، وأزرار المحادثة، وأشرطة ملفات تعريف الارتباط
stickyنعمحاوية التمرير، بعد أن يصل إلى الإزاحةترويسات الجداول، وعناوين الأقسام، والأشرطة الجانبية

position: relative

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

يُرسم الصندوق 2 أسفل بمقدار 20px وإلى اليمين بمقدار 20px، فيغطي جزءًا من الصندوق 3، لكن الصندوق 3 لم يتحرك: ما زال يترك مكانًا للصندوق 2 في موضعه الأصلي. نادرًا ما تُستخدم relative وحدها لتحريك الأشياء؛ وظيفتها الأساسية أن تكون الصندوق المرجعي للأبناء المطلقين.

الإزاحات وinset

تقبل top وright وbottom وleft أطوالًا ونسبًا مئوية (من الكتلة الحاوية) وauto. والاختصار inset يضبط الأربعة بترتيب margin نفسه:

.overlay {
  position: absolute;
  inset: 0;              /* top: 0; right: 0; bottom: 0; left: 0; */
}
.corner {
  position: absolute;
  inset: auto 16px 16px auto;  /* bottom right corner, 16px in */
}

ضبط جانبين متقابلين يمطّ العنصر: left: 0; right: 0 تجعله بعرض الكتلة الحاوية. وinset: 0 على ابن مطلق هي الطريقة المعتادة لتغطية بطاقة بطبقة.

التوسيط بـ absolute وtransform

تضع top: 50%; left: 50% الزاوية العلوية اليسرى للعنصر في المركز. ثم يعيده translate(-50%, -50%) بمقدار نصف حجمه:

يوسّط flexbox وgrid بطريقة أبسط حين يمكن أن يبقى العنصر في التدفق؛ وتقارن صفحة توسيط div كل الطرق.

position: fixed

العنصر الثابت يوضع نسبةً إلى نافذة العرض ويبقى هناك أثناء تمرير الصفحة:

.chat-button {
  position: fixed;
  bottom: 16px;
  right: 16px;
}

مفاجأتان. العنصر الثابت لا يشغل مساحة، فالترويسة الثابتة تغطي أعلى الصفحة ما لم تضف padding-top إلى body. وإن كان لأي سلف transform أو filter أو perspective، يصبح ذلك السلف الصندوق المرجعي بدل نافذة العرض، فيتمرر العنصر معه.

position: sticky

العنصر اللاصق يتمرر بشكل عادي حتى يصل إلى إزاحته، ثم يلتصق هناك حتى تمر نهاية أبيه. مرّر الصندوق أدناه:

يلتصق كل حرف بأعلى صندوق التمرير ما دام قسمه ظاهرًا، ثم يدفعه الحرف التالي بعيدًا، لأن العنصر اللاصق لا يغادر أباه أبدًا.

حين لا يلتصق sticky، افحص هذه:

  • لا إزاحة. لا تفعل position: sticky شيئًا من دون top أو bottom أو left أو right.
  • سلف عليه overflow: hidden أو auto أو scroll. يصبح حاوية التمرير، وإن لم يكن يتمرر فعلًا لا يلتصق شيء. استخدم overflow: clip إن كنت تحتاج فقط إلى إخفاء الفائض.
  • أب ليس أطول من العنصر اللاصق. لا يبقى مجال للالتصاق داخله.
  • أب flex أو grid يمطّه. في صف flex، أضف align-self: flex-start إلى الشريط الجانبي اللاصق.

أخطاء شائعة

  • نسيان position: relative على أب العنصر المطلق.
  • استخدام absolute لتخطيط الصفحة. العناصر المطلقة تتجاهل بعضها وتتجاهل المحتوى، فيتداخل النص على الشاشات الأصغر. استخدم flexbox أو grid للتخطيط، وabsolute للزخارف الصغيرة.
  • إزاحات على عنصر static. لا تفعل top: 10px شيئًا من دون position.
  • الصراع على أي عنصر في الأعلى. العناصر المُموضَعة المتداخلة ترتبها z-index.
  • ترويسة ثابتة تخفي المحتوى. أضف حشوًا إلى الصفحة، أو scroll-padding-top كي تصل روابط المراسي إلى ما تحتها.

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

ماذا تفعل position: absolute؟

تخرج العنصر من التدفق العادي (تتصرف العناصر الأخرى كأنه غير موجود) وتضعه عبر top وright وbottom وleft، مقيسة من كتلته الحاوية: أقرب سلف قيمة position فيه ليست static.

كيف أضع عنصرًا بموضع مطلق بالنسبة إلى أبيه؟

أعطِ الأب position: relative; والابن position: absolute; مع إزاحات مثل top: 0; right: 0;. من دون أب مُموضَع يوضع الابن نسبةً إلى الصفحة.

ما الفرق بين الموضع relative والموضع absolute؟

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

لماذا لا تعمل position: sticky؟

غالبًا لأحد ثلاثة أسباب: لم تُضبط top (أو إزاحة أخرى)، أو لسلف ما overflow: hidden أو auto فيصبح حاوية التمرير، أو أب العنصر اللاصق ليس أطول منه، فلا يبقى مجال للالتصاق.

ما الفرق بين fixed وsticky؟

يخرج fixed من التدفق ويُثبَّت على نافذة العرض (ما لم يكن لأحد الأسلاف transform أو filter). أما sticky فيبقى في التدفق ويتمرر بشكل عادي حتى يصل إلى إزاحته، ثم يلتصق ما دام أبوه ظاهرًا على الشاشة.

Coddy programming languages illustration

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

ابدأ الآن