Create a Modal Image Gallery (Lightbox) with CSS and JavaScript: A Complete Guide
Create A Lightbox
The following example combines code from Modals and Slideshows to create the lightbox.
Step 1) Add HTML:
<!-- Images used to open the lightbox --> <div class="row"> <div class="column"> <img src="img1.jpg" onclick="openModal();currentSlide(1)" class="hover-shadow"> </div> <div class="column"> <img src="img2.jpg" onclick="openModal();currentSlide(2)" class="hover-shadow"> </div> <div class="column"> <img src="img3.jpg" onclick="openModal();currentSlide(3)" class="hover-shadow"> </div> <div class="column"> <img src="img4.jpg" onclick="openModal();currentSlide(4)" class="hover-shadow"> </div> </div> <!-- The Modal/Lightbox --> <div id="myModal" class="modal"> <span class="close cursor" onclick="closeModal()">×</span> <div class="modal-content"> <div class="mySlides"> <div class="numbertext">1 / 4</div> <img src="img1_wide.jpg" style="width:100%"> </div> <div class="mySlides"> <div class="numbertext">2 / 4</div> <img src="img2_wide.jpg" style="width:100%"> </div> <div class="mySlides"> <div class="numbertext">3 / 4</div> <img src="img3_wide.jpg" style="width:100%"> </div> <div class="mySlides"> <div class="numbertext">4 / 4</div> <img src="img4_wide.jpg" style="width:100%"> </div> <!-- Next/previous controls --> <a class="prev" onclick="plusSlides(-1)">❮</a> <a class="next" onclick="plusSlides(1)">❯</a> <!-- Caption text --> <div class="caption-container"> <p id="caption"></p> </div> <!-- Thumbnail image controls --> <div class="column"> <img class="demo" src="img1.jpg" onclick="currentSlide(1)" alt="Nature"> </div> <div class="column"> <img class="demo" src="img2.jpg" onclick="currentSlide(2)" alt="Snow"> </div> <div class="column"> <img class="demo" src="img3.jpg" onclick="currentSlide(3)" alt="Mountains"> </div> <div class="column"> <img class="demo" src="img4.jpg" onclick="currentSlide(4)" alt="Lights"> </div> </div> </div>
Step 2) Add CSS:
.row > .column { padding: 0 8px; } .row:after { content: ""; display: table; clear: both; } /* Create four equal columns that floats next to eachother */ .column { float: left; width: 25%; } /* The Modal (background) */ .modal { display: none; position: fixed; z-index: 1; padding-top: 100px; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: black; } /* Modal Content */ .modal-content { position: relative; background-color: #fefefe; margin: auto; padding: 0; width: 90%; max-width: 1200px; } /* The Close Button */ .close { color: white; position: absolute; top: 10px; right: 25px; font-size: 35px; font-weight: bold; } .close:hover, .close:focus { color: #999; text-decoration: none; cursor: pointer; } /* Hide the slides by default */ .mySlides { display: none; } /* Next & previous buttons */ .prev, .next { cursor: pointer; position: absolute; top: 50%; width: auto; padding: 16px; margin-top: -50px; color: white; font-weight: bold; font-size: 20px; transition: 0.6s ease; border-radius: 0 3px 3px 0; user-select: none; -webkit-user-select: none; } /* Position the "next button" to the right */ .next { right: 0; border-radius: 3px 0 0 3px; } /* On hover, add a black background color with a little bit see-through */ .prev:hover, .next:hover { background-color: rgba(0, 0, 0, 0.8); } /* Number text (1/3 etc) */ .numbertext { color: #f2f2f2; font-size: 12px; padding: 8px 12px; position: absolute; top: 0; } /* Caption text */ .caption-container { text-align: center; background-color: black; padding: 2px 16px; color: white; } img.demo { opacity: 0.6; } .active, .demo:hover { opacity: 1; } img.hover-shadow { transition: 0.3s; } .hover-shadow:hover { box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); }
Step 3) Add JavaScript:
<script> // Open the Modal function openModal() { document.getElementById("myModal").style.display = "block"; } // Close the Modal function closeModal() { document.getElementById("myModal").style.display = "none"; } var slideIndex = 1; showSlides(slideIndex); // Next/previous controls function plusSlides(n) { showSlides(slideIndex += n); } // Thumbnail image controls function currentSlide(n) { showSlides(slideIndex = n); } function showSlides(n) { var i; var slides = document.getElementsByClassName("mySlides"); var dots = document.getElementsByClassName("demo"); var captionText = document.getElementById("caption"); if (n > slides.length) {slideIndex = 1} if (n < 1) {slideIndex = slides.length} for (i = 0; i < slides.length; i++) { slides[i].style.display = "none"; } for (i = 0; i < dots.length; i++) { dots[i].className = dots[i].className.replace(" active", ""); } slides[slideIndex-1].style.display = "block"; dots[slideIndex-1].className += " active"; captionText.innerHTML = dots[slideIndex-1].alt; } </script>
1. HTML Structure:
-
The gallery is made up of several
div
elements, each containing an image in a grid layout. The images are inside therow
container, and each image is placed inside acolumn
to make the layout responsive.- Each
img
tag inside the gallery has anonclick
event that opens the modal and displays the full-size version of the clicked image by calling theopenModal()
function and passing the index of the clicked image usingcurrentSlide(n)
.
- Each
-
The modal structure (with
id="myModal"
) contains several child elements:- Modal Content (
modal-content
): This contains the slides (images), navigation buttons, and a caption container. - Slides (
mySlides
): These represent the larger images that will be displayed in the modal. Each slide corresponds to a thumbnail. - Navigation Buttons (
prev
andnext
): These allow users to navigate between images in the modal. - Close Button (
×
): This closes the modal when clicked. - Thumbnail Images for Navigation (
demo
): These are smaller versions of the images below the modal, which users can click to jump to a specific image in the modal.
- Modal Content (
2. CSS Styling:
-
Body and Layout:
- The
body
usesfont-family: Verdana
andmargin: 0
to remove default margins and apply a simple font. - The
.row
and.column
classes help in creating a responsive grid layout for the thumbnail images, usingfloat: left
to position the columns andwidth: 25%
to make them evenly spaced.
- The
-
Modal Styling:
- The
.modal
class makes the modal initially hidden (display: none
) and positions it fixed on the screen when visible. - The
.modal-content
class defines the container for the full-size images, and it is centered with a width of90%
(maximum1200px
). - The
.close
class styles the close button (×
) at the top-right of the modal. - The
.prev
and.next
classes style the previous and next navigation buttons, which are positioned at the left and right sides of the modal, respectively.
- The
-
Hover Effects and Image Styling:
- The
hover-shadow
class adds a transition effect to the images. When hovered, they get a subtle box-shadow effect (box-shadow: 0 4px 8px
), enhancing the visual appearance.
- The
-
Thumbnails Navigation:
- Thumbnails below the modal have the class
demo
, and when hovered or clicked, they change opacity to indicate they are active. - The
.active
class highlights the active thumbnail (the one that corresponds to the image currently displayed in the modal).
- Thumbnails below the modal have the class
3. JavaScript Functionality:
-
openModal()
: This function is triggered when a user clicks on any of the thumbnail images. It makes the modal visible by settingdisplay: block
on the modal. -
closeModal()
: This function is called when the user clicks the close button (×). It hides the modal by settingdisplay: none
. -
Slide Index Management (
slideIndex
):slideIndex
is used to track which image is currently being displayed in the modal. Initially, it is set to1
, meaning the first image in the modal is shown.
-
Navigation Functions (
plusSlides(n)
andcurrentSlide(n)
):plusSlides(n)
moves the slide forward or backward by updatingslideIndex
byn
.currentSlide(n)
directly shows the slide that corresponds to the givenn
(by clicking on a thumbnail).
-
showSlides(n)
:- This function controls which slide is displayed based on
slideIndex
. It hides all slides and then shows the current slide (slides[slideIndex-1]
). - It also updates the active state of the thumbnail images by adding/removing the
active
class. Additionally, it updates the caption text (e.g., “Nature and sunrise”).
- This function controls which slide is displayed based on
-
Handling Navigation Buttons:
- The
prev
andnext
buttons callplusSlides(-1)
andplusSlides(1)
to navigate backward and forward between images, respectively. - The
showSlides
function is called after every navigation action to update the display.
- The
Conclusion:
This is a complete lightbox image gallery with navigation and a full-screen modal effect. It demonstrates how to use HTML, CSS, and JavaScript to create an interactive gallery experience where users can view images in a larger format with smooth transitions and navigation controls.