CSS · الدرس 12 من 12

العرض والتموضع

فهم Flow وFlexbox وGrid وفين يتحط كل عنصر.

للمبتدئين25 دقيقة قراءة · تقريباًآخر تحديث: 1 نونبر 2026
حمّل ملف HTML
فهاد الدرسNormal Flowdisplayنموذج الصندوقpositionz-index & stackingFlexboxGridCenteringTasks: how do I…?Common problemsUnits & sizingCheat sheet

1التدفّق العادي (Normal Flow)

حتى إلا ما كتبتي حتى CSS، المتصفح كيرتّب العناصر حسب Normal Flow. عناصر block بحال div وp وh1 كيجيو واحد تحت واحد وكيشدو العرض. عناصر inline بحال a وspan وimg كيبقاو فنفس السطر حتى يعمّر.

عناصر Block كيجيو فوق بعضياتهم، وInline فنفس السطر.
div (block)
div (block)
نص مع span و a link in one line.
الخلاصة: كل أداة ديال Layout يا إما كتبدّل كيفاش العناصر داخلة فـ Normal Flow (display, flex, grid)، يا إما كتخرجها منو (position). عرف شنو باغي قبل الكود.

2display

الخاصية display كتحدد نوع الصندوق ديال العنصر، وكيفاش كيتنظمو العناصر اللي داخلو.

القيمةكيفاش كيخدم
blockكيبدا فسطر جديد وكيشد العرض. العرض والطول والمسافات كاملين كيخدمو.
inlineكيبقى مع النص فنفس السطر. Width وHeight ما كيخدموش على بزاف ديال عناصر inline، وحتى Margin عمودية.
inline-blockكيبقى فنفس السطر ولكن كيقْبل العرض والطول وMargin وPadding.
noneكيختافي مزيان: لا بلاصة لا ظهور لا قراءة بأدوات المساعدة.
flexكيصفّ العناصر فالسطر ولا فالعمود وتتحكم فالمسافات (القسم 6).
gridكيرتّب العناصر فالسطور والأعمدة مع بعضياتهم (القسم 7).
contentsالصندوق ديال العنصر كيختافي وولادو كيولّيو بحال داخلين مباشرة فالأب الأكبر.
الفرق بين inline وinline-block وblock بنفس width: 120px
inline inline-block block

display: none vs visibility: hidden vs opacity: 0

كيشد البلاصةقابل للكليكفين نستعملو
display:noneلالامينوات وتابات وصناديق مخبية
visibility:hiddenنعملاخبّي العنصر بلا ما يتحرك Layout
opacity:0نعمنعمحركات ديال الظهور والاختفاء

3نموذج الصندوق (Box Model)

كل عنصر بحال صندوق فيه أربع طبقات: content فالنص، من بعد padding (المسافة الداخلية)، border (الإطار)، وmargin (المسافة الخارجية).

margin
border → padding
content (width × height)

ديما استعمل box-sizing: border-box

إلا كتبتي width: 300px وpadding: 20px، العرض النهائي يقدر يوصل 340px. هادشي كيخلّق تجاوز العرض. مع border-box، الـ padding والـ border كيتحسبو داخل العرض اللي حددتي.

*, *::before, *::after { box-sizing: border-box; }

الاختصارات ديال Margin

margin: 10px;              /* all four sides */
margin: 10px 20px;         /* vertical | horizontal */
margin: 10px 20px 30px;    /* top | horizontal | bottom */
margin: 10px 20px 30px 40px; /* top right bottom left (clockwise) */
margin: 0 auto;            /* centers a block that has a width */
margin-left: auto;         /* pushes an element to the far right */
Margin Collapsing: المسافات العمودية بين جوج Blocks مرات كيتدمجو وكيبقى غير الأكبر (20px و30px كيعطيو 30px). هادشي ما كاينش فـ Flex ولا Grid، وPadding ما كيندمجش.

4position

position كتحدد واش العنصر غادي يبقى فـ Normal Flow ولا لا. top وright وbottom وleft كيعونوك تحركو ولا تثبتو.

القيمةداخل Flow؟القياسات منين؟فين كنستعملوه
staticنعمTop وLeft ما عندهم تأثير (العادي)Layout عادي
relativeنعم (كيحتافظ بالبلاصة)بلاصتو الأصليةتحريك خفيف ولا مرجع للعناصر اللي داخلو
absoluteلاأقرب Parent محدّد للموضعBadges وأزرار فالزوايا وDropdowns
fixedلانافذة المتصفحأزرار عائمة وBars ديما باينين
stickyنعمالعنصر اللي كيسكرول منين تفوت الحدHeaders وعناوين الجداول وSidebar
قاعدة مفيدة: عنصر absolute كيقلب على أقرب أب عندو position مختلف على static. إلا ما لقاهش، يقدر يرجع للصفحة كاملة. دير position: relative فالأب اللي بغيتي.

