0

I am currently trying to make multiple images which when click will have different pictures

for example when u click an snow mountain image it will show let say a beach image, something similar to this: Image modal that displays different image than the one clicked. but will also occur in more than 3 or 4 images

I used the code here: here: http://www.w3schools.com/howto/howto_css_modal_images.asp

this is the CODE:

// 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("myImg");
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";
}
body {font-family: Arial, Helvetica, sans-serif;}

#myImg {
  border-radius: 5px;
  cursor: pointer;
  transition: 0.3s;
}

#myImg:hover {opacity: 0.7;}

/* The Modal (background) */
.modal {
  display: none; /* Hidden by default */
  position: fixed; /* Stay in place */
  z-index: 1; /* Sit on top */
  padding-top: 100px; /* Location of the box */
  left: 0;
  top: 0;
  width: 100%; /* Full width */
  height: 100%; /* Full height */
  overflow: auto; /* Enable scroll if needed */
  background-color: rgb(0,0,0); /* Fallback color */
  background-color: rgba(0,0,0,0.9); /* Black w/ opacity */
}

/* Modal Content (image) */
.modal-content {
  margin:0px auto;
  display: block;
  width: 100%;
  max-width: 900px;
}

/* Caption of Modal Image */
#caption {
  margin: auto;
  display: block;
  width: 80%;
  max-width: 700px;
  text-align: center;
  color: #ccc;
  padding: 10px 0;
  height: 200px;
}

/* Add Animation */
.modal-content, #caption {  
  -webkit-animation-name: zoom;
  -webkit-animation-duration: 0.6s;
  animation-name: zoom;
  animation-duration: 0.6s;
}

@-webkit-keyframes zoom {
  from {-webkit-transform:scale(0)} 
  to {-webkit-transform:scale(1)}
}

@keyframes zoom {
  from {transform:scale(0)} 
  to {transform:scale(1)}
}

/* The Close Button */
.close {
  position: absolute;
  top: 15px;
  right: 35px;
  color: #f1f1f1;
  font-size: 40px;
  font-weight: bold;
  transition: 0.3s;
}

.close:hover,
.close:focus {
  color: #bbb;
  text-decoration: none;
  cursor: pointer;
}

/* 100% Image Width on Smaller Screens */
@media only screen and (max-width: 700px){
  .modal-content {
    width: 100%;
  }
}
<!-- Trigger the Modal -->
<img id="myImg" src="https://www.w3schools.com/howto/img_nature.jpg" alt="Snow" style="width:100%;max-width:300px">
<!-- The Modal -->
<div id="myModal" class="modal">
  <!-- The Close Button -->
  <span class="close">&times;</span>
  <!-- Modal Content (The Image) -->
  <img class="modal-content" src="https://www.w3schools.com/howto/img_snow.jpg">
  <!-- Modal Caption (Image Text) -->
  <div id="caption"></div>
</div>

<!-- Trigger the Modal -->
<img id="myImg" src="https://www.w3schools.com/howto/img_lights.jpg" alt="Snow" style="width:100%;max-width:300px">
<!-- The Modal -->
<div id="myModal" class="modal">
  <!-- The Close Button -->
  <span class="close">&times;</span>
  <!-- Modal Content (The Image) -->
  <img class="modal-content" src="https://www.w3schools.com/howto/img_mountains.jpg">
  <!-- Modal Caption (Image Text) -->
  <div id="caption"></div>
</div>

one of them works but the other one doesn't

I also used the codes and method over here, but also doesn't work: Modal image galleries - multiple images

same but i used another Javascript:

var modal = document.getElementById("myModal");
var i;

var img = document.getElementsByClassName("myImg");
var modalImg = document.getElementById("img01");

 for(i=0;i< img.length;i++)
   {    
    img[i].onclick = function(){

    modal.style.display = "block";
       modalImg.src = this.src;

 }
}

var span = document.getElementsByClassName("close")[0];


span.onclick = function() { 
   modal.style.display = "none";
}

but still doesn't work

can anyone help me?

