Obrazy modalne z opisem obrazu

Znalazłem tutaj ten kod dotyczący tworzenia wielu obrazów modalnych. Jednak nie mogę znaleźć najlepszego sposobu na dodanie tekstu opisu wraz z nim, gdy otwieram modal. Podążałem za kodem od drugiej do ostatniej odpowiedzi w tym poście: Kilka obrazów modalnych na stronie co bardzo mi pomogło, ale potrzebuję tekstu opisu, a nie podpisu. Byłoby bardzo wdzięczne, gdyby ktoś chciał mi pomóc rozwiązać ten problem. Z góry dziękuję!

KOD:

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

#myImg:hover {
  opacity: 0.7;
}

.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 {
  margin: auto;
  display: block;
  width: 80%;
  max-width: 700px;
}

#text {
  margin: auto;
  display: block;
  width: 80%;
  max-width: 700px;
  text-align: center;
  color: #ccc;
  padding: 10px 0;
  height: 150px;
}

.modal-content,
#text {
  animation-name: zoom;
  animation-duration: 0.6s;
}

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

.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;
}

@media only screen and (max-width: 700px) {
  .modal-content {
    width: 100%;
  }
}

</style>
</head>
<body>
  <img class="myImg" src="http://onebigphoto.com/uploads/2012/10/midnight-sun-in-lofoten-norway.jpg" alt="Midnight sun in Lofoten, Norway" width="300" height="200">
  <div class="text">The Beautiful mountain over the Norway River was a spectacular view to see..</div>

  <img class="myImg" src="http://cdn-image.travelandleisure.com/sites/default/files/styles/1600x1000/public/1490029386/fisherman-cabin-hamnoy-lofoten-islands-norway-NORWAY0320.jpg?itok=cpPuUjh1" alt="Fishermen's cabins in Lofoten, Norway" width="300" height="200">
  <div class="text">The lovely cabins here in Norway was an amazing stay with beautiful scenery...</div>

  <img class="myImg" src="http://fjordtours.blob.core.windows.net/fjordtours-umbraco/1199/gerirangerfjord-per-ottar-walderhaug-fjordnorway.jpg" alt="Gerirangerfjord, Norway" width="300" height="200">
  <div class="text">An afternoon on top of the Norway mountains you get an even more breath taking view..</div>

  <div id="myModal" class="modal">
    <span class="close">&times;</span>
    <img class="modal-content" id="img01">
    <div class="text"></div>
  </div>
< script >
  var modal = document.getElementById('myModal');
// to all images -- note I'm using a class!
var images = document.getElementsByClassName('myImg');
// the image in the modal
var modalImg = document.getElementById("img01");
// and the caption in the modal
var captionText = document.getElementsByClassName("text");

// Go through all of the images with our custom class
for (var i = 0; i < images.length; i++) {
  var img = images[i];
  // and attach our click listener for this image.
  img.onclick = function(evt) {
    modal.style.display = "block";
    modalImg.src = this.src;
    captionText.innerHTML = this.alt;
  }
}

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

span.onclick = function() {
    modal.style.display = "none";
  } </script>

  </body> 
  </html>
1
Constance 17 marzec 2020, 05:41

2 odpowiedzi

Najlepsza odpowiedź

Musisz zawinąć img + text za pomocą div, więc po kliknięciu wrapped div wybierz zawartość wewnętrzną według właściwości .innerHTML i zmień modalny img to div.
Tylko niewielka modyfikacja w Twoim js code modalImg.src = this.src na modalImg.innerHTML = this.innerHTML;
coś w rodzaju poniższego fragmentu.

Mam nadzieję, że poniższy fragment bardzo ci pomoże.