جرّب

الصفحة الخارجية (ديما Positioned)
الأب
عنصر قبل
الهدف
عنصر من بعد

بدّل الأب لـ static وشوف كيفاش الهدف كيتحسب من الصفحة الخارجية. مع relative، العناصر اللي حداك ما كيتحركوش. أما مع absolute، العناصر كيسدّو البلاصة اللي تخلّات.

اختصارات التموضع

inset: 0;                 /* top, right, bottom, left all 0: stretch to fill the parent */
position: absolute; top: 0; right: 0;     /* pin to top-right corner */
position: absolute; inset: 0; margin: auto; width: 200px; height: 100px; /* centered */

fixed

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

العنصر fixed كيبقى فبلاصتو وانت كتهبط فالصفحة. غير شي خصائص فالآباء بحال transform ولا filter ولا perspective تقدر تبدّل المرجع ديالو.

sticky

باش sticky يخدم، خاصو حدّ بحال top: 0 وبلاصة كافية يتحرك فيها. جرّب السكرول فالصندوق اللي لتحت.

عنوان كيبقى ثابت (top: 0)

السطر 1

السطر 2

السطر 3

السطر 4

السطر 5

السطر 6

السطر 7

السطر 8

header { position: sticky; top: 0; z-index: 10; background: #fff; }
Sticky ما خدمش؟ تأكد من top، ومن overflow ديال الآباء، ومن وجود طول كافي باش العنصر يتحرك.

5z-index وتراكب العناصر

z-index كيتحكم شكون كيبان فوق شكون ملي العناصر كيتراكبو. الرقم الكبير كيغلب، ولكن غالباً خاص العنصر يكون positioned ولا عنصر داخل Flex/Grid.

z-index: 2
z-index: 1
علاش z-index كبير ما كيطلعش؟ داخل نفس Stacking Context الرقم الكبير كيغلب، ولكن transform وopacity وfilter يقدرو يصايبو Context جديد. الولد ما يقدرش يخرج من Context ديال الأب.
/* a simple scale that avoids chaos */
--z-dropdown: 100;
--z-sticky: 200;
--z-modal: 300;
--z-toast: 400;

6Flexbox

Flexbox كينظّم العناصر فاتجاه واحد: Navbar ولا أزرار ولا Cards حدّا حدّا. دير display: flex فالعنصر الأب، وغادي يولي ولادو Flex Items.

.row { display: flex; gap: 16px; }

عندنا جوج ديال المحاور: Main Axis هو اتجاه العناصر، وCross Axis هو اللي مقاطع معاه. justify-content كيخدم على الأول، وalign-items على الثاني. ملي كتدير flex-direction: column، كيتبدلو.

جرّب

1
2
3

خصائص الأب

الخاصيةشنو كتدير
flex-directionrow | column | row-reverse | column-reverse
justify-contentكتوزع العناصر على Main Axis
align-itemsكتحاذي العناصر على Cross Axis
flex-wrapكتخلي العناصر تهبط لسطر جديد
gapالمسافة بين العناصر (أحسن من Margin)
align-contentالمسافة بين السطور إلا دارو Wrap

خصائص العناصر الداخلية

الخاصيةشنو كتدير
flex: 1العنصر كيشد المساحة اللي باقية؛ جوج flex: 1 كيقسموها.
flex: 0 0 200pxما كيكبرش وما كيصغّرش، العرض الأساسي 200px.
flex-shrink: 0ما كيخليش العنصر يتعصر (مزيان للّوغو والأيقونات).
align-selfكيبدل Align ديال عنصر واحد.
orderكيبدل الترتيب فالعرض بلا تبديل HTML.
margin-left: autoكتشد المساحة الفارغة وكتدفع العنصر للطرف.
النص كيخرج برا Flex Item؟ زيد min-width: 0 باش العنصر يقدر يصغّر والنص يلتف.

7Grid

Grid مزيان ملي بغيتي السطور والأعمدة فـ نفس الوقت: Gallery ولا Dashboard ولا Form. دير display: grid فالأب وحدّد الأعمدة.

1fr
2fr
1fr
spans 2 columns
1fr
.grid {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr;   /* three columns, middle twice as wide */
  gap: 16px;
}
.wide { grid-column: 1 / 3; }           /* from line 1 to line 3 = 2 columns */

Cards Responsive بلا Media Query

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 20px;
}

كل Card عرضها على الأقل 240px، والمتصفح كيدير اللي قدر عليه فكل سطر.