and also if possible if you have a CSS to remove the space from the bottom and bring the picture to the top, this is how it looks like for my code: enter image description here

user3556983
  • 101
  • 1

3 Answers3

1

id must be unique for every img tag you can get id from onClick event.

function modal_open(clicked_id)
  {
     var modal = document.getElementById("myModal");

    var img = document.getElementById(clicked_id);
    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";
    }
  }
body {font-family: Arial, Helvetica, sans-serif;}

#myImg {
  border-radius: 5px;
  cursor: pointer;
  transition: 0.3s;
}

#myImg:hover {opacity: 0.7;}

/* The Modal (background) */
.modal {
  display: none; /* Hidden by default */
  position: fixed; /* Stay in place */
  z-index: 1; /* Sit on top */
  padding-top: 100px; /* Location of the box */
  left: 0;
  top: 0;
  width: 100%; /* Full width */
  height: 100%; /* Full height */
  overflow: auto; /* Enable scroll if needed */
  background-color: rgb(0,0,0); /* Fallback color */
  background-color: rgba(0,0,0,0.9); /* Black w/ opacity */
}

/* Modal Content (image) */
.modal-content {
  margin:0px auto;
  display: block;
  width: 100%;
  max-width: 900px;
}

/* Caption of Modal Image */
#caption {
  margin: auto;
  display: block;
  width: 80%;
  max-width: 700px;
  text-align: center;
  color: #ccc;
  padding: 10px 0;
  height: 200px;
}

/* Add Animation */
.modal-content, #caption {  
  -webkit-animation-name: zoom;
  -webkit-animation-duration: 0.6s;
  animation-name: zoom;
  animation-duration: 0.6s;
}

@-webkit-keyframes zoom {
  from {-webkit-transform:scale(0)} 
  to {-webkit-transform:scale(1)}
}

@keyframes zoom {
  from {transform:scale(0)} 
  to {transform:scale(1)}
}

/* The Close Button */
.close {
  position: absolute;
  top: 15px;
  right: 35px;
  color: #f1f1f1;
  font-size: 40px;
  font-weight: bold;
  transition: 0.3s;
}

.close:hover,
.close:focus {
  color: #bbb;
  text-decoration: none;
  cursor: pointer;
}

/* 100% Image Width on Smaller Screens */
@media only screen and (max-width: 700px){
  .modal-content {
    width: 100%;
  }
}
<!-- Trigger the Modal -->
<img id="myImg" src="https://www.w3schools.com/howto/img_nature.jpg" alt="Snow" style="width:100%;max-width:300px" onmouseover="modal_open(this.id)">
<img id="myImg1" src="https://www.w3schools.com/howto/img_lights.jpg" alt="Snow" style="width:100%;max-width:300px" onmouseover="modal_open(this.id)">

<!-- The Modal -->
<div id="myModal" class="modal">
  <span class="close">&times;</span>
  <img class="modal-content" id="img01">
  <div id="caption"></div>
</div>
Robin Hood
  • 710
  • 3
  • 16
  • unfortunately that's not what i'm looking for, when you click on any of the pictures, it will open a different picture, just like the one the first picture in my code – user3556983 May 30 '22 at 09:56
  • @user3556983 your example goes in a different direction. please improve your question and mention better example related to your question – Robin Hood May 30 '22 at 10:01
  • what i meant is that when you click on an image it will show a different image for example when u click an snow mountain image it will show let say a beach image – user3556983 May 30 '22 at 10:04
  • some like this example: https://stackoverflow.com/questions/63732061/image-modal-that-displays-different-image-than-the-one-clicked. but it will also occur on other images too – user3556983 May 30 '22 at 10:05
0

Your error is because the onclick function attempting to assign the url to src of the <img> element that "suppose" comes with the ID img01, but the html doesn't have the <img> with the id.

Refer to @Robin Hood answer, his code explains the proper way of implementation.

Jerry
  • 1,455
  • 1
  • 18
  • 39
0

Based off of the answer from @Robin Hood I adapted it slightly to let you specify a path of your choice using a data attribute on the image.

