في بناء صفحات الويب، يعتبر التحكم في أماكن ظهور العناصر على الشاشة مهارة أساسية لا غنى عنها. حتى هذه المرحلة، تعرفت على كيفية تنسيق الألوان، وتعديل المسافات باستخدام الهوامش والحشوات، وتوزيع العناصر بجانب بعضها أو أسفلها باستخدام التدفق الطبيعي للصفحة. لكن ماذا لو احتجت إلى إخراج عنصر من هذا التدفق الطبيعي، أو وضعه فوق عنصر آخر، أو تثبيته في زاوية الشاشة أثناء التمرير؟ هنا يأتي دور خاصية التموضع الأساسي (Positioning) في لغة CSS.
في هذا الدرس، ستتعلم كيف تتحكم بدقة في مواقع العناصر عبر فهم القيم المختلفة لخاصية التموضع، وكيف تؤثر هذه القيم على سلوك العناصر داخل المتصفح، مما يتيح لك بناء تصاميم أكثر مرونة ودقة.
مفهوم التدفق الطبيعي للعناصر (Normal Flow)
قبل الغوص في تفاصيل التموضع، من الضروري أن تفهم كيف يتعامل المتصفح افتراضياً مع العناصر في لغة HTML. يُعرف هذا السلوك بـ "التدفق الطبيعي" (Normal Flow). في هذا التدفق، ترتّب المتصفحات العناصر الكتلة (Block-level elements) فوق بعضها البعض بشكل عمودي، بينما تترتب العناصر المضمنة (Inline elements) بجانب بعضها أفقياً حسب مساحة السطر.
عندما تبدأ باستخدام خاصية التموضع، فإنك تبدأ في تعديل هذا السلوك الافتراضي. تعتمد خاصية التموضع بشكل أساسي على خاصية position بالتعاون مع أربع خصائص مساعدة لتحديد الإحداثيات، وهي: top، right، bottom، و left.
القيمة الافتراضية: التموضع الثابت (Static Positioning)
القيمة الافتراضية لأي عنصر في لغة CSS هي position: static. هذا يعني أن العنصر يقع تماماً داخل التدفق الطبيعي للصفحة ولا يخضع لأي تعديل في مكانه بناءً على خصائص الإحداثيات.
إذا قمت بكتابة خصائص مثل top: 20px أو left: 50px على عنصر يحمل القيمة static، فلن يحدث أي تغيير على الإطلاق، وسيتجاهلها المتصفح تماماً. هذه القيمة لا تحتاج إلى كتابتها عادةً لأنها مُطبقة بشكل افتراضي على جميع العناصر.
التموضع النسبي (Relative Positioning)
عندما تقوم بتغيير قيمة خاصية التموضع إلى position: relative، فإن العنصر يظل في مكانه الأصلي داخل التدفق الطبيعي للصفحة، ولن يتأثر العناصر المحيطة به. ولكن، تتيح لك هذه القيمة إزاحة العنصر من مكانه الأصلي باستخدام خصائص الإحداثيات (top، right، bottom، left).
الفكرة الأساسية هنا أن الإزاحة تحدث "بالنسبة لمكان العنصر الأصلي". فإذا أزحت عنصراً بمقدار 20 بكسل للأعلى، فسيرتفع عن مكانه الأصلي، لكن الفراغ الذي كان يشغله في التدفق الطبيعي سيبقى كما هو، ولن تتحرك العناصر الأخرى لملئه.
التموضع المطلق (Absolute Positioning)
تختلف القيمة position: absolute جذرياً عن القيم السابقة. عندما تجعل العنصر مطلق التموضع، فإنه يُخرج تماماً من التدفق الطبيعي للصفحة. هذا يعني أن العناصر الأخرى تتجاهل وجوده تماماً وكأنّه غير موجود، مما قد يتسبب في تراكب العناصر فوق بعضها إذا لم تقم بإدارة المساحات بعناية.
يتم تحديد مكان العنصر مطلق التموضع بناءً على أول عنصر أب يمتلك خاصية تموضع غير القيمة الافتراضية (أي أب يحمل relative أو absolute أو fixed). وإذا لم يجد المتصفح أي أب متموضع في شجرة العناصر، فسيكون المرجع الأساسي له هو نافذة المتصفح نفسها (Viewport).
التموضع الثابت على الشاشة (Fixed Positioning)
تشبه القيمة position: fixed التموضع المطلق من حيث إخراج العنصر من التدفق الطبيعي للصفحة وعدم حجز مساحة له، لكنها تختلف في نقطة المرجع. العنصر الذي يمتلك خاصية التموضع الثابت يتموضع دائماً بالنسبة لنافذة المتصفح (Viewport)، بغض النظر عن أي عنصر أب.
الميزة الأبرز للتموضع الثابت هي أن العنصر يظل ثابتًا في مكانه على الشاشة حتى عندما يقوم المستخدم بالتمرير (Scrolling) لأعلى أو لأسفل. يُستخدم هذا النوع غالباً في قوائم التنقل العلوية (Navigation Bars) التي تبقى ظاهرة للمستخدم طوال فترة تصفحه للصفحة.
مثال عملي شامل
لنلقِ نظرة على مثال عملي يوضح الفرق السلوكي بين العناصر ذات التموضع النسبي والمطلق والثابت. سنقوم بإنشاء حاوية تحتوي على عدة صناديق بتنسيقات مختلفة.
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8">
<title>تعلم التموضع الأساسي</title>
<style>
body {
font-family: Arial, sans-serif;
height: 2000px; /* لتمكين التمرير */
margin: 0;
padding: 20px;
background-color: #f4f4f9;
}
.container {
position: relative; /* ليكون مرجعاً للعناصر المطلقة بداخله */
width: 100%;
max-width: 600px;
height: 400px;
background-color: #ffffff;
border: 2px solid #ccc;
margin-top: 50px;
}
.box {
width: 100px;
height: 100px;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
}
.box-1 {
background-color: #3498db;
position: relative;
top: 20px;
right: 20px;
}
.box-2 {
background-color: #e74c3c;
position: absolute;
top: 50px;
left: 50px;
}
.box-3 {
background-color: #2ecc71;
position: fixed;
bottom: 20px;
left: 20px;
}
</style>
<h2>فهم التموضع في CSS</h2>
<p>قم بالتمرير للأسفل لملاحظة سلوك العناصر المتموضعة.</p>
<div class="container">
<div class="box box-1">نسبي</div>
<div class="box box-2">مطلق</div>
</div>
<div class="box box-3">ثابت</div>