انتقل إلى محتوى الدرس
الدرس 149
دورة لغة CSS

القوائم المنسدلة في لغة CSSCSS Dropdowns

صمم قوائم منسدلة احترافية بلغة CSS الخالصة عبر القوائم الدلالية المتداخلة والتموضع المنطقي ثنائي اللغة والانتقالات السلسة وجسر الفأرة الخفي ودعم التنقل الكامل بلوحة المفاتيح.
أقسام الدرس
7
الأمثلة
3
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 7تصفّح المواضيع

تبدأ القائمة المنسدلة المتينة ببنية HTML دلالية نظيفة قبل كتابة سطر تنسيق واحد؛ إذ نضع شريط التنقل داخل وسم <nav> يضم قائمة رئيسية <ul class="nav-bar">، وندرج القائمة الفرعية <ul class="submenu"> مباشرة داخل عنصر الأب <li class="has-menu"> التابع لها.

يتيح تطبيق الصندوق المرن display: flex مع gap على القائمة الرئيسية رص الروابط العلوية أفقياً بانتظام، بينما يوفر احتواء العنصر الأب لقائمته الفرعية العلاقة الشجرية المباشرة اللازمة لفتح اللوحة بالأنماط الخالصة دون أي برمجة نصية.

مخطط معماري يوضح التموضع النسبي على العنصر الأب وفتح القائمة عبر التمرير والتركيز واللوحة المطلقة العائمة

لو بقيت القائمة الفرعية ضمن التدفق الطبيعي للمستند لأدى إظهارها إلى تمديد ارتفاع الشريط العلوي ودفع محتوى الصفحة بأكمله إلى الأسفل! ولكي تطفو اللوحة بسلاسة فوق المحتوى نمنح العنصر الأب .has-menu الخاصية position: relative ونمنح القائمة الفرعية .submenu التموضع المطلق position: absolute; top: 100%;.

كما يضمن تحديد طبقة تكديس موجبة مثل z-index: 20 مع عرض أدنى مريح min-width: 190px وظل ناعم box-shadow تمييز اللوحة العائمة بوضوح فوق البطاقات والعناوين الموجودة أسفلها.

CSS
.has-menu { position: relative; }
.submenu {
  display: none;
  position: absolute;
  top: 100%;
  inset-inline-start: 0;
  min-width: 180px;
  z-index: 20;
}
.has-menu:hover > .submenu { display: block; }

تثبيت الإزاحة المادية left: 0 يحاذي القائمة بشكل سليم في الواجهات الإنجليزية، لكنه يخل بالمحاذاة في الواجهات العربية ذات الاتجاه من اليمين إلى اليسار وقد يدفع القوائم العريضة خارج الحافة اليمنى للشاشة.

أما الخاصية المنطقية inset-inline-start: 0 فتحل المشكلة للغتين بسطر واحد؛ إذ تحاذي القائمة مع الحافة اليسرى لعنصرها الأب بالإنجليزية ومع الحافة اليمنى بالعربية تلقائياً. وللقوائم الواقعة في أقصى نهاية الشريط كقائمة الحساب الشخصي نستخدم inset-inline-end: 0 لتمتد اللوحة نحو داخل الشاشة دون خروج.

الاعتماد على .has-menu:hover > .submenu وحده يحرم مستخدمي لوحة المفاتيح من فتح القائمة، وحتى استخدام :focus على الرابط الأب يفشل فور ضغط مفتاح Tab للانتقال إلى أول رابط فرعي؛ لأن الرابط الأب يفقد التركيز فتُغلق القائمة في وجه المستخدم!

يعالج دمج :hover مع الفئة الزائفة :focus-within على العنصر الأب .has-menu هذه المشكلة جذرياً؛ إذ تظل الحالة نشطة طوال وجود التركيز على الرابط الرئيسي أو أي رابط داخلي ضمن القائمة الفرعية، ثم تُغلق القائمة تلقائياً فور خروج مؤشر الجدولة من آخر عنصر فرعي.

CSS
.has-menu:hover > .submenu,
.has-menu:focus-within > .submenu {
  opacity: 1;
  visibility: visible;
}
.sub-link:focus-visible {
  outline: 2px solid #7750b2;
}

مختبر القوائم المنسدلة التفاعلي

التبديل بين display: none وdisplay: block يظهر اللوحة فجأة دون انتقال ناعم، بينما يترك الاكتفاء بـ opacity: 0 الروابط المخفية قابلة للنقر خطأً فوق محتوى الصفحة! لذلك يجمع النمط الاحترافي بين opacity: 0; visibility: hidden; transform: translateY(6px); عند الإغلاق والانتقال إلى opacity: 1; visibility: visible; transform: translateY(0); عند الفتح.

وتكتمل سلاسة الاستخدام بلمستين عبر العناصر الزائفة: رسم مؤشر سهم صغير عبر .trigger::after يدور بنعومة عند الفتح، وإضافة جسر تمرير خفي عبر .submenu::before بارتفاع 10px وأعلى سالب top: -10px ليسد المسافة الفاصلة بين الزر واللوحة فلا تنغلق القائمة أثناء مرور الفأرة فوق الفجوة.

CSS
.submenu {
  top: calc(100% + 8px);
  opacity: 0;
  visibility: hidden;
  transform: translateY(6px);
  transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s;
}
.submenu::before {
  content: ""; position: absolute; top: -8px; left: 0; right: 0; height: 8px;
}

