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 فيبقى في التدفق ويتمرر بشكل عادي حتى يصل إلى إزاحته، ثم يلتصق ما دام أبوه ظاهرًا على الشاشة.