Haben Sie schon einmal auf ein Bild auf einer Webseite geklickt, das eine größere Version des Bildes mit Navigationsmöglichkeiten zum Anzeigen anderer Fotos öffnet?
Manche Leute nennen es Pop-up. Andere nennen es Lightbox. Bootstrap nennt es Modal. Ich erwähne Bootstrap, weil ich es verwenden möchte, um die gleiche Art von Ding zu machen. Nennen wir es also von nun an Modal.
Warum Bootstrap? könnten Sie fragen. Nun, aus mehreren Gründen
- Ich verwende Bootstrap bereits auf der Website, auf der ich diesen Effekt erzielen möchte, sodass keine zusätzlichen Ressourcen geladen werden müssen.
- Ich möchte etwas, bei dem ich die Ästhetik vollständig und einfach kontrollieren kann. Bootstrap ist im Vergleich zu den meisten Modal-Plugins, auf die ich gestoßen bin, eine saubere Weste.
- Die von mir benötigte Funktionalität ist ziemlich einfach. Es gibt nicht viel zu gewinnen, wenn man alles von Grund auf neu codiert. Ich betrachte die Zeit, die ich durch die Verwendung des Bootstrap-Frameworks spare, als vorteilhafter als mögliche Nachteile.
Hier landen wir
Gehen wir das Schritt für Schritt durch.
Schritt 1: Erstellen Sie das Raster der Bildergalerie
Beginnen wir mit dem Markup für ein Rasterlayout von Bildern. Dafür können wir das Grid-System von Bootstrap verwenden.
<div class="row" id="gallery">
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-1">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-2">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-3">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-4">
</div>
</div>
Jetzt benötigen wir Datenattribute, um diese Bilder interaktiv zu machen. Bootstrap betrachtet Datenattribute, um herauszufinden, welche Elemente interaktiv sein sollen und was sie tun sollen. In diesem Fall erstellen wir Interaktionen, die die Modal-Komponente öffnen und das Durchscrollen der Bilder mit der Carousel-Komponente ermöglichen.
Über diese Datenattribute
- Wir fügen
data-toggle="modal"unddata-target="#exampleModal"dem Elternelement(#gallery) hinzu. Dadurch wird das Modal geöffnet, wenn auf etwas in der Galerie geklickt wird. Wir sollten auch den Wert von data-target (#exampleModal) als ID des Modals selbst hinzufügen, aber das machen wir, sobald wir zum Modal-Markup kommen. - Fügen wir
data-target="#carouselExample"und eindata-slide-to-Attribut zu jedem Bild hinzu. Wir könnten diese auch zu den Bild-Wrappern hinzufügen, aber wir entscheiden uns in diesem Beitrag für die Bilder. Später werden wir den Wert von data-target (#carouselExample) als ID für den Carousel verwenden, also merken Sie sich das für später. Die Werte fürdata-slide-tobasieren auf der Reihenfolge der Bilder.
Hier ist, was wir zusammen bekommen
<div class="row" id="gallery" data-toggle="modal" data-target="#exampleModal">
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-1.jpg" data-target="#carouselExample" data-slide-to="0">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-2.jpg" data-target="#carouselExample" data-slide-to="1">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-3.jpg" data-target="#carouselExample" data-slide-to="2">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-4.jpg" data-target="#carouselExample" data-slide-to="3">
</div>
</div>
Möchten Sie mehr über Datenattribute erfahren? Schauen Sie sich den CSS-Tricks Leitfaden dazu an.
Schritt 2: Lassen Sie das Modal funktionieren
Dies ist ein Carousel innerhalb eines Modals, beides sind Standard-Bootstrap-Komponenten. Wir verschachteln hier im Grunde nur eine in die andere. Ziemlich eine Kopie-und-Einfüge-Aufgabe aus der Bootstrap-Dokumentation.
Hier sind jedoch einige wichtige Punkte, auf die Sie achten sollten
- Die Modal-ID sollte mit dem
data-targetdes Galerieelements übereinstimmen. - Die Carousel-ID sollte mit dem
data-targetder Bilder in der Galerie übereinstimmen. - Die Carousel-Slides sollten mit den Galeriebildern übereinstimmen und in der richtigen Reihenfolge sein.
Hier ist das Markup für das Modal mit unseren Attributen
<!-- Modal markup: https://getbootstrap.com/docs/4.4/components/modal/ -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<!-- Carousel markup goes here -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
Wir können das Carousel-Markup direkt hineinlegen, Voltron-Stil!
<!-- Modal markup: https://getbootstrap.com/docs/4.4/components/modal/ -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<!-- Carousel markup: https://getbootstrap.com/docs/4.4/components/carousel/ -->
<div id="carouselExample" class="carousel slide" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<img class="d-block w-100" src="/image-1.jpg">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="/image-2.jpg">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="/image-3.jpg">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="/image-4.jpg">
</div>
</div>
<a class="carousel-control-prev" href="#carouselExample" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselExample" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
Sieht nach viel Code aus, oder? Wieder ist es im Grunde direkt aus der Bootstrap-Dokumentation, nur mit unseren Attributen und Bildern.
Schritt 3: Umgang mit Bildgrößen
Dies ist nicht unbedingt erforderlich, aber wenn die Bilder im Carousel unterschiedliche Abmessungen haben, können wir sie mit CSS zuschneiden, um die Konsistenz zu wahren. Beachten Sie, dass wir hier Sass verwenden.
// Use Bootstrap breakpoints for consistency.
$bootstrap-sm: 576px;
$bootstrap-md: 768px;
$bootstrap-lg: 992px;
$bootstrap-xl: 1200px;
// Crop thumbnail images.
#gallery {
img {
height: 75vw;
object-fit: cover;
@media (min-width: $bootstrap-sm) {
height: 35vw;
}
@media (min-width: $bootstrap-lg) {
height: 18vw;
}
}
}
// Crop images in the coursel
.carousel-item {
img {
height: 60vw;
object-fit: cover;
@media (min-width: $bootstrap-sm) {
height: 350px;
}
}
}
Schritt 4: Optimieren Sie die Bilder
Sie haben vielleicht bemerkt, dass das Markup die gleichen Bilddateien in der Galerie wie im Modal verwendet. Das muss nicht sein. Tatsächlich ist es besser, kleinere, performantere Versionen der Bilder für die Galerie zu verwenden. Wir werden die Bilder im Modal sowieso in ihrer vollen Größe anzeigen, daher gibt es keinen Grund, die beste Qualität im Voraus zu haben.
Das Gute an Bootstraps Ansatz hier ist, dass wir andere Bilder in der Galerie als im Modal verwenden können. Sie sind nicht gegenseitig ausschließend, dass sie auf dieselbe Datei verweisen müssen.
Daher würde ich vorschlagen, das Galerie-Markup mit Bildern geringerer Qualität zu aktualisieren
<div class="row" id="gallery" data-toggle="modal" data-target="#exampleModal">
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-1-small.jpg" data-target="#carouselExample" data-slide-to="0">
<!-- and so on... -->
</div>
Das war's!
Die Website, auf der ich dies verwende, hat Bootstrap bereits thematisiert. Das bedeutet, dass alles bereits nach Vorgabe gestaltet ist. Dennoch können Sie, auch wenn Sie Bootstrap nicht thematisiert haben, problemlos benutzerdefinierte Stile hinzufügen! Mit diesem Ansatz (Bootstrap vs. Plugins) ist die Anpassung schmerzfrei, da Sie die volle Kontrolle über das Markup haben und das Bootstrap-Styling relativ spärlich ist.
Hier ist die endgültige Demo
Dies ist ein sehr schönes Tutorial, das Ergebnis scheint jedoch auf meinem Pixel 2xl-Display kaputt zu sein. Die Karte funktioniert einwandfrei, aber der Carousel im Ergebnis-Tab funktioniert nicht, ich bekomme nur die Bilder vertikal angezeigt.
Hallo Damian, danke fürs Lesen. Auf kleinen Bildschirmen ist das anfängliche Foto-Raster eine einzige Spalte. Und wenn Sie auf eines der Bilder tippen/klicken, wird der Carousel geöffnet. Auf größeren Bildschirmen hat das Foto-Raster je nach Bildschirmgröße zwei oder vier Spalten. Hier ist ein kurzes Demo-Video, das zeigt, wie es funktioniert: https://www.loom.com/share/eb637f33edc84b0c9644b93c8b78f221
Sehen Sie etwas anderes auf Ihrer Seite?
Sie hatten Recht, Diego, mein Fehler. Ich weiß nicht, warum ich nicht auf das Bild getippt habe, um das Modal zu öffnen ♂️. Tolle Arbeit, danke!
Gern geschehen! Schön, dass es funktioniert.
Vielen Dank dafür.
Mein Carousel wird jedoch am unteren Rand der Seite angezeigt – wie kann ich es ausblenden, bis jemand auf die Bilder klickt?
Hallo Joy. Haben Sie die Modal-Klassen und Datenattribute zum Carousel oder seinem Container hinzugefügt?
Diego, würdest du ein Video-Tutorial dazu machen? Ich konnte es nicht ganz zum Laufen bringen. Ich bin ziemlich neu im Programmieren.
Hallo Alex, ich helfe Ihnen gerne weiter. Können Sie erklären, welches Problem Sie haben oder was Sie näher erläutert haben möchten?
Danke Diego, ich konnte es aber nicht zum Laufen bringen.
Was ich getan habe
1. Die HTML-Datei mit dem Grid der Bildergalerie und dem Modal-Markup erstellt
Die einzige Änderung war der Speicherort des zu verwendenden Bildes (ich habe Bilder von meinem lokalen System verwendet)
Ich hatte Bootstrap bereits referenziert
(
)
Die SCSS-Datei kopiert und Sass verwendet, um sie in eine CSS-Datei zu konvertieren (keine Änderung daran)
Die JS-Datei wurde nach dem Body-Tag zur HTML-Datei hinzugefügt
Problem
Ich kann nicht auf das Bild klicken
Was mache ich falsch?
danke
Hallo Deji,
Versuchen Sie, eine einfache Modal-Komponente auf der Seite (oder einer neuen Seite) hinzuzufügen. Ein einfacher Button, der ein Demo-Modal öffnet, wird funktionieren. Das hilft Ihnen, das Problem zu isolieren. Wenn das nicht funktioniert, gibt es möglicherweise ein Problem mit Bootstrap auf Ihrer Website. Wenn es funktioniert, können Sie die Teile der Modal-Galerie Schritt für Schritt hinzufügen, um zu sehen, wann es aufhört zu funktionieren. Ändern Sie zum Beispiel den Button in ein Bild, fügen Sie dann mehrere Bilder hinzu, dann den Carousel usw. Viel Erfolg!
Hallo, ich verwende ein Grid in einer foreach-Schleife, aber jedes Mal, wenn ich auf das Bild klicke, um das Modal zu öffnen, wird der erste Artikel anstelle des Artikels, auf den ich geklickt habe, geöffnet. Weißt du, was das verursachen könnte?
Hallo Andy, es klingt so, als würden Ihnen einige Datenattribute fehlen. Jedes Grid-Element muss ein
data-target- und eindata-slide-to-Attribut haben. Derdata-target-Wert sollte dieidIhres Carousels sein (für alle Grid-Elemente gleich), und derdata-slide-to-Wert sollte der Index des entsprechenden Carousel-Slides sein (einzigartig für jedes Grid-Element), beginnend mit 0. Überprüfen Sie die Codebeispiele in Schritt 1 für ein Beispiel. Ich hoffe, das hilft.Tolle Arbeit, Diego, es hat auf meiner Seite gut funktioniert. Ich möchte nur wissen, ob es eine Möglichkeit gibt, das benutzerdefinierte Styling standardmäßig ohne Button anzuzeigen
Danke George, schön, dass es bei Ihnen funktioniert. Sie können die Komponenten beliebig gestalten. Der Button dient nur zur Demo, um den Unterschied zwischen dem Standard-Styling und einem Beispiel für benutzerdefiniertes Styling zu zeigen.
Wenn Sie das benutzerdefinierte Styling aus der Demo verwenden möchten, können Sie
.customin den Zeilen 53 und 67 des CSS entfernen.Vielen Dank für dieses Tutorial. Ich habe jedoch ein Problem: Wenn ich 1 bis 3 Bilder klicke, werden die richtigen Bilder für jedes Bild angezeigt, aber mehr als das funktioniert nicht mehr. Wenn ich zum Beispiel auf Nr. 1 klicke, wird Nr. 1 angezeigt, aber wenn ich auf Nr. 4 klicke, wird mir das zuletzt geöffnete Bild angezeigt. Können Sie mir helfen?
Hallo zizi, Sie müssen möglicherweise die
data-slide-to-Attribute Ihrer Galeriebilder überprüfen. Jedes Bild sollte dieses auf den entsprechenden Slide im Carousel gesetzt haben, beginnend mit Null für den ersten. Für Bild Nr. 1 ist es also0und für Bild Nr. 4 ist es3.