Bootstrap: Carousel وModal
آخر تحديث: 2026-08-26
1. مقدمة
(1) المتطلبات الأساسية
- الدرس 13: النماذج والتحقق من الصحة
(2) 🎯 ما الذي ستتعلّمه
- بناء Carousel وتكوين التشغيل التلقائي
- تحسين الـ Carousel باستخدام المؤشرات وأسهم السابق/التالي والتسميات
- بناء Modal والتحكم في الفتح/الإغلاق
- استخدام تنويعات حجم Modal والتوسيط العمودي
- تضمين النماذج والـ Carousel داخل Modal
(3) المشكلة
تحتاج صفحة تفاصيل منتج Alice إلى Carousel صور لعرض زوايا متعددة للمنتج، وModal "عرض سريع" ينبثق بتفاصيل المنتج — يعمل المكوّنان معًا لإنشاء تجربة مستخدم احترافية دون كتابة JavaScript مخصص.
(4) الحل
الـ Carousel وModal من أكثر مكوّنات JavaScript التفاعلية شيوعًا في Bootstrap. يُستخدم الـ Carousel لتدوير الصور أو المحتوى، بينما يُستخدم Modal لعرض مربع حوار أو نموذج أو رسالة تأكيد.
لفهم الفكرة: الـ Carousel = عرض شرائح تلقائي، الـ Modal = مربع حوار مؤقت يتراكب فوق الصفحة الحالية.
(5) الفائدة
استخدام الـ Carousel وModal معًا يتيح لك إنشاء عرض منتجات احترافي دون كتابة أي JavaScript.
2. الـ Carousel
▶ مثال: Carousel أساسي
<!DOCTYPE html>
<html lang="ar">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Carousel Demo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container py-4">
<div id="demoCarousel" class="carousel slide" data-bs-ride="carousel">
<div class="carousel-indicators">
<button type="button" data-bs-target="#demoCarousel" data-bs-slide-to="0" class="active"></button>
<button type="button" data-bs-target="#demoCarousel" data-bs-slide-to="1"></button>
<button type="button" data-bs-target="#demoCarousel" data-bs-slide-to="2"></button>
</div>
<div class="carousel-inner">
<div class="carousel-item active">
<img src="https://via.placeholder.com/800x400/0d6efd/fff?text=Slide+1" class="d-block w-100" alt="Slide 1">
<div class="carousel-caption d-none d-md-block">
<h5>First Slide</h5>
<p>Welcome to Bootstrap Carousel.</p>
</div>
</div>
<div class="carousel-item">
<img src="https://via.placeholder.com/800x400/198754/fff?text=Slide+2" class="d-block w-100" alt="Slide 2">
</div>
<div class="carousel-item">
<img src="https://via.placeholder.com/800x400/dc3545/fff?text=Slide+3" class="d-block w-100" alt="Slide 3">
</div>
</div>
<button class="carousel-control-prev" type="button" data-bs-target="#demoCarousel" data-bs-slide="prev">
<span class="carousel-control-prev-icon"></span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#demoCarousel" data-bs-slide="next">
<span class="carousel-control-next-icon"></span>
</button>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
النتيجة: تأثير المكوّن بأنماط Bootstrap 5.3 (مثل الأزرار، البطاقات، الCarousel، الCollapse، إلخ). تستخدم الصفحة سمة Bootstrap الافتراضية (فاتحة) والشبكة المتجاوبة افتراضيًا.
(1) بنية مكوّن الـ Carousel
| العنصر | الفئة/data-* | الوصف |
|---|---|---|
| الحاوية | carousel slide |
حاوية الـ Carousel؛ المعرّف يُستخدم للربط |
| المؤشرات | carousel-indicators |
النقاط السفلية للقفز إلى شريحة |
| حاوية الشرائح | carousel-inner |
تلفّ جميع الشرائح |
| شريحة مفردة | carousel-item |
محتوى كل شريحة |
| الشريحة النشطة | carousel-item active |
الشريحة المعروضة حاليًا |
| التسمية | carousel-caption |
نص متراكب على الصورة |
(2) تكوين الـ Carousel
<!-- تشغيل تلقائي كل ثانيتين (افتراضي: 5000ms) -->
<div id="carousel" class="carousel slide" data-bs-ride="carousel" data-bs-interval="2000">
<!-- انتقال بتلاشي بدلاً من الانزلاق -->
<div id="carousel" class="carousel slide carousel-fade">
النتيجة: تأثير المكوّن بأنماط Bootstrap 5.3 (مثل الأزرار، البطاقات، الCarousel، الCollapse، إلخ). تستخدم الصفحة سمة Bootstrap الافتراضية (فاتحة) والشبكة المتجاوبة افتراضيًا.
3. الـ Modal
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">
Launch Demo Modal
</button>
<div class="modal fade" id="exampleModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5">Modal Title</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<p>This is the modal body content. You can put any HTML here.</p>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<button class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
النتيجة: تأثير المكوّن بأنماط Bootstrap 5.3 (مثل الأزرار، البطاقات، الCarousel، الCollapse، إلخ). تستخدم الصفحة سمة Bootstrap الافتراضية (فاتحة) والشبكة المتجاوبة افتراضيًا.
(1) بنية الـ Modal
| العنصر | الفئة | الوصف |
|---|---|---|
| الخلفية المعتمة | modal fade |
الغطاء الخلفي شبه الشفاف |
| الحوار | modal-dialog |
يتحكم في الحجم والتوسيط العمودي |
| المحتوى | modal-content |
حاوية اللوحة البيضاء |
| الترويسة | modal-header |
العنوان + زر الإغلاق |
| الجسم | modal-body |
منطقة المحتوى الرئيسية |
| التذييل | modal-footer |
مجموعة أزرار الإجراءات |
4. أحجام ومحاذاة الـ Modal
<div class="modal-dialog modal-sm">Small</div>
<div class="modal-dialog modal-lg">Large</div>
<div class="modal-dialog modal-xl">Extra large</div>
<div class="modal-dialog modal-dialog-centered">Vertically centered</div>
<div class="modal-dialog modal-dialog-scrollable">Scrollable body</div>
<div class="modal-dialog modal-fullscreen-md-down">Full screen on mobile</div>
النتيجة: تأثير المكوّن بأنماط Bootstrap 5.3 (مثل الأزرار، البطاقات، الCarousel، الCollapse، إلخ). تستخدم الصفحة سمة Bootstrap الافتراضية (فاتحة) والشبكة المتجاوبة افتراضيًا.
| الفئة | العرض | حالة الاستخدام |
|---|---|---|
modal-sm |
300px | حواريات التأكيد |
| افتراضي | 500px | نماذج عامة |
modal-lg |
800px | نماذج كبيرة |
modal-xl |
1140px | محتوى كامل الحجم |
modal-fullscreen |
100vw | ملء الشاشة على الجوال |
5. المزيد من أمثلة الـ Carousel والـ Modal
▶ مثال: Carousel منتجات مع تسمية ومؤشرات
<!DOCTYPE html>
<html lang="ar">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Product Carousel</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container py-4">
<div id="productCarousel" class="carousel slide carousel-fade" data-bs-ride="carousel" data-bs-interval="3000">
<div class="carousel-indicators">
<button type="button" data-bs-target="#productCarousel" data-bs-slide-to="0" class="active"></button>
<button type="button" data-bs-target="#productCarousel" data-bs-slide-to="1"></button>
<button type="button" data-bs-target="#productCarousel" data-bs-slide-to="2"></button>
</div>
<div class="carousel-inner">
<div class="carousel-item active">
<img src="https://via.placeholder.com/800x400/0d6efd/fff?text=iPhone+15" class="d-block w-100" alt="Product 1">
<div class="carousel-caption d-none d-md-block bg-dark bg-opacity-50 rounded p-3">
<h5>iPhone 15 Pro</h5>
<p>Starting at $999 — A17 Pro chip, titanium design.</p>
</div>
</div>
<div class="carousel-item">
<img src="https://via.placeholder.com/800x400/198754/fff?text=MacBook+Air" class="d-block w-100" alt="Product 2">
<div class="carousel-caption d-none d-md-block bg-dark bg-opacity-50 rounded p-3">
<h5>MacBook Air M3</h5>
<p>Lightweight power — 18hr battery, 15-inch display.</p>
</div>
</div>
<div class="carousel-item">
<img src="https://via.placeholder.com/800x400/dc3545/fff?text=AirPods+Pro" class="d-block w-100" alt="Product 3">
<div class="carousel-caption d-none d-md-block bg-dark bg-opacity-50 rounded p-3">
<h5>AirPods Pro 2</h5>
<p>Adaptive audio, noise cancellation, USB-C.</p>
</div>
</div>
</div>
<button class="carousel-control-prev" type="button" data-bs-target="#productCarousel" data-bs-slide="prev">
<span class="carousel-control-prev-icon"></span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#productCarousel" data-bs-slide="next">
<span class="carousel-control-next-icon"></span>
</button>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
النتيجة: تأثير المكوّن بأنماط Bootstrap 5.3 (مثل الأزرار، البطاقات، الCarousel، الCollapse، إلخ). تستخدم الصفحة سمة Bootstrap الافتراضية (فاتحة) والشبكة المتجاوبة افتراضيًا.
▶ مثال: Modal مع نموذج مضمّن
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#feedbackModal">
Leave Feedback
</button>
<div class="modal fade" id="feedbackModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Send Feedback</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form>
<div class="mb-3">
<label class="form-label">Your Name</label>
<input type="text" class="form-control" placeholder="Enter name">
</div>
<div class="mb-3">
<label class="form-label">Rating</label>
<select class="form-select">
<option selected>5 - Excellent</option>
<option>4 - Good</option>
<option>3 - Average</option>
<option>2 - Poor</option>
<option>1 - Terrible</option>
</select>
</div>
<div class="mb-3">
<label class="form-label">Message</label>
<textarea class="form-control" rows="3" placeholder="Tell us about your experience..."></textarea>
</div>
</form>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button class="btn btn-primary">Submit</button>
</div>
</div>
</div>
</div>
النتيجة: تأثير المكوّن بأنماط Bootstrap 5.3 (مثل الأزرار، البطاقات، الCarousel، الCollapse، إلخ). تستخدم الصفحة سمة Bootstrap الافتراضية (فاتحة) والشبكة المتجاوبة افتراضيًا.
▶ مثال: Modal مع Carousel مضمّن
<button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#carouselModal">
View Gallery
</button>
<div class="modal fade" id="carouselModal" tabindex="-1">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Product Gallery</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-0">
<div id="galleryCarousel" class="carousel slide" data-bs-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<img src="https://via.placeholder.com/800x500/0d6efd/fff?text=Photo+1" class="d-block w-100" alt="Photo 1">
</div>
<div class="carousel-item">
<img src="https://via.placeholder.com/800x500/198754/fff?text=Photo+2" class="d-block w-100" alt="Photo 2">
</div>
<div class="carousel-item">
<img src="https://via.placeholder.com/800x500/dc3545/fff?text=Photo+3" class="d-block w-100" alt="Photo 3">
</div>
</div>
<button class="carousel-control-prev" type="button" data-bs-target="#galleryCarousel" data-bs-slide="prev">
<span class="carousel-control-prev-icon"></span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#galleryCarousel" data-bs-slide="next">
<span class="carousel-control-next-icon"></span>
</button>
</div>
</div>
</div>
</div>
</div>
النتيجة: تأثير المكوّن بأنماط Bootstrap 5.3 (مثل الأزرار، البطاقات، الCarousel، الCollapse، إلخ). تستخدم الصفحة سمة Bootstrap الافتراضية (فاتحة) والشبكة المتجاوبة افتراضيًا.
▶ مثال: Modal بخلفية ثابتة
<button type="button" class="btn btn-warning" data-bs-toggle="modal" data-bs-target="#staticModal">
Open with Static Backdrop
</button>
<div class="modal fade" id="staticModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1">
<div class="modal-dialog modal-sm modal-dialog-centered">
<div class="modal-content text-center">
<div class="modal-body py-4">
<div class="display-6 text-warning mb-3">⚠️</div>
<h5>Delete Account?</h5>
<p class="text-muted small">This action cannot be undone.</p>
<div class="d-grid gap-2">
<button class="btn btn-danger">Confirm Delete</button>
<button class="btn btn-outline-secondary" data-bs-dismiss="modal">Cancel</button>
</div>
</div>
</div>
</div>
</div>
النتيجة: تأثير المكوّن بأنماط Bootstrap 5.3 (مثل الأزرار، البطاقات، الCarousel، الCollapse، إلخ). تستخدم الصفحة سمة Bootstrap الافتراضية (فاتحة) والشبكة المتجاوبة افتراضيًا.
(1) مخطط تدفق تفاعل الـ Carousel والـ Modal
flowchart TD
subgraph Carousel
A[carousel slide] --> B[carousel-indicators (Indicators)]
A --> C[carousel-inner (Slides Container)]
C --> D[carousel-item active (Current Slide)]
C --> E[carousel-item (Other Slides)]
A --> F[carousel-control-prev/next (Previous/Next Arrows)]
D --> G[carousel-caption (Caption)]
end
subgraph Modal
H[modal fade (Backdrop)] --> I[modal-dialog (Dialog)]
I --> J[modal-content (Content Panel)]
J --> K[modal-header (Header)]
J --> L[modal-body (Body)]
J --> M[modal-footer (Footer)]
end
N[User Click] --> O{Target}
O -->|Carousel Indicator| B
O -->|Carousel Arrow| F
O -->|Open Button| H
O -->|Close Button| K
النتيجة: تأثير المكوّن بأنماط Bootstrap 5.3 (مثل الأزرار، البطاقات، الCarousel، الCollapse، إلخ). تستخدم الصفحة سمة Bootstrap الافتراضية (فاتحة) والشبكة المتجاوبة افتراضيًا.
| السمة data-bs-* | الهدف | القيم |
|---|---|---|
data-bs-ride="carousel" |
حاوية الـ Carousel | carousel / false |
data-bs-interval |
حاوية الـ Carousel | مللي ثانية (افتراضي 5000) |
data-bs-slide-to |
زر المؤشر | الفهرس (0،1،2...) |
data-bs-slide |
زر التحكم | prev / next |
data-bs-toggle="modal" |
عنصر التشغيل | modal |
data-bs-target="#id" |
عنصر التشغيل | معرّف الـ Modal الهدف |
data-bs-dismiss="modal" |
زر الإغلاق | modal |
data-bs-backdrop |
الـ Modal | true / false / static |
data-bs-keyboard |
الـ Modal | true / false |
data-bs-touch |
حاوية الـ Carousel | true / false |
| خيار الـ Carousel | سمة data | التأثير |
|---|---|---|
| تشغيل تلقائي | data-bs-ride="carousel" |
يبدأ التشغيل التلقائي عند تحميل الصفحة |
| الفاصل الزمني | data-bs-interval="2000" |
يبدّل الشرائح كل ثانيتين |
| انتقال التلاشي | فئة carousel-fade |
يتلاشى بدلاً من الانزلاق |
| إيقاف عند التمرير | data-bs-pause="hover" |
يتوقف عندما يكون الماوس فوقه |
| السحب باللمس | data-bs-touch="true" |
يُفعّل إيماءات السحب على الجوال |
| حلقة لا نهائية | data-bs-wrap="true" |
يعود إلى الشريحة الأولى بعد الأخيرة |
| حجم الـ Modal | الفئة | العرض | حالة الاستخدام |
|---|---|---|---|
| صغير | modal-sm |
300px | حواريات التأكيد، رسائل قصيرة |
| افتراضي | لا شيء | 500px | نماذج، عرض معلومات |
| كبير | modal-lg |
800px | نماذج كبيرة، جداول بيانات |
| كبير جدًا | modal-xl |
1140px | لوحات محتوى كاملة الحجم |
| ملء الشاشة | modal-fullscreen |
100vw | تجربة جوال غامرة |
❓ أسئلة شائعة
object-fit: cover مع height ثابت للـ Carousel.overflow لـ body على hidden. للسماح بالتمرير، أضف modal-dialog-scrollable إلى modal-dialog.data-bs-touch="true")، مما يسمح للمستخدمين بالسحب يسار/يمين بأصابعهم لتبديل الشرائح على أجهزة الجوال دون تكوين إضافي.📖 ملخص
- بنية الـ Carousel:
carousel slide>carousel-inner>carousel-item active، مع مؤشرات وأسهم سابق/تالي data-bs-ride="carousel"للتشغيل التلقائي،carousel-fadeلانتقال التلاشي- بنية الـ Modal:
modal fade>modal-dialog>modal-content(header + body + footer) - أحجام الـ Modal:
modal-sm/modal-lg/modal-xl/modal-fullscreen - كلاهما يعمل بسمات
data-bs-*؛ يجب تضمين Bootstrap JS
📝 تمارين
- ⭐ أنشئ Carousel لعرض المنتجات: 3 صور منتجات + تسميات (carousel-caption) + مؤشرات + أسهم سابق/تالي، تبديل تلقائي كل 3 ثوانٍ.
- ⭐⭐ نفّذ ميزة "عرض سريع": زر على بطاقة منتج يفتح Modal يعرض صورة كبيرة للمنتج والاسم والسعر والوصف وزر شراء.
- ⭐⭐⭐ أنشئ Modal ملء الشاشة (على الجوال) يحتوي على نموذج تسجيل (الاسم + البريد الإلكتروني + كلمة المرور).