Layout بمناطق مسمّاة

.page {
  display: grid;
  grid-template-columns: 240px 1fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header header"
    "side   main"
    "footer footer";
  min-height: 100vh;
}
header { grid-area: header; }
aside  { grid-area: side; }
main   { grid-area: main; }
footer { grid-area: footer; }
Flex ولا Grid؟ إلا بغيتي اتجاه واحد والمحتوى يحدد القياسات، استعمل Flex. إلا بغيتي سطور وأعمدة يتحكم فيهم Layout، استعمل Grid. وتقدر تجمع بينهم.

8توسيط العناصر

/* 1. Center anything, horizontally and vertically (best default) */
.parent { display: grid; place-items: center; }

/* 2. Same with flex */
.parent { display: flex; justify-content: center; align-items: center; }

/* 3. Center a block horizontally only */
.box { width: 600px; max-width: 100%; margin: 0 auto; }

/* 4. Center text */
.text { text-align: center; }

/* 5. Center an absolutely positioned element */
.box { position: absolute; inset: 0; margin: auto; width: 200px; height: 100px; }

/* 6. Center on the full screen */
.parent { min-height: 100vh; display: grid; place-items: center; }
باش توسّط عنصر عمودياً، الأب خاصو يكون عندو طول. إلا كان قدّ المحتوى فقط، ما بقات بلاصة للتوسيط.

9كيفاش ندير…؟

Logo فاليسار وروابط فاليمين (Navbar)

دير Flex فـ Navbar وخلي المسافة بين العناصر هي اللي تفرّقهم.

<nav class="nav"><a class="logo">DECT</a><ul class="links">…</ul></nav>

.nav   { display: flex; justify-content: space-between; align-items: center; padding: 16px 32px; }
.links { display: flex; gap: 24px; list-style: none; margin: 0; padding: 0; }

Logo ليسار وروابط فالوسط وزر ليمين

استعمل Grid بثلاثة أعمدة باش يبقى الوسط متوسّط بصح.

.nav { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; }
.nav .cta { justify-self: end; }

خلّي Navbar فوق وانت كتهبط

