من أكثر الأمور التي تُربك المبتدئين في CSS أن العنصر لا يظهر دائمًا في المكان الذي يتوقعونه. أحيانًا تحاول تحريكه إلى الأعلى أو اليمين، فلا يحدث شيء. وأحيانًا يتحرك، لكنه يكسر التخطيط بالكامل. السبب في أغلب هذه الحالات لا يكون خطأ في القيم، بل في عدم فهم خاصية position نفسها.
خاصية position ليست مجرد أداة لتحريك عنصر من مكان إلى آخر، بل هي طريقة لإخبار المتصفح كيف يجب أن يتعامل مع هذا العنصر داخل الصفحة. هل يبقى في مكانه الطبيعي؟ هل يتحرك بالنسبة لموضعه الأصلي؟ أم يخرج من التدفق الطبيعي تمامًا؟
كثير من المطورين الجدد يلجؤون مباشرة إلى position: absolute أو fixed عندما لا يحصلون على النتيجة التي يريدونها، ثم يجدون أنفسهم أمام مشاكل أكبر. لهذا السبب، فهم position من البداية يوفر عليك وقتًا وجهدًا كبيرين لاحقًا.
في هذا المقال، سنشرح ترتيب العناصر في CSS خطوة بخطوة وبأسلوب بسيط جدًا. سنتعرف على جميع قيم position، ومتى نستخدم كل واحدة، ولماذا لا تعمل بعض الخصائص أحيانًا. الهدف هو أن تفهم الفكرة، لا أن تحفظ القيم.
الفكرة العامة لـ position
قبل أن نتحدث عن أنواع position المختلفة، من المهم أن نفهم كيف يضع المتصفح العناصر بشكل افتراضي. المتصفح يتبع ما يُسمّى “التدفق الطبيعي”، حيث تُعرض العناصر بالترتيب الذي تظهر به في HTML، من الأعلى إلى الأسفل، ومن اليسار إلى اليمين.
في هذا التدفق الطبيعي، كل عنصر يأخذ مكانه ويؤثر على العناصر التي تليه. إذا أضفت عنصرًا جديدًا، فإن بقية العناصر تتحرك تلقائيًا لإفساح المجال له. هذا السلوك هو الأساس الذي يُبنى عليه التخطيط في CSS.
خاصية position تسمح لك بكسر هذا السلوك أو تعديله عند الحاجة. بدل أن تترك المتصفح يحدد مكان العنصر بالكامل، يمكنك التدخل وتحديد كيفية تموضعه. لكن هذا التدخل يجب أن يكون واعيًا، لأن كسر التدفق الطبيعي دون سبب واضح قد يؤدي إلى تخطيط فوضوي.
الفكرة الأساسية هي أن position لا تحرّك العنصر بذاتها، بل تغيّر طريقة حساب مكانه. التحريك الفعلي يحدث باستخدام خصائص مثل top و left و right و bottom، وهذه الخصائص لا تعمل إلا إذا كانت position مهيأة بشكل صحيح.
عندما تفهم أن التدفق الطبيعي هو الحالة الافتراضية، ستدرك لماذا لا تحتاج دائمًا إلى position. في كثير من الحالات، يمكن حل المشكلة باستخدام Flexbox أو Grid بدل كسر التخطيط باستخدام position.
في الفصل القادم، سنبدأ بالقيمة الافتراضية لـ position، وهي static، ونشرح لماذا لا تستجيب للتحريك، ومتى يكون ترك العنصر static هو القرار الصحيح.