So like

<img id="myImg1" src="https://www.w3schools.com/howto/img_lights.jpg" alt="Snow" data-path="https://picsum.photos/500?random=2" style="width:100%;max-width:300px" onmouseover="modal_open(this.id)">

The data-path="https://picsum.photos/500?random=2" is the where you put the source URL for the image you want to appear in the modal.

There is also a small JS tweak, the CSS remained the same

function modal_open(clicked_id)
  {
    var modal = document.getElementById("myModal");

    var img = document.getElementById(clicked_id);
    var modalImg = document.getElementById("img01");
    var captionText = document.getElementById("caption");
    img.onclick = function(){
      modal.style.display = "block";
      modalImg.src = this.dataset.path; /* THIS IS THE ONLY JS CHANGE */
      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";
    }
  }
body {font-family: Arial, Helvetica, sans-serif;}

#myImg {
  border-radius: 5px;
  cursor: pointer;
  transition: 0.3s;
}

#myImg:hover {opacity: 0.7;}

/* The Modal (background) */
.modal {
  display: none; /* Hidden by default */
  position: fixed; /* Stay in place */
  z-index: 1; /* Sit on top */
  padding-top: 100px; /* Location of the box */
  left: 0;
  top: 0;
  width: 100%; /* Full width */
  height: 100%; /* Full height */
  overflow: auto; /* Enable scroll if needed */
  background-color: rgb(0,0,0); /* Fallback color */
  background-color: rgba(0,0,0,0.9); /* Black w/ opacity */
}

/* Modal Content (image) */
.modal-content {
  margin:0px auto;
  display: block;
  width: 100%;
  max-width: 900px;
}

/* Caption of Modal Image */
#caption {
  margin: auto;
  display: block;
  width: 80%;
  max-width: 700px;
  text-align: center;
  color: #ccc;
  padding: 10px 0;
  height: 200px;
}

/* Add Animation */
.modal-content, #caption {  
  -webkit-animation-name: zoom;
  -webkit-animation-duration: 0.6s;
  animation-name: zoom;
  animation-duration: 0.6s;
}

@-webkit-keyframes zoom {
  from {-webkit-transform:scale(0)} 
  to {-webkit-transform:scale(1)}
}

@keyframes zoom {
  from {transform:scale(0)} 
  to {transform:scale(1)}
}

/* The Close Button */
.close {
  position: absolute;
  top: 15px;
  right: 35px;
  color: #f1f1f1;
  font-size: 40px;
  font-weight: bold;
  transition: 0.3s;
}

.close:hover,
.close:focus {
  color: #bbb;
  text-decoration: none;
  cursor: pointer;
}

/* 100% Image Width on Smaller Screens */
@media only screen and (max-width: 700px){
  .modal-content {
    width: 100%;
  }
}
<!-- Trigger the Modal -->
<img id="myImg" src="https://www.w3schools.com/howto/img_nature.jpg" alt="Snow" data-path="https://picsum.photos/500?random=1" style="width:100%;max-width:300px" onmouseover="modal_open(this.id)">
<img id="myImg1" src="https://www.w3schools.com/howto/img_lights.jpg" alt="Snow" data-path="https://picsum.photos/500?random=2" style="width:100%;max-width:300px" onmouseover="modal_open(this.id)">

<!-- The Modal -->
<div id="myModal" class="modal">
  <span class="close">&times;</span>
  <img class="modal-content" id="img01">
  <div id="caption"></div>
</div>
Simp4Code
  • 1,394
  • 1
  • 2
  • 11
  • thank u, thank u very much simp4code, just one favor, i showed a screenshot of my modal image when click, how can i move the modal image a little bit more up – user3556983 May 30 '22 at 10:17
  • Adjust the padding top of .modal in the CSS `padding-top: 100px; /* Location of the box */` You can lower this, maybe like 50px? It's up to you really, it works even with 0, the modal close button still sits above the image so adjust to your liking – Simp4Code May 30 '22 at 10:25