.nav { position: sticky; top: 0; z-index: 100; background: #fff; }

دفع رابط للطرف ديال اليمين

Margin Auto كتدفع هاد العنصر للطرف.

.links { display: flex; gap: 16px; }
.links .login { margin-left: auto; }

زر فالفوق على اليمين ديال Card

الكارت كتكون المرجع بـ relative والزر كتثبّتو بـ absolute.

.card  { position: relative; padding: 24px; }
.close { position: absolute; top: 12px; right: 12px; }

زيد إشعار صغير فوق أيقونة

.icon  { position: relative; display: inline-block; }
.badge { position: absolute; top: -6px; right: -6px; }

زر عايم يبقى لتحت فاليمين

.fab { position: fixed; right: 20px; bottom: 20px; z-index: 50; }

Dropdown يبان تحت الرابط

هاد CSS غير مثال فين يتحط Dropdown. المينو الصحيحة خاصها تخدم بالكلافي واللمس وتدير Focus وحالة الفتح.

.item     { position: relative; }
.dropdown { position: absolute; top: 100%; left: 0; display: none; min-width: 180px; z-index: 100; }
.item:hover .dropdown { display: block; }

صايب Modal مع خلفية غامقة

هاد مجرد Layout، ماشي Modal كاملة. المودال الصحيحة خاصها Focus وزر إغلاق وEscape. تقدر تستعمل dialog ديال HTML.

.overlay { position: fixed; inset: 0; background: rgba(0,0,0,.5); display: grid; place-items: center; z-index: 300; }
.modal   { background: #fff; padding: 24px; width: min(480px, 92vw); border-radius: 8px; }

خلّي Footer لتحت حتى إلا كانت الصفحة قصيرة

body { min-height: 100vh; display: flex; flex-direction: column; margin: 0; }
main { flex: 1; }   /* takes all leftover space, footer is pushed down */

Sidebar حدّا المحتوى الرئيسي

.layout  { display: grid; grid-template-columns: 260px 1fr; gap: 24px; }
.sidebar { position: sticky; top: 16px; align-self: start; }

Cards نفس الطول والزر لتحت

.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 20px; }
.card  { display: flex; flex-direction: column; }
.card .btn { margin-top: auto; }

جوج أزرار حدّا حدّا وبيناتهم مسافة

.actions { display: flex; gap: 12px; }

Hero فالشاشة كاملة والنص فالوسط

.hero { min-height: 100vh; display: grid; place-items: center; text-align: center; }

أعمدة تحت بعضياتهم فالتليفون وحدّا حدّا فالحاسوب

.row { display: flex; flex-direction: column; gap: 20px; }
@media (min-width: 768px) { .row { flex-direction: row; } .row > * { flex: 1; } }

خبّي المينو فالتليفون وبيّن زر ☰

.burger { display: none; }
@media (max-width: 767px) { .links { display: none; } .burger { display: block; } }

دير نص فوق الصورة

.hero { position: relative; }
.hero img { width: 100%; display: block; }
.hero .text { position: absolute; left: 24px; bottom: 24px; color: #fff; }

10مشاكل كيتلاقاو بزاف

المشكلالسببالحل
عنصر Absolute كيمشي لزاوية الصفحةما كاينش أب محدد Positionposition: relative فالأب
الأب كيولي بلا طولجميع العناصر Absolute ولا Floatعطي طول للأب ولا خلي عنصر فالـ Flow
z-index ما خدامشالعنصر Static ولا فـ Stacking Context آخرAdd position: relative; طلّع z-index ديال الأب
كيبان Scrollbar أفقيشي عنصر أعرض من الشاشة: Padding ولا 100vw ولا كلمات طوالbox-sizing: border-box; use width: 100%; overflow-wrap: anywhere
Width وHeight ما كيديرو والوالعنصر Inline بحال span وadisplay: inline-block or block
Margin Top ديال الولد كتحرك الأبتداخل Marginsزيد Padding للأب ولا استعمل display: flow-root
فراغ صغير تحت الصورةالصور Inline كتحاذي سطر النصimg { display: block; }
Sticky ما كيثبتشTop ما كاينش ولا Overflow عند الأبAdd top: 0; remove overflow from ancestors
عنصر Flex كيخرج برا مع نص طويلالعنصر ما كيبغيش يصغّر على المحتوىmin-width: 0 فالعنصر
100vh طويل بزاف فالتليفونToolbar ديال المتصفح كتحسب داخل 100vhUse 100dvh
عنصر Fixed ما كيبقاش ثابتالأب فيه transform ولا filterخرّج العنصر ولا حيد Transform
التوسيط العمودي ما خدامشالأب ما عندوش طولزيد min-height

كيفاش تقلّب على المشكل

/* 1. Show every box */
* { outline: 1px solid rgba(255,0,0,.4); }

/* 2. In the browser: right-click → Inspect → hover the element
      The colors show margin, border, padding and content.
   3. Check the "Computed" tab for the real display and position. */

11الوحدات والقياسات

الوحدةالمعنىفين نستعملو
pxبيكسلات ثابتةBorders وظلال وتفاصيل صغيرة
%نسبة من الأبقياسات عرض مرنة
remمضاعف حجم الخط الأساسي (غالباً 16px)حجم الخط والمسافات
emمضاعف حجم خط العنصرPadding كيكبر مع الخط
vw / vh1% من عرض ولا طول الشاشةأقسام الشاشة كاملة
dvhطول كيتكيّف مع Toolbar فالتليفونطول الشاشة فالتليفون
frحصة من المساحة فـ Gridأعمدة Grid
width: min(1100px, 92%);               /* never wider than 1100px, never touching the edges */
font-size: clamp(1rem, 2.5vw, 1.5rem); /* min | preferred | max */
.container { max-width: 1100px; margin-inline: auto; padding-inline: 20px; }
img { max-width: 100%; height: auto; }  /* images never overflow */

12ورقة مرجعية

بغيت…استعمل
رتّب عناصر فسطر ولا عمودdisplay: flex + gap
صايب سطور وأعمدةdisplay: grid
وسّط أي عنصرdisplay: grid; place-items: center
وسّط Block بالعرضmargin: 0 auto + a width
فرّق بين العناصرgap (parent) rather than margins on children
دفع عنصر للطرفmargin-left: auto (flex)
ثبّت عنصر فزاوية الأبparent relative + child absolute
ثبّت العنصر فالشاشةposition: fixed
بقى ثابت مع السكرولposition: sticky; top: 0
غطّي البلاصة كاملةposition: absolute; inset: 0
بيّن ولا خبّيdisplay: none / block
تحكم شكون فوق شكونz-index on a positioned element
دخل Padding فحساب العرضbox-sizing: border-box
فاش تفكر: 1) واش Normal Flow كافي؟ خليه. 2) عناصر فسطر ولا Grid؟ خدم Flex ولا Grid فالأب. 3) خاص تراكب ولا تثبيت؟ عاد استعمل position.

باش تزيد تفهم

مرجع CSS ديال MDN · موارد CSS ديال W3C

التقدّم ديالك كيتحفظ غير فهاد المتصفح.