position: static
القيمة static هي القيمة الافتراضية لكل عنصر في CSS. أي عنصر لم تُحدّد له خاصية position صراحةً يكون في حالة static تلقائيًا. في هذه الحالة، العنصر يخضع بالكامل للتدفق الطبيعي للصفحة ولا يمكن تحريكه يدويًا.
أكثر ما يربك المبتدئين هو محاولة استخدام خصائص مثل top أو left مع عنصر static، ثم الاستغراب من عدم حدوث أي تغيير. هذا السلوك طبيعي تمامًا، لأن العناصر ذات position: static لا تستجيب لخصائص التحريك.
الهدف من static ليس إعطاء تحكم، بل ترك المتصفح يتولى مهمة الترتيب. في كثير من الأحيان، هذا هو الخيار الأفضل. العناصر التي لا تحتاج إلى تحريك خاص أو تداخل مع عناصر أخرى يجب أن تبقى في هذا الوضع.
من الأخطاء الشائعة محاولة إجبار عنصر static على التحرك بدل التفكير في الحل الأنسب. إذا كنت تحتاج فقط إلى محاذاة أو توزيع، فغالبًا Flexbox أو Grid هما الحل الصحيح، وليس position.
لا يعني static أنه خيار ضعيف، بل يعني أنه الخيار الطبيعي. التصميم الجيد يبدأ دائمًا من التدفق الطبيعي، ثم يتم كسره فقط عند الضرورة.
في الفصل القادم، سننتقل إلى أول قيمة تسمح بالتحريك دون كسر التدفق، وهي position: relative، ونشرح لماذا تُعد من أهم القيم في CSS.

position: relative
قيمة relative هي أول خطوة حقيقية نحو التحكم في موضع العناصر. عند استخدام position: relative، يبقى العنصر في مكانه داخل التدفق الطبيعي، لكنه يصبح قابلًا للتحريك باستخدام خصائص مثل top و left.
الفكرة المهمة هنا هي أن العنصر يتحرك نسبةً إلى موضعه الأصلي، وليس بالنسبة للصفحة أو لأي عنصر آخر. أي أن المتصفح يحتفظ بالمكان الأصلي للعنصر كما هو، ثم يقوم بإزاحة العنصر بصريًا فقط.
هذا السلوك يجعل relative آمنًا جدًا في الاستخدام. لأن العنصر لا يخرج من التدفق الطبيعي، فإنه لا يؤثر على ترتيب بقية العناصر. لهذا السبب، تُستخدم position: relative كثيرًا حتى عندما لا يكون الهدف تحريك العنصر نفسه.
أحد أهم استخدامات relative هو جعله مرجعًا لعناصر أخرى. عندما تضع عنصرًا أبًا بقيمة relative، فإن أي عنصر ابن بقيمة absolute سيأخذ هذا الأب كنقطة مرجعية للتحريك، وهو ما سنشرحه بالتفصيل في الفصل القادم.
المثال التالي يوضح تحريك عنصر باستخدام relative، والكود معروض كنص تعليمي فقط:
<!--
.box {
position: relative;
top: 10px;
left: 20px;
}
-->
في هذا المثال، العنصر يتحرك قليلًا للأسفل وإلى اليمين، لكن مكانه الأصلي ما زال محفوظًا في التخطيط. هذه الخاصية مفيدة جدًا لإجراء تعديلات بسيطة دون كسر التصميم.
في الفصل القادم، سننتقل إلى position: absolute، وهي القيمة التي تخرج العنصر من التدفق الطبيعي، وتُستخدم بحذر لأنها قوية جدًا.

position: absolute
قيمة absolute هي الأكثر استخدامًا والأكثر إساءةً للاستخدام في نفس الوقت. عند تطبيق position: absolute على عنصر ما، فإنه يخرج بالكامل من التدفق الطبيعي للصفحة. هذا يعني أن المتصفح يتصرف وكأن هذا العنصر لم يعد موجودًا، ولا يحجز له أي مساحة.
العنصر المطلق لا يتحرك عشوائيًا، بل يتموضع نسبةً إلى أقرب عنصر أب له قيمة position غير static. إذا لم يجد مثل هذا العنصر، فإنه يتموضع بالنسبة لصفحة المتصفح نفسها. لهذا السبب، غالبًا ما نضع position: relative على العنصر الأب قبل استخدام absolute على الابن.
هذا السلوك يجعل absolute قويًا جدًا، لكنه أيضًا خطير إذا استُخدم دون فهم. عنصر واحد بقيمة absolute قد يتداخل مع عناصر أخرى أو يخرج عن التصميم تمامًا إذا لم يتم ضبط موضعه بدقة.
position: absolute يُستخدم عادةً في الحالات التي تحتاج فيها إلى عناصر تطفو فوق غيرها، مثل الأيقونات داخل الحقول، القوائم المنسدلة، أو الشارات الصغيرة فوق الصور. في هذه الحالات، الخروج من التدفق يكون مقصودًا ومفيدًا.
المثال التالي يوضح العلاقة بين relative و absolute، والكود معروض كنص تعليمي فقط:
<!--
.parent {
position: relative;
}
.child {
position: absolute;
top: 10px;
right: 10px;
}
-->
في هذا المثال، العنصر الابن يتموضع داخل حدود العنصر الأب، لأن الأب هو المرجع. بدون position: relative على الأب، كان الابن سيتموضع بالنسبة للصفحة كلها، وهو سلوك غير مرغوب غالبًا.
القاعدة الذهبية هي: لا تستخدم absolute إلا عندما تكون متأكدًا أنك تريد إخراج العنصر من التدفق. في الفصل القادم، سننتقل إلى position: fixed، ونتعرف على الفرق بينه وبين absolute، ومتى يكون كل منهما مناسبًا.