قد يبدو فحص القائمة المنسدلة مربكاً في البداية لأن تحريك مؤشر الفأرة من الصفحة نحو نافذة أدوات المطور ينهي حالة :hover فيخفي القائمة فوراً! وتوفر المتصفحات حلاً مدمجاً داخل لوحة الأنماط؛ إذ يكفي تحديد العنصر الأب <li class="has-menu"> في شجرة العناصر ثم النقر على زر :hov وتفعيل خيار :hover أو :focus-within.

يبقي هذا التثبيت اللوحة المنسدلة مفتوحة باستمرار أمامك لتعديل الحشوات وتباين الألوان والظلال بدقة وسهولة.

راجع القائمة المرجعية المتكاملة التالية عند بناء أي قائمة منسدلة ثنائية اللغة بلغة CSS الخالصة:

الركيزةالقاعدة القياسية الموصى بهاالمشكلة التي تعالجها
العنصر الأبposition: relative على li.has-menuتحديد نقطة المرجع لإحداثيات اللوحة الفرعية
اللوحة العائمةposition: absolute; top: 100%; z-index: 20منع دفع محتوى الصفحة إلى الأسفل عند الفتح
المحاذاة المنطقيةinset-inline-start: 0محاذاة يميناً بالعربية ويساراً بالإنجليزية تلقائياً
دعم لوحة المفاتيحدمج :hover مع :focus-withinإبقاء القائمة مفتوحة أثناء التنقل بمفتاح Tab
الانتقال السلسدمج opacity وvisibility وtransformحركة ناعمة مع منع النقر الخاطئ وهي مغلقة
سد فجوة الفأرةجسر خفي عبر .submenu::beforeمنع انغلاق القائمة عند عبور الفجوة الرأسية
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

في ملخص الدرس أتقنت هيكلة القوائم المتداخلة دلالياً، وربط اللوحات العائمة بمحاذاة منطقية عبر inset-inline-start، ودعم التنقل بلوحة المفاتيح عبر :focus-within، وتحريك الظهور بسلاسة مع جسر الفأرة وفحص الحالات في أدوات المطور. وتتمثل الخطوة التالية في الانتقال إلى الدرس الختامي تنسيق النماذج وحقول الإدخال في لغة CSS لبناء نماذج متجاوبة وميسرة باحترافية كاملة.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Focus-Within State حالة احتواء التركيز
فئة زائفة تطابق الحاوية الأب طوال وجود مؤشر التركيز عليها أو على أي عنصر فرعي بداخلها.
للمراجعة
02 Invisible Hover Bridge جسر التمرير الخفي
شريط شفاف يولده العنصر الزائف ::before لسد الفجوة بين الزر واللوحة العائمة ومنع انقطاع حالة التمرير.
للمراجعة
03 Logical Inline Start Offset الإزاحة السطرية البادئة
استخدام خاصية inset-inline-start لمحاذاة القائمة المنسدلة يساراً بالإنجليزية ويميناً بالعربية تلقائياً.
للمراجعة
04 Visibility-Guarded Fade تلاشي محمي بالرؤية
دمج الشفافية مع خاصية الرؤية لكي تتلاشى القائمة بنعومة مع تعطيل النقر عليها تماماً وهي مخفية.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات3

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 3 مفهومةأول بطاقة، أول خطوة
01 A11Y A11Y
Accessibility
هندسة إمكانية الوصول الشاملة التي تضمن فتح القوائم المنسدلة والتنقل بداخلها بمفتاح Tab تماماً كالفأرة.
للمراجعة
02 LTR LTR
Left-to-Right
اتجاه الكتابة من اليسار إلى اليمين في الإنجليزية حيث تقابل البداية السطرية الحافة اليسرى تلقائياً.
للمراجعة
03 NAV NAV
Navigation Landmark
وسم المعلم الدلالي المخصص في HTML لاحتواء قوائم التنقل الرئيسية والفرعية في الموقع.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. ادمج المحدد .has-menu:focus-within > .submenu مع حالة التمرير واضبط محاذاة اللوحة عبر inset-inline-start: 0.

  2. حرك ظهور القائمة عبر الشفافية والرؤية والإزاحة الرأسية، واسدد فجوة 8px بشريط خفي مطلق عبر .submenu::before.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

لماذا نضع خاصية position: relative على العنصر الأب li.has-menu في القائمة المنسدلة؟

02

أي فئة زائفة تبقي القائمة المنسدلة مفتوحة أثناء تنقل المستخدم بمفتاح Tab عبر روابطها الفرعية؟

03

لماذا يجب دمج visibility: hidden دائماً مع opacity: 0 عند إغلاق القائمة المنسدلة؟

04

ما الخاصية التي تحاذي اللوحة المنسدلة تلقائياً مع الحافة اليمنى بالعربية واليسرى بالإنجليزية؟

05

ما المشكلة التي يحلها الشريط الخفي .submenu::before المتموضع عند top: -8px؟

06

ماذا يحدث إذا وُضعت خاصية overflow: hidden على شريط التنقل الأب الذي يضم قائمة مطلقة؟

07

يتيح زر :hov في أدوات المطور تثبيت حالة :hover أو :focus-within على العنصر الأب لفحص القائمة المنسدلة بسهولة.

08

يلزم استخدام سمة onclick البرمجية لفتح قوائم التنقل المنسدلة الأساسية في CSS الحديثة.