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

ما هي خاصية position في CSS؟
تُستخدم الخاصية position لتحديد كيفية تموضع العنصر داخل المستند أو داخل العنصر الأب. وبفضلها يمكنك التحكم في سلوك العناصر، سواء أردتها أن تسير مع التدفق الطبيعي للصفحة أو أن تتحرك بحرية وفق إحداثيات محددة.
هناك خمسة أنواع أساسية من التموضع في CSS:
staticrelativeabsolutefixedsticky
لنستعرضها واحدة تلو الأخرى.
التموضع الثابت static في CSS
النوع static هو الوضع الافتراضي لأي عنصر في الصفحة. في هذا الوضع، يتحرك العنصر وفق التدفق الطبيعي للمستند، أي أن العناصر تظهر حسب ترتيبها في الشيفرة.

في المثال التالي، ستلاحظ أن جميع العناصر تظهر بحسب ترتيبها داخل المستند دون أي إزاحة إضافية:
/* Static Positioning */
.parent {
padding: 5px;
position: static;
background-color: #00AAFF;
width: 40%;
}
.child-one {
position: static;
background-color: rgb(116, 255, 116);
}
.child-two {
position: static;
background-color: rgb(248, 117, 117);
}
.child-three {
position: static;
background-color: rgb(255, 116, 232);
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS Position and Flexbox</title>
<link rel="stylesheet" href="./index.css">
</head>
<body>
<div class="parent">
Parent
<div class="child-one">One</div>
<div class="child-two">Two</div>
<div class="child-three">Three</div>
</div>
</body>
</html>
إذا كان العنصر الأول مكتوباً قبل الثاني والثالث، فسيظهر أولاً. هذا هو السلوك الطبيعي للصفحة عند عدم استخدام أي تموضع خاص.
التموضع النسبي relative في CSS
يعمل التموضع النسبي relative بشكل قريب جداً من static، لكن مع ميزة مهمة: يمكنك تحريك العنصر باستخدام الخصائص top وbottom وleft وright.
/* Relative Positioning */
.parent {
padding: 5px;
background-color: #00AAFF;
width: 40%;
}
.child-one {
position: relative;
background-color: rgb(116, 255, 116);
}
.child-two {
background-color: rgb(248, 117, 117);
}
.child-three {
background-color: rgb(255, 116, 232);
}

في هذا المثال لن ترى فرقاً بصرياً واضحاً، لأن العنصر لم يُزح بعد. لكن عند إضافة قيمة إلى top أو غيرها، يبدأ تأثير relative بالظهور:
/* Relative Positioning with Top, Bottom, Left and Right */
.parent {
padding: 5px;
background-color: #00AAFF;
width: 40%;
}
.child-one {
position: relative;
top: 10px;
background-color: rgb(116, 255, 116);
}
.child-two {
background-color: rgb(248, 117, 117);
}
.child-three {
background-color: rgb(255, 116, 232);
}
هنا تم دفع العنصر child-one للأسفل بمقدار 10px باستخدام top.

النتيجة أن العنصر قد يتداخل مع العناصر التالية له، لأن موضعه المرئي تغير بينما ما يزال يحتفظ بمساحته الأصلية في التخطيط. هذه نقطة مهمة يجب فهمها عند استخدام relative.
متى يُستخدم relative؟
- عندما تحتاج إلى إزاحة عنصر قليلاً عن موضعه الأصلي.
- عندما تريد جعل العنصر الأب مرجعاً لعنصر داخلي يستخدم
absolute. - عند تنفيذ تعديلات دقيقة على الواجهة دون كسر التخطيط بالكامل.
التموضع المطلق absolute في CSS
التموضع absolute يُخرج العنصر بالكامل من التدفق الطبيعي للمستند. وهذا يعني أن العناصر الأخرى تتصرف وكأن هذا العنصر غير موجود.
عند استخدام absolute مع top أو left أو right أو bottom، يتم تحديد موضع العنصر نسبةً إلى أقرب عنصر أب يملك تموضعاً غير افتراضي، مثل relative أو absolute.
/* Absolute Positioning */
.parent {
padding: 5px;
background-color: #00AAFF;
width: 40%;
position: static;
}
.child-one {
position: absolute;
top: 0px;
background-color: rgb(116, 255, 116);
}
.child-two {
background-color: rgb(248, 117, 117);
}
.child-three {
background-color: rgb(255, 116, 232);
}

عندما يكون الأب على static، فإن العنصر المطلق التموضع قد يُحسب بالنسبة للمستند أو لأقرب حاوية مهيأة للتموضع.
إذا جعلنا العنصر الأب نفسه absolute:
/* Absolute Positioning */
.parent {
padding: 5px;
background-color: #00AAFF;
width: 40%;
position: absolute;
top: 0px;
}
.child-one {
position: absolute;
top: 0px;
background-color: rgb(116, 255, 116);
}
.child-two {
background-color: rgb(248, 117, 117);
}
.child-three {
background-color: rgb(255, 116, 232);
}

لكن الاستخدام الأكثر عملية يكون عندما يكون الأب relative والابن absolute:
/* Absolute Positioning */
.parent {
padding: 5px;
background-color: #00AAFF;
width: 40%;
position: relative;
top: 0px;
}
.child-one {
position: absolute;
top: 0px;
background-color: rgb(116, 255, 116);
}
.child-two {
background-color: rgb(248, 117, 117);
}
.child-three {
background-color: rgb(255, 116, 232);
}

في هذه الحالة، يصبح child-one متمركزاً بالنسبة إلى العنصر الأب وليس بالنسبة إلى الصفحة كلها. وهذا هو الاستخدام الشائع في النوافذ المنبثقة، والأيقونات داخل البطاقات، والشارات الصغيرة، والعناصر المركبة.
أهم فائدة عملية من absolute
إذا أردت تموضع عنصر داخل بطاقة أو حاوية محددة بدقة، فاجعل الحاوية position: relative والعنصر الداخلي position: absolute.
التموضع الثابت fixed في CSS
النوع fixed يتجاهل الحاوية الأب ويتعامل مباشرة مع نافذة العرض. العنصر هنا يظل ثابتاً في مكانه حتى عند تمرير الصفحة.
/* Fixed Positioning */
.parent {
padding: 5px;
background-color: #00AAFF;
width: 40%;
position: relative;
top: 0px;
height: 1000px;
}
.child-one {
position: fixed;
top: 0px;
background-color: rgb(116, 255, 116);
}
.child-two {
background-color: rgb(248, 117, 117);
}
.child-three {
background-color: rgb(255, 116, 232);
}

حتى لو كان الأب مضبوطاً على relative، فإن العنصر المثبت سيبقى مرتبطاً بإطار الصفحة. لهذا يُستخدم كثيراً في:
- الأزرار العائمة.
- أزرار العودة إلى الأعلى.
- الشريط الجانبي الثابت.
- تنبيهات الواجهة التي يجب أن تظل مرئية.
التموضع اللاصق sticky في CSS
يمكن اعتبار sticky مزيجاً بين relative وfixed. في البداية يتصرف العنصر بشكل طبيعي، ولكن عند الوصول إلى حد معين أثناء التمرير، يلتصق بمكان محدد مثل أعلى الصفحة.
/* Sticky Positioning */
.parent {
padding: 5px;
background-color: #00AAFF;
width: 40%;
position: relative;
top: 0px;
height: 1000px;
}
.child-one {
position: sticky;
top: 0px;
background-color: rgb(116, 255, 116);
}
.child-two {
background-color: rgb(248, 117, 117);
}
.child-three {
background-color: rgb(255, 116, 232);
}

من أبرز استخداماته:
- أشرطة التنقل.
- العناوين اللاصقة داخل الصفحات الطويلة.
- الفلاتر الجانبية في صفحات المتاجر.
ملخص سريع لأنواع CSS Position
| النوع | السلوك | أفضل استخدام |
|---|---|---|
static |
التدفق الطبيعي للصفحة | الوضع الافتراضي |
relative |
إزاحة العنصر من موضعه الأصلي | التحريك البسيط وجعل الأب مرجعاً |
absolute |
إخراج العنصر من التدفق وتحديد موضعه بدقة | العناصر الداخلية والطبقات المتداخلة |
fixed |
تثبيت العنصر بالنسبة للنافذة | الأزرار العائمة والقوائم الثابتة |
sticky |
يمتزج بين السلوك الطبيعي والثبات عند التمرير | الرؤوس وأشرطة التنقل |
ما هو Flexbox ولماذا تحتاجه؟
Flexbox هو نظام تخطيط في CSS صُمم لتسهيل ترتيب العناصر داخل الحاويات، سواء أفقياً أو عمودياً، ومن دون الاعتماد على أساليب قديمة مثل float.
إذا كانت العناصر تظهر بشكل متتابع عمودياً بحكم التدفق الطبيعي للصفحة، فإن Flexbox يمنحك تحكماً مباشراً في توزيعها، ومحاذاتها، وتحديد المسافات بينها.

وعندما تريد وضع العناصر بجانب بعضها أفقياً، يصبح Flexbox هو الحل الأمثل:

كيفية البدء مع Flexbox
لنبدأ ببنية بسيطة: عنصر أب يحتوي على ثلاثة عناصر داخلية.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS Position and Flexbox</title>
<link rel="stylesheet" href="./index.css">
</head>
<body>
<div class="parent">
<div class="child-one"></div>
<div class="child-two"></div>
<div class="child-three"></div>
</div>
</body>
</html>
/* Flexbox container */
.parent {
background-color: #00AAFF;
width: 300px;
height: 300px;
display: flex;
}
.child-one {
background-color: rgb(116, 255, 116);
width: 300px;
height: 300px;
}
.child-two {
background-color: rgb(248, 117, 117);
width: 300px;
height: 300px;
}
.child-three {
background-color: rgb(255, 116, 232);
width: 300px;
height: 300px;
}
بمجرد إضافة display: flex إلى العنصر الأب، تتحول العناصر الداخلية إلى عناصر مرنة flex items.

أهم خصائص Flexbox لترتيب العناصر
أولاً: الخاصية flex-direction
تحدد هذه الخاصية اتجاه توزيع العناصر داخل الحاوية.
row: لترتيب العناصر أفقياً.column: لترتيب العناصر عمودياً.row-reverse: ترتيب أفقي مع عكس التسلسل.column-reverse: ترتيب عمودي مع عكس التسلسل.
مثال على row:

مثال على column:

مثال على row-reverse:

مثال على column-reverse:

ثانياً: الخاصية justify-content
تتحكم justify-content في محاذاة العناصر على المحور الرئيسي، والذي يكون أفقياً غالباً إذا كان الاتجاه row.
center: توسيط العناصر.flex-start: وضع العناصر في بداية السطر.flex-end: وضع العناصر في نهاية السطر.space-around: مسافات حول العناصر.space-between: مسافات بين العناصر فقط.space-evenly: توزيع متساوٍ للمسافات داخل الحاوية وخارج العناصر.
مثال على center:

مثال على flex-start:

مثال على flex-end:

مثال على space-around:

مثال على space-between:

مثال على space-evenly:

ثالثاً: الخاصية align-items
تُستخدم align-items لمحاذاة العناصر على المحور العمودي داخل الحاوية، خاصة عندما يكون للحاوية ارتفاع واضح.
center: توسيط العناصر عمودياً.flex-start: وضع العناصر في أعلى الحاوية.flex-end: وضع العناصر في أسفل الحاوية.
مثال على center:

مثال على flex-start:

مثال على flex-end:

كيف تضع العناصر في منتصف الشاشة باستخدام Flexbox؟
من أبرز مزايا Flexbox أنه يسمح لك بدمج أكثر من خاصية للحصول على محاذاة دقيقة. فإذا أردت وضع العناصر في منتصف الحاوية أفقياً وعمودياً معاً، استخدم:
.parent {
display: flex;
justify-content: center;
align-items: center;
}

هذه الطريقة شائعة جداً في:
- شاشات تسجيل الدخول.
- النوافذ المنبثقة.
- رسائل التحميل.
- تصميم البطاقات المتمركزة.
أفضل ممارسات عند استخدام CSS Position وFlexbox
- استخدم
Flexboxأولاً عندما يكون المطلوب مجرد محاذاة وتنظيم للعناصر. - استخدم
absoluteفقط عندما تحتاج تموضعاً دقيقاً داخل حاوية محددة. - اجعل العنصر الأب
relativeإذا أردت أن يتبع العنصر الابنabsoluteحدوده. - تجنب الإفراط في استخدام
fixedحتى لا تؤثر العناصر الثابتة على تجربة المستخدم في الشاشات الصغيرة. - اختبر سلوك
stickyجيداً لأن عمله قد يتأثر بارتفاع الحاوية أو إعدادات التمرير.
الخلاصة التقنية
فهم التموضع في CSS هو الأساس لأي واجهة دقيقة وسهلة الصيانة. إذا كنت تحتاج إلى ترتيب عام ومحاذاة مرنة، فإن Flexbox هو الخيار الذكي والأسرع. أما إذا كنت تريد التحكم الدقيق بمكان عنصر معين، فخصائص position تمنحك الأدوات اللازمة، بشرط أن تستخدم كل نوع في موضعه الصحيح. من الناحية العملية، المزج بين position: relative وposition: absolute، إلى جانب الاعتماد على Flexbox في التخطيط العام، يُعد من أكثر الأساليب كفاءة في تطوير واجهات حديثة ومتجاوبة.