position: fixed
قيمة fixed تشبه absolute من حيث خروج العنصر من التدفق الطبيعي، لكنها تختلف عنه في نقطة مهمة جدًا: العنصر يتموضع دائمًا بالنسبة لنافذة المتصفح نفسها، وليس بالنسبة لأي عنصر أب. هذا يعني أن مكانه يبقى ثابتًا حتى عند تمرير الصفحة للأعلى أو الأسفل.
عند استخدام position: fixed، يصبح العنصر مستقلًا تمامًا عن بقية التخطيط. المتصفح لا يحجز له مساحة، والعناصر الأخرى تتصرف وكأنه غير موجود. لهذا السبب، يجب استخدامه بحذر حتى لا يغطي محتوى مهم أو يسبب إزعاجًا للمستخدم.
من أشهر استخدامات fixed تثبيت شريط علوي، زر العودة إلى الأعلى، أو أي عنصر يجب أن يبقى ظاهرًا للمستخدم طوال الوقت. هذه الاستخدامات تكون مفيدة جدًا عندما تخدم تجربة المستخدم بوضوح.
لكن في المقابل، الإفراط في استخدام fixed قد يضر بالتجربة، خصوصًا على الشاشات الصغيرة. عنصر ثابت كبير قد يغطي جزءًا مهمًا من المحتوى أو يجعل التفاعل مع الصفحة أقل راحة.
المثال التالي يوضح استخدام position: fixed، والكود معروض كنص تعليمي فقط:
<!--
.header {
position: fixed;
top: 0;
left: 0;
width: 100%;
}
-->
في هذا المثال، يبقى الشريط العلوي مثبتًا في أعلى الشاشة مهما تم تمرير الصفحة. هذا السلوك شائع جدًا، لكنه يتطلب الانتباه لإضافة مسافة للمحتوى أسفله حتى لا يتم تغطيته.
في الفصل القادم، سنتعرف على position: sticky، وهي قيمة تجمع بين سلوك relative و fixed بطريقة ذكية وسهلة الاستخدام.

position: sticky
قيمة sticky هي من أكثر قيم position إثارة للاهتمام، لأنها تجمع بين سلوك relative و fixed في نفس الوقت. في البداية، يتصرف العنصر وكأنه position: relative، لكن عند الوصول إلى نقطة معينة أثناء التمرير، يتحول سلوكه تلقائيًا إلى fixed.
بمعنى أبسط، العنصر “يلتصق” بمكان معيّن عندما يمر المستخدم عليه أثناء التمرير. قبل الوصول إلى هذه النقطة، يبقى العنصر داخل التدفق الطبيعي، وبعدها يصبح ثابتًا في موضع محدد داخل الحاوية التي ينتمي إليها.
من المهم أن تعرف أن sticky لا يعمل في كل الحالات تلقائيًا. يجب تحديد قيمة واحدة على الأقل من top أو bottom أو left أو right حتى يعرف المتصفح متى يبدأ الالتصاق. بدون هذه القيم، سيبقى العنصر يتصرف كأنه relative فقط.
كذلك، يعمل sticky ضمن حدود العنصر الأب. أي أنه سيلتصق فقط داخل مساحة الحاوية، وليس عبر الصفحة كاملة مثل fixed. هذا السلوك يجعله مثاليًا للعناوين داخل الأقسام أو القوائم الجانبية.
المثال التالي يوضح استخدام position: sticky، والكود معروض كنص تعليمي فقط:
<!--
.title {
position: sticky;
top: 0;
background: #ffffff;
}
-->
في هذا المثال، العنوان يبقى في مكانه الطبيعي، لكن عندما يصل إلى أعلى الشاشة أثناء التمرير، يلتصق هناك حتى ينتهي القسم الذي ينتمي إليه. هذا يعطي تجربة قراءة ممتازة دون الحاجة إلى عناصر ثابتة مزعجة.
في الفصل القادم، سننتقل إلى خصائص التحريك نفسها، ونتعرف على كيفية عمل top و right و bottom و left، ولماذا لا تعمل أحيانًا.

