1التدفّق العادي (Normal Flow)
حتى إلا ما كتبتي حتى CSS، المتصفح كيرتّب العناصر حسب Normal Flow. عناصر block بحال div وp وh1 كيجيو واحد تحت واحد وكيشدو العرض. عناصر inline بحال a وspan وimg كيبقاو فنفس السطر حتى يعمّر.
2display
الخاصية display كتحدد نوع الصندوق ديال العنصر، وكيفاش كيتنظمو العناصر اللي داخلو.
| القيمة | كيفاش كيخدم |
|---|---|
block | كيبدا فسطر جديد وكيشد العرض. العرض والطول والمسافات كاملين كيخدمو. |
inline | كيبقى مع النص فنفس السطر. Width وHeight ما كيخدموش على بزاف ديال عناصر inline، وحتى Margin عمودية. |
inline-block | كيبقى فنفس السطر ولكن كيقْبل العرض والطول وMargin وPadding. |
none | كيختافي مزيان: لا بلاصة لا ظهور لا قراءة بأدوات المساعدة. |
flex | كيصفّ العناصر فالسطر ولا فالعمود وتتحكم فالمسافات (القسم 6). |
grid | كيرتّب العناصر فالسطور والأعمدة مع بعضياتهم (القسم 7). |
contents | الصندوق ديال العنصر كيختافي وولادو كيولّيو بحال داخلين مباشرة فالأب الأكبر. |
display: none vs visibility: hidden vs opacity: 0
| كيشد البلاصة | قابل للكليك | فين نستعملو | |
|---|---|---|---|
display:none | لا | لا | مينوات وتابات وصناديق مخبية |
visibility:hidden | نعم | لا | خبّي العنصر بلا ما يتحرك Layout |
opacity:0 | نعم | نعم | حركات ديال الظهور والاختفاء |
3نموذج الصندوق (Box Model)
كل عنصر بحال صندوق فيه أربع طبقات: content فالنص، من بعد padding (المسافة الداخلية)، border (الإطار)، وmargin (المسافة الخارجية).
ديما استعمل 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 */
4position
position كتحدد واش العنصر غادي يبقى فـ Normal Flow ولا لا. top وright وbottom وleft كيعونوك تحركو ولا تثبتو.
| القيمة | داخل Flow؟ | القياسات منين؟ | فين كنستعملوه |
|---|---|---|---|
static | نعم | Top وLeft ما عندهم تأثير (العادي) | Layout عادي |
relative | نعم (كيحتافظ بالبلاصة) | بلاصتو الأصلية | تحريك خفيف ولا مرجع للعناصر اللي داخلو |
absolute | لا | أقرب Parent محدّد للموضع | Badges وأزرار فالزوايا وDropdowns |
fixed | لا | نافذة المتصفح | أزرار عائمة وBars ديما باينين |
sticky | نعم | العنصر اللي كيسكرول منين تفوت الحد | Headers وعناوين الجداول وSidebar |
جرّب
عنصر قبل
بدّل الأب لـ 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 وبلاصة كافية يتحرك فيها. جرّب السكرول فالصندوق اللي لتحت.
السطر 1
السطر 2
السطر 3
السطر 4
السطر 5
السطر 6
السطر 7
السطر 8
header { position: sticky; top: 0; z-index: 10; background: #fff; }
5z-index وتراكب العناصر
z-index كيتحكم شكون كيبان فوق شكون ملي العناصر كيتراكبو. الرقم الكبير كيغلب، ولكن غالباً خاص العنصر يكون positioned ولا عنصر داخل Flex/Grid.
/* 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، كيتبدلو.
جرّب
خصائص الأب
| الخاصية | شنو كتدير |
|---|---|
flex-direction | row | 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 | كتشد المساحة الفارغة وكتدفع العنصر للطرف. |
7Grid
Grid مزيان ملي بغيتي السطور والأعمدة فـ نفس الوقت: Gallery ولا Dashboard ولا Form. دير display: grid فالأب وحدّد الأعمدة.
.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; }
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 كيمشي لزاوية الصفحة | ما كاينش أب محدد Position | position: 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 وa | display: 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 ديال المتصفح كتحسب داخل 100vh | Use 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 / vh | 1% من عرض ولا طول الشاشة | أقسام الشاشة كاملة |
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 |
باش تزيد تفهم
مرجع CSS ديال MDN · موارد CSS ديال W3C