var modal = document.getElementById('myModal');
// to all images -- note I'm using a class!
var images = document.getElementsByClassName('myImg');
// the image in the modal
var modalImg = document.getElementById("img01");
// and the caption in the modal
var captionText = document.getElementsByClassName("text");
// Go through all of the images with our custom class
for (var i = 0; i < images.length; i++) {
  var img = images[i];
  // and attach our click listener for this image.
  img.onclick = function(evt) {
    modal.style.display = "block";
    // modalImg.src = this.src;
    modalImg.innerHTML = this.innerHTML;
    captionText.innerHTML = this.alt;
  }
}
var span = document.getElementsByClassName("close")[0];
span.onclick = function() {
  modal.style.display = "none";
}
*,*:before, *:after{box-sizing: border-box;}
body{
  margin: 0;
  padding: 0;
  font-family: Arial;
}
.myImg{
  border-radius: 5px;
  cursor: pointer;
  transition: 0.3s;
  display: inline-block;
  vertical-align: top;
  width: 300px;
  min-height: 200px;
}
.myImg:hover {
  opacity: 0.7;
}
.myImg img{
  max-width: 100%;
}
.modal {
  display: none;
  /* Hidden by default */
  position: fixed;
  /* Stay in place */
  z-index: 1;
  /* Sit on top */
  padding-top: 50px;
  /* Location of the box */
  left: 0;
  top: 0;
  width: 100%;
  /* Full width */
  height: 100%;
  /* Full height */
  overflow: hidden;
  overflow-y: 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 {
  margin: 0 auto 20px auto;
  display: block;
  width: 80%;
  max-width: 700px;
}
.modal-content img{
  width: 100%;
  display: block;
}
.modal-content .text{
  font-size: 16px;
  color: #f1f1f1;
  padding: 10px;
}
.modal-content{
  animation-name: zoom;
  animation-duration: 0.6s;
}

@keyframes zoom {
  from {
    transform: scale(0)
  }
  to {
    transform: scale(1)
  }
}
.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;
}
@media only screen and (max-width: 700px) {
  .modal-content {
    width: 100%;
  }
}
<div class="myImg">
  <img src="http://onebigphoto.com/uploads/2012/10/midnight-sun-in-lofoten-norway.jpg" alt="Midnight sun in Lofoten, Norway">
  <div class="text">The Beautiful mountain over the Norway River was a spectacular view to see..</div>
</div>
<div class="myImg">
  <img src="http://cdn-image.travelandleisure.com/sites/default/files/styles/1600x1000/public/1490029386/fisherman-cabin-hamnoy-lofoten-islands-norway-NORWAY0320.jpg?itok=cpPuUjh1" alt="Fishermen's cabins in Lofoten, Norway">
  <div class="text">The lovely cabins here in Norway was an amazing stay with beautiful scenery...</div>
</div>
<div class="myImg">
  <img src="http://fjordtours.blob.core.windows.net/fjordtours-umbraco/1199/gerirangerfjord-per-ottar-walderhaug-fjordnorway.jpg" alt="Gerirangerfjord, Norway">
  <div class="text">An afternoon on top of the Norway mountains you get an even more breath taking view..</div>
</div>

<!-- Modal Elements -->
<div id="myModal" class="modal">
  <span class="close">&times;</span>
  <div class="modal-content" id="img01"></div>
</div>
0
Raeesh Alam 17 marzec 2020, 04:00

Znacznie łatwiej byłoby umieścić obraz i tekst w tym samym kontenerze.

<div class="image-container">
<img class="myImg" src="http://onebigphoto.com/uploads/2012/10/midnight-sun-in-lofoten-norway.jpg" alt="Midnight sun in Lofoten, Norway" width="300" height="200">
  <div class="text">The Beautiful mountain over the Norway River was a spectacular view to see..</div>
</div>

Następnie użyj JavaScript, aby zadeklarować zmienną o nazwie modalContent i wybierz swój kontener.

var modalContent = getElementById('image-container');

Po prostu wszystko upraszcza i zmniejsza liczbę wymaganych selektorów. Patrząc na twój kod, miałem problemy ze zrozumieniem, czy każdy obraz jest wyświetlany w oknie modalnym oddzielnie, czy wszystkie razem. Mam nadzieję, że to pomogło.

0
Edward68 17 marzec 2020, 02:59