خصائص التحريك (top, right, bottom, left)
خصائص التحريك هي الأدوات التي نستخدمها فعليًا لتحريك العناصر بعد تحديد قيمة position المناسبة. هذه الخصائص هي: top و right و bottom و left، وهي لا تعمل إلا إذا كان للعنصر قيمة position غير static. هذه النقطة وحدها تفسّر الكثير من حالات “لماذا لا يتحرك العنصر؟”.
كل خاصية من هذه الخصائص تحدد مقدار الإزاحة من جهة معيّنة. مثلًا، top يحدد المسافة من الأعلى، و left يحدد المسافة من اليسار. المتصفح يستخدم هذه القيم ليزيح العنصر عن نقطة مرجعية تعتمد على نوع position المستخدم.
مع position: relative، يتم التحريك نسبةً إلى موضع العنصر الأصلي. أما مع position: absolute أو fixed، فيتم التحريك نسبةً إلى العنصر المرجعي أو نافذة المتصفح. فهم هذا الفرق يمنع كثيرًا من الارتباك عند العمل على التخطيطات.
من المهم أيضًا أن تعرف أن استخدام قيم سالبة مسموح به. القيم السالبة تحرّك العنصر في الاتجاه المعاكس، وهي مفيدة أحيانًا لإجراء تعديلات دقيقة، لكن الإفراط فيها قد يؤدي إلى تصاميم غير متوقعة.
المثال التالي يوضح استخدام خصائص التحريك مع position، والكود معروض كنص تعليمي فقط:
<!--
.box {
position: relative;
top: 20px;
left: -10px;
}
-->
في هذا المثال، العنصر يتحرك إلى الأسفل بمقدار 20 بكسل، وإلى اليسار بمقدار 10 بكسل. رغم ذلك، يبقى مكانه الأصلي محفوظًا في التخطيط لأنه يستخدم position: relative.
إذا وجدت أن خصائص التحريك لا تعمل، فراجع أولًا قيمة position، ثم تأكد من وجود عنصر مرجعي مناسب عند استخدام absolute. في الفصل القادم، سننتقل إلى ترتيب الطبقات باستخدام z-index، ونشرح لماذا لا يعمل أحيانًا رغم كتابته بشكل صحيح.

ترتيب الطبقات (z-index)
عند استخدام position وتحريك العناصر، قد تجد عناصر تتداخل مع بعضها. في هذه الحالة، لا يكون السؤال هو “أين يقع العنصر؟” بل “أي عنصر يظهر فوق الآخر؟”. هنا يأتي دور خاصية z-index، التي تتحكم في ترتيب العناصر على المحور الثالث، أي العمق.
z-index يعمل فقط مع العناصر التي لها قيمة position غير static. إذا حاولت استخدام z-index على عنصر static، فلن ترى أي تأثير، وهو خطأ شائع جدًا عند المبتدئين. المتصفح يحتاج أولًا إلى معرفة أن العنصر قابل للتموضع قبل أن يسمح له بالدخول في ترتيب الطبقات.
كلما كانت قيمة z-index أكبر، ظهر العنصر فوق العناصر ذات القيم الأصغر. القيم لا تحتاج أن تكون متسلسلة أو كبيرة جدًا، المهم هو العلاقة بينها. عنصر بقيمة 10 سيظهر فوق عنصر بقيمة 1، بغض النظر عن الأرقام المطلقة.
من الأمور التي تُربك الكثيرين أن z-index يتأثر بالسياق الأبوي. أحيانًا يكون للعنصر z-index مرتفع، لكنه لا يظهر فوق عنصر آخر لأن كليهما ينتميان إلى سياقين مختلفين. لهذا السبب، فهم بنية العناصر مهم بقدر فهم قيمة z-index نفسها.
المثال التالي يوضح استخدام z-index مع position، والكود معروض كنص تعليمي فقط:
<!--
.box-one {
position: relative;
z-index: 1;
}
.box-two {
position: relative;
z-index: 2;
}
-->
في هذا المثال، العنصر الثاني سيظهر فوق العنصر الأول لأنه يملك قيمة z-index أعلى. هذا التحكم ضروري عند بناء نوافذ منبثقة، قوائم، أو عناصر تطفو فوق المحتوى.
في الفصل القادم، سنناقش استخدام position ضمن التصميم المتجاوب، ومتى يكون خيارًا جيدًا، ومتى يجب تجنّبه.

