DEV Community

Cover image for Multiple CSS Modal Images on a single page with PHP
Jibril Dauda Muhammad
Jibril Dauda Muhammad

Posted on

Multiple CSS Modal Images on a single page with PHP

If you've been wondering how to have more than one modal image on one page then this should be of help to you, with a little tweak of our css you can get your code running

After going through different solutions across the web on having more than one modal image on page, i finally achieve this with the help of a php code.

Before proceeding you should be familiar with 'id' attributes, they are unique way of identifying HTML element on a page, the value can be use to perform certain task by calling it through CSS or javascript, in this tutorial we'll be getting our id from a php variable.

Below is the folder structure we'll be using, inside the image folder we'll create additional folders to hold single image file you can name this folder anything but make sure its a unique name: so i decide to use numbers

Alt Text

Note: the html, css, javascript is gotten from here w3school we will setup the php path ourselve:

connect.php for database connection

<?php 
$con = mysqli_connect("localhost", "root", "", "imagemodal");

if (!$con) {
    die("Connection failed: " .mysqli_connect_error());
}
?>

imagetb.sql which hold the table field and corresponding data:

-- Database: `imagemodal`
-- Table structure for table `imagetb`
CREATE TABLE `imagetb` (
  `imageId` int(11) NOT NULL AUTO_INCREMENT,
  `imageName` varchar(200) NOT NULL UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- Dumping data for table `imagetb`
INSERT INTO `imagetb` (`imageId`, `imageName`) VALUES
(1, 'Chrysanthemum'),
(2, 'Lighthouse'),
(3, 'Desert'),
(4, 'Hydrangeas');

header.php for page hearder

<!DOCTYPE html>
<html>
<head>
    <title>Multiple Modal Images on One Page</title>

    <meta charset='utf-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0, user-scalable=no, maximum-scale=1.0, minimal-ui' />

    <style type='text/css'>
        body{
        font-size: 16px;
            line-height: 1.5; 
    }  
    </style>
</head>

modal.style.php this hold our stylesheet which is here w3School

index.php our main file

*.First we will include the required file first

<?php
include 'connect.php';
include 'header.php';
include 'modal.style.php';
?>

*. After including the required file, we will fetch the values from imagetb in our case we have only two that is imageId and imageName

<?php
echo "<p>Multiple Modal Images on a Single page</p>";
$output1 = "SELECT * FROM imagetb";
$result1 = $con->query($output1) or die($con->error);
?>

*. We will fetch all our result row as an associative array into a while block and create two variables inside it, the $imageId in this case is an auto_incremented value from our db, that was the reason behind naming the individual folders in which our images will be placed with number

<?php
echo "<div>";
    while ($row = $result1->fetch_assoc()) {

        $imageId = $row['imageId'];
        $imageName = $row['imageName'];

    }
    echo "</div>";
?>

*. Inside the while block and immediately after the two variables, we will create another variable which will point to the directory where our image files are and use a while block to open up all the folder inside the images folder

<?php
echo "<div>";
        $dir = "images/".$imageId."/";
        $open = opendir($dir);

        while (($file = readdir($open)) != false) {
            if ($file != "." && $file != ".." && $file != "Thumbs.db") {
                echo"<img id='$imageId' src='$dir/$file' alt='$imageName' style='height:300px; width:200px; border-radius: 10%;'>
                        ";
            }
        }

        echo "<h4 style='text-align:center' id='".$imageId."'>".$imageName."</h4>";
?>

*. Create a div tag immediately after the above while block which will hold our modal images when clicked

<?php
echo "
            <!-- The Modal -->
            <div id='myModal' class='modal'>
                <span class='close'>&times;</span>
                <img class='modal-content' id='img01' style='height:300px; width:200px; border-radius: 10%;'>
                <div id='caption'></div>
            </div>
        ";
        echo "</div>";
?>

*. Create a script tag, immediately after the above div with the following content. So what happens is that whenever an image is clicked, it will be collected with a unique id and inserted into the modal div. Basically the var img = document.getElementById('$imageId'); is been changed when an image is clicked so it save us the id problem

<?php
echo "
            <script>
                // Get the modal
                var modal = document.getElementById('myModal');

                // Get the image and insert it inside the modal - use its 'alt' text as a caption
                var img = document.getElementById('$imageId');
                var modalImg = document.getElementById('img01');
                var captionText = document.getElementById('caption');
                img.onclick = function(){
                    modal.style.display = 'block';
                    modalImg.src = this.src;
                    captionText.innerHTML = this.alt;
                }

                // Get the <span> element that closes the modal
                var span = document.getElementsByClassName('close')[0];

                // When the user clicks on <span> (x), close the modal
                span.onclick = function() { 
                    modal.style.display = 'none';
                }
            </script>
        ";
?>

*. Here is the complete look of our index.php

<?php  

    include 'connect.php';
    include 'header.php';
    include 'modal.style.php';

    echo "<p>Multiple Modal Images on a Single page</p>";
    $output1 = "SELECT * FROM imagetb";
    $result1 = $con->query($output1) or die($con->error);

    echo "<div>";
    while ($row = $result1->fetch_assoc()) {

        $imageId = $row['imageId'];
        $imageName = $row['imageName'];


        echo "<div>";
        $dir = "images/".$imageId."/";
        $open = opendir($dir);

        while (($file = readdir($open)) != false) {
            if ($file != "." && $file != ".." && $file != "Thumbs.db") {
                echo"<img id='$imageId' src='$dir/$file' alt='$imageName' style='height:300px; width:200px; border-radius: 10%;'>
                        ";
            }
        }

        echo "<h4 style='text-align:center' id='".$imageId."'>".$imageName."</h4>";

        echo "
            <!-- The Modal -->
            <div id='myModal' class='modal'>
                <span class='close'>&times;</span>
                <img class='modal-content' id='img01' style='height:300px; width:200px; border-radius: 10%;'>
                <div id='caption'></div>
            </div>
        ";
        echo "</div>";
        echo "
            <script>
                // Get the modal
                var modal = document.getElementById('myModal');

                // Get the image and insert it inside the modal - use its 'alt' text as a caption
                var img = document.getElementById('$imageId');
                var modalImg = document.getElementById('img01');
                var captionText = document.getElementById('caption');
                img.onclick = function(){
                    modal.style.display = 'block';
                    modalImg.src = this.src;
                    captionText.innerHTML = this.alt;
                }

                // Get the <span> element that closes the modal
                var span = document.getElementsByClassName('close')[0];

                // When the user clicks on <span> (x), close the modal
                span.onclick = function() { 
                    modal.style.display = 'none';
                }
            </script>
        ";
    }
    echo "</div>";
?>

Here is where my post ends and wishing you a better coding experience, the entire project can be clone from my github repo

GitHub logo mdjibril / multiple-modal-image

How to create a css multiple modal image on a single page



. Happy Coding

Top comments (0)