في هذا الدرس 7تصفّح المواضيع
تُستخدم النوافذ الحوارية Modals لعرض تأكيدات الحذف الحرجة، ونماذج التحرير السريعة، والتنبيهات التي تتطلب قراراً مباشراً من المستخدم دون مغادرة سياق عمله. يستبدل Bootstrap 5.3 دوال المتصفح البدائية الجامدة مثل window.alert وwindow.confirm بنوافذ أنيقة تدعم الإتاحة وكلا المظهرين الفاتح والداكن بـ Vanilla JS خالصة.
يقوم الهيكل القياسي على ثلاث طبقات متداخلة لا غنى عن أي منها: الغلاف الخارجي .modal.fade، وبداخله حاوية التموضع والأبعاد .modal-dialog، وبداخلها الصندوق الفعلي .modal-content المقسّم إلى .modal-header و.modal-body و.modal-footer.
لتشغيل نافذة حوارية تصريحياً، اربط زراً يحمل السمتين data-bs-toggle="modal" وdata-bs-target="#modalId" بمعرّف النافذة. ولإغلاقها من الداخل، ضع السمة data-bs-dismiss="modal" على أيقونة .btn-close في الرأس وعلى زر الإلغاء في التذييل.
<button class="btn btn-danger" type="button"
data-bs-toggle="modal" data-bs-target="#delModal">
Delete Key</button>
<div class="modal fade" id="delModal" tabindex="-1">
<div class="modal-dialog"><div class="modal-content">
<div class="modal-header"><h5 class="modal-title">
Confirm</h5><button class="btn-close"
data-bs-dismiss="modal"></button></div>
<div class="modal-body">Revoke API token?</div>
</div></div>
</div>
لحماية المستخدم من إغلاق نموذج تحرير طويل بالخطأ عند النقر خارج النافذة، أضف السمتين data-bs-backdrop="static" وdata-bs-keyboard="false" على عنصر .modal؛ وعندما ينقر الزائر خارجها يمنحه بوتستراب نبضة ارتداد لطيفة تنبّهه إلى ضرورة الحفظ أو الإلغاء الصريح.
أما عند عرض شروط اتفاقية طويلة، فأضف الكلاس .modal-dialog-scrollable على .modal-dialog ليبقى رأس النافذة وتذييلها ثابتين بينما يتمرر النص داخل .modal-body فقط!
<button class="btn btn-primary" type="button"
data-bs-toggle="modal" data-bs-target="#termsMdl">
Read Terms</button>
<div class="modal fade" id="termsMdl"
data-bs-backdrop="static" tabindex="-1">
<div class="modal-dialog modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-body">Long scrollable text</div>
</div>
</div>
</div>
تظهر النافذة افتراضياً قرب الثلث العلوي من الشاشة، ولكن في رسائل التأكيد القصيرة وتنبيهات الدفع يمكنك توسيطها عمودياً وأفقياً في منتصف نافذة المتصفح بإضافة الكلاس .modal-dialog-centered إلى .modal-dialog، ويمكن دمجه في الوقت ذاته مع .modal-dialog-scrollable.
بالإضافة إلى العرض القياسي الافتراضي البالغ 500px، يتيح بوتستراب أربعة كلاسات تحجيم توضع على .modal-dialog: الصغير .modal-sm (300px)، والكبير .modal-lg (800px)، والكبير جداً .modal-xl (1140px).
كما قدّم الإصدار الخامس ميزة ملء الشاشة .modal-fullscreen ونسخها المتجاوبة الذكية مثل .modal-fullscreen-md-down التي تملأ شاشة الهاتف بالكامل لتسهيل الكتابة باللمس، بينما تظهر كنافذة عادية مؤطرة على شاشات الحاسوب!
<button class="btn btn-success" type="button"
data-bs-toggle="modal" data-bs-target="#respMdl">
Responsive Modal</button>
<div class="modal fade" id="respMdl" tabindex="-1">
<div class="modal-dialog modal-lg
modal-dialog-centered modal-fullscreen-md-down">
<div class="modal-content">
<div class="modal-body">Fullscreen on mobile!</div>
</div>
</div>
</div>
بدلاً من توليد خمسين عنصر .modal مكرراً لكل صف في جدول المستخدمين، أنشئ نافذة حوارية واحدة فقط واقرأ الزر الذي ضغط عليه المستخدم عبر الخاصية event.relatedTarget داخل مستمع الحدث show.bs.modal!
انتبه أمنياً هنا: استخدم دائماً textContent أو input.value لحقن البيانات المقروءة داخل النافذة، ولا تستخدم innerHTML مع نصوص المستخدمين أبداً لتفادي ثغرات DOM XSS.
لا يدعم Bootstrap 5 فتح نافذتين حواريتين متراكبتين فوق بعضهما في الوقت نفسه لما يسبّبه ذلك من تدمير لحلقة تركيز لوحة المفاتيح وتكدس طبقات التعتيم. عندما يحتاج سير العمل إلى الانتقال من نافذة أولى إلى نافذة تأكيد ثانية، أغلق الأولى أولاً ثم افتح الثانية (أو استخدم السمتين data-bs-target="#secondModal" وdata-bs-toggle="modal" على زر داخل النافذة الأولى فيتولى الإطار تبديلهما بالتسلسل النظيف).
ولنقل التركيز تلقائياً إلى حقل الإدخال الأول داخل النافذة، استمع دائماً لحدث shown.bs.modal بعد اكتمال ظهور التلاشي، وليس show.bs.modal.
مرجع كلاسات وسمات وأحداث مكوّن Modals
| الكلاس / الحدث | الموضع | السلوك القياسي في Bootstrap 5.3 |
|---|---|---|
.modal-dialog-scrollable | .modal-dialog | يجعل التمرير الطويل محصوراً داخل .modal-body فقط. |
.modal-dialog-centered | .modal-dialog | يوسّط بطاقة الحوار عمودياً في منتصف نافذة العرض. |
.modal-sm / -lg / -xl | .modal-dialog | يضبط العرض الأقصى على 300px أو 800px أو 1140px. |
.modal-fullscreen-md-down | .modal-dialog | يعرض النافذة بملء الشاشة على الجوال وضمن إطار على الحاسوب. |
event.relatedTarget | حدث show.bs.modal | يعيد مرجع الزر الذي ضغط عليه المستخدم لفتح النافذة. |
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنت في هذا الدرس تركيب طبقات Modal الثلاث، وتفعيل الخلفية الثابتة والتمرير الداخلي والتوسيط العمودي، واختيار الأحجام ووضع ملء الشاشة المتجاوب، وحقن البيانات الآمن عبر event.relatedTarget وتسلسل النوافذ بلا تداخل. الخطوة التالية: انتقل الآن إلى درس عارض الشرائح Carousel لبناء معارض الصور المتجاوبة وأزرار ومؤشرات التنقل وتأثير التلاشي.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Modal Dialog النافذة الحوارية المنبثقة
- طبقة حوارية تركز انتباه المستخدم فوق الصفحة مع خلفية معتمة لتأكيد العمليات الحساسة أو تحرير البيانات.
- للمراجعة
- 02 Scrollable Modal Dialog النافذة ذات التمرير الداخلي
- كلاس يثبّت رأس النافذة وأزرار التذييل ويجعل شريط التمرير يتحرك داخل جسم النافذة فقط.
- للمراجعة
- 03 Related Target (event.relatedTarget) العنصر المستدعي للحدث
- خاصية برمجية في كائن حدث الفتح تعيد مرجع الزر الفعلي الذي ضغط عليه المستخدم لتخصيص محتوى النافذة.
- للمراجعة
- 04 Fullscreen Breakpoint Modal نافذة ملء الشاشة المتجاوبة
- كلاسات توسّع النافذة لتغطي كامل شاشة الجوال الصغيرة وتعيدها لإطارها المعتاد على الشاشات الأكبر.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 XSS XSS
- Cross-Site Scripting
- ثغرة حقن شيفرات خبيثة نمنعها باستخدام textContent بدلاً من innerHTML عند تحديث عناوين وحقول النافذة.
- للمراجعة
- 02 ARIA ARIA
- Accessible Rich Internet Applications
- سمات الإتاحة القياسية التي تربط النافذة بعنوانها وتخفيها عن قارئات الشاشة حال إغلاقها.
- للمراجعة
- 03 DOM DOM
- Document Object Model
- شجرة المستند التي يُنصح بوضع عناصر النافذة في مستواها الأعلى لتجنب مشاكل الطبقات.
- للمراجعة
- 04 SLA SLA
- Service Level Agreement
- مثال عملي للنصوص الطويلة التي تُعرض بانتظام داخل نافذة ذات تمرير داخلي.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ نافذة modal.fade تحمل سمة data-bs-backdrop="static" وبداخلها عنصر modal-dialog-centered يضم رأساً وجسماً وتذييلاً بزري إلغاء وتأكيد.
-
اربط زرين يحملان قيمتين مختلفتين في سمة data-bs-item بنفس النافذة editItemModal، وحدّث عنوان النافذة بأمان عبر textContent داخل حدث show.bs.modal.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
على أي طبقة من طبقات النافذة توضع كلاسات التحجيم modal-lg والتوسيط modal-dialog-centered؟
تُطبّق جميع كلاسات الحجم والتوسيط والتمرير وملء الشاشة حصراً على عنصر modal-dialog.
أي كلاس يحصر شريط التمرير داخل جسم النافذة modal-body مع بقاء الرأس والتذييل ثابتين؟
يضبط كلاس modal-dialog-scrollable أقصى ارتفاع للحوار ليتمرر المحتوى الداخلي بسلاسة.
كيف تتعرف برمجياً على الزر المحدد الذي فتح النافذة المشتركة داخل حدث show.bs.modal؟
يمرّر بوتستراب مرجع الزر المسبب للفتح تلقائياً داخل خاصية event.relatedTarget.
ما الكلاس الذي يجعل النافذة تملأ كامل الشاشة تحت عرض 768px وتبقى مؤطرة على الشاشات الأكبر؟
تفعّل لاحقة md-down وضع ملء الشاشة للشاشات الأصغر من نقطة التوقف المتوسطة md.
يوصي بوتستراب 5 رسمياً بفتح نافذتين أو ثلاث نوافذ حوارية متراكبة فوق بعضها في اللحظة نفسها.
يمنع بوتستراب تداخل النوافذ المفتوحة معاً حفاظاً على سلامة التركيز وتجربة المستخدم.
لنقل التركيز تلقائياً إلى حقل إدخال داخل النافذة بشكل موثوق، يجب الاستماع للحدث shown.bs.modal بعد انتهاء حركة الظهور.
بعد انطلاق الحدث shown.bs.modal تكون حركة التلاشي قد اكتملت فيستقبل الحقل التركيز دون فشل.
لماذا يجب إدراج النصوص المقروءة من سمات الأزرار عبر خاصية textContent بدلاً من innerHTML؟
تعامل خاصية textContent المدخلات كنص حرفي آمن ولا تفسرها كوسوم أو سكريبتات تنفيذية.
ضبط سمة data-bs-backdrop="static" يمنع إغلاق النافذة عند نقر المستخدم بالخطأ خارج حدودها.
تثبّت القيمة static النافذة وتنبه المستخدم بارتداد خفيف بدلاً من إضاعة مدخلاته.