position مع التصميم المتجاوب
عند العمل على تصميم متجاوب، يجب التعامل مع position بحذر أكبر. ما يبدو مضبوطًا على شاشة الحاسوب قد يتحول إلى مشكلة حقيقية على شاشة الهاتف. السبب أن التحريك اليدوي لا يتكيّف دائمًا مع تغيّر المساحات والأبعاد.
استخدام position: absolute أو fixed بكثرة في التصميم المتجاوب قد يؤدي إلى عناصر تغطي محتوى مهم أو تخرج عن الشاشة. لهذا السبب، يُفضَّل دائمًا البدء بالحلول الطبيعية مثل التدفق العادي، ثم Flexbox أو Grid، وعدم اللجوء إلى position إلا عند الحاجة الفعلية.
position: fixed تحديدًا يحتاج إلى عناية خاصة في الشاشات الصغيرة. عنصر ثابت كبير قد يشغل جزءًا مهمًا من الشاشة ويقلل من مساحة المحتوى. في هذه الحالات، يمكن إخفاء العنصر أو تغيير سلوكه باستخدام media queries.
أما position: sticky، فيُعد خيارًا أكثر لطفًا مع التصميم المتجاوب، لأنه يلتزم بحدود الحاوية ويتوقف عن الالتصاق عند انتهائها. لهذا السبب، يُستخدم كثيرًا في العناوين أو القوائم داخل الأقسام الطويلة.
المثال التالي يوضح تعديل سلوك position حسب حجم الشاشة، والكود معروض كنص تعليمي فقط:
<!--
.menu {
position: fixed;
top: 0;
}
@media (max-width: 768px) {
.menu {
position: static;
}
}
-->
في هذا المثال، القائمة تكون ثابتة على الشاشات الكبيرة، لكنها تعود إلى التدفق الطبيعي على الشاشات الصغيرة، ما يحسّن تجربة الاستخدام.
القاعدة العامة هي: كلما كان التخطيط مرنًا أكثر، قلّت حاجتك إلى position. في الفصل القادم، سنستعرض الأخطاء الشائعة التي يقع فيها المبتدئون عند استخدام position، وكيف يمكن تجنبها بسهولة.

أخطاء شائعة عند استخدام position
رغم أن خاصية position تبدو بسيطة في ظاهرها، إلا أن الأخطاء المرتبطة بها كثيرة، خاصة عند المبتدئين. هذه الأخطاء لا تكون دائمًا واضحة فورًا، لكنها تظهر لاحقًا على شكل تخطيطات مكسورة أو سلوك غير متوقع للعناصر.
أحد أكثر الأخطاء شيوعًا هو الاعتماد المفرط على position: absolute لحل كل مشكلة في التخطيط. صحيح أن absolute يعطيك تحكمًا سريعًا، لكنه يخرج العنصر من التدفق الطبيعي، ما يؤدي غالبًا إلى تداخل العناصر أو صعوبة تعديل التصميم لاحقًا.
خطأ آخر هو نسيان تحديد عنصر أب مرجعي عند استخدام position: absolute. بدون position: relative (أو قيمة أخرى غير static) على العنصر الأب، سيتموضع العنصر بالنسبة للصفحة كاملة، وهو ما يسبب ارتباكًا كبيرًا عند التعديل أو عند تغيير حجم الشاشة.
كذلك، محاولة تحريك عناصر position: static باستخدام top أو left من أكثر الأخطاء انتشارًا. في هذه الحالة، لا يحدث أي تغيير، ويبدأ المطور في تجربة قيم عشوائية بدل مراجعة الأساسيات.
من الأخطاء أيضًا استخدام z-index دون فهم سياق التكديس. رفع القيمة بشكل مبالغ فيه لا يحل المشكلة دائمًا، وقد يخفي السبب الحقيقي الذي يمنع العنصر من الظهور فوق غيره.
تجنب هذه الأخطاء يبدأ بالعودة دائمًا إلى الفكرة الأساسية: استخدم position فقط عندما تحتاج فعليًا إلى كسر التدفق الطبيعي، وفكّر أولًا في الحلول الأبسط قبل اللجوء إليه. في الفصل القادم، سنختم المقال بأفضل الممارسات التي تساعدك على استخدام position بثقة واحتراف.
أفضل الممارسات للمبتدئين في استخدام position
أفضل طريقة لاستخدام position باحتراف هي عدم التسرّع في استعماله. كثير من مشاكل التخطيط يمكن حلها دون كسر التدفق الطبيعي، وذلك باستخدام Flexbox أو Grid. اجعل position خيارك الأخير، لا الأول.
ابدأ دائمًا من التدفق الطبيعي للصفحة. إذا كان العنصر يظهر في مكان منطقي دون position، فهذا يعني أنك على الطريق الصحيح. أضف position فقط عندما تحتاج إلى تداخل، تثبيت، أو تحريك خاص لا يمكن تحقيقه بطرق أخرى.
عند استخدام position: absolute، احرص دائمًا على تحديد عنصر أب مرجعي باستخدام position: relative. هذه القاعدة البسيطة تمنع الكثير من الأخطاء وتجعل الكود أسهل فهمًا وصيانة.
تجنب القيم الكبيرة والعشوائية في top و left لمحاولة “ضبط” العنصر. إذا وجدت نفسك تفعل ذلك، فغالبًا المشكلة في بنية التخطيط نفسها، لا في القيم.
استخدم position: fixed و sticky بحذر، وفكّر دائمًا في تجربة المستخدم، خاصة على الشاشات الصغيرة. عنصر ثابت قد يكون مفيدًا، لكنه قد يصبح مزعجًا إذا استُخدم دون سبب واضح.
وأخيرًا، جرّب دائمًا التخطيط على أحجام شاشات مختلفة. position قد يبدو مثاليًا في حالة واحدة، لكنه قد ينكسر في حالات أخرى. المراجعة المستمرة هي ما يصنع الفرق بين كود يعمل وكود متين.
الخاتمة: position أداة قوية… عندما تُستخدم بوعي
خاصية position في CSS ليست معقدة بحد ذاتها، لكن سوء فهمها هو ما يجعلها مصدر إرباك للكثيرين. عندما تدرك أن position تتحكم في طريقة تموضع العنصر داخل الصفحة، لا في تحريكه فقط، تصبح قراراتك أوضح وأكثر منطقية.
خلال هذا المقال، تعرّفنا على جميع قيم position، من static إلى sticky، وفهمنا متى نستخدم كل واحدة، وكيف تتفاعل مع خصائص التحريك و z-index، ولماذا قد تنجح في حالة وتفشل في أخرى. هذا الفهم يمنحك قدرة حقيقية على التحكم في التخطيط دون كسر التصميم.
تذكّر دائمًا أن التدفق الطبيعي هو الأساس، وأن كسر هذا التدفق يجب أن يكون قرارًا واعيًا، لا حلًا سريعًا. كلما استخدمت position في المكان الصحيح، قلّت المشاكل وزادت قابلية الصيانة في مشروعك.
في النهاية، position ليست عدوًّا للمبتدئ، بل أداة قوية تحتاج فقط إلى فهم هادئ وتجربة واعية. ومع الممارسة، ستجد نفسك تستخدمها بثقة، وتعرف متى تكون الحل الأمثل، ومتى يكون الابتعاد عنها هو الخيار الأذكى.
ديناس منصة تعليمية عربية