Мне удалось собрать то, что я хотел, но когда задействовано несколько изображений, они объединяются в одно слайд-шоу. Конечная цель — разместить на странице несколько изображений. При нажатии на определенное изображение открывается слайд-шоу из других изображений. Мой текущий код работает отлично, пока на страницу не будет добавлено второе изображение, поскольку оно для всего ссылается на идентификатор элемента img01. Как я могу заставить этот JavaScript определять, на какое изображение я нажимаю, и показывать только слайд-шоу изображений, предназначенных для него.
Просто чтобы убедиться, что все ясно:
Нажмите на изображение 1 — откройте слайд-шоу с помощью (изображение 1, изображение B, изображение C)
Нажмите на изображение 2 — откройте слайд-шоу с помощью (изображение 2, изображение E, изображение F).
Я пробовал разделить каждый набор изображений на img1, img2 и т. д. Но не знаю, как это сделать без лишнего кода.
Это то, что у меня есть до сих пор:
var modal = document.getElementById("myModal");
var img = document.getElementsByTagName('img');
var modalImg = document.getElementById('img01');
var currentImage;
for (var i = 0; i < img.length - 1; i++) {
img[i].setAttribute('data', i);
img[i].onclick = function() {
modal.style.display = "block";
modalImg.src = this.dataset.biggerSrc;
currentImage = this;
document.getElementById("modal-footer").innerHTML = "Image 1 of " + i;
}
}
document.getElementById('prev').onclick = function() {
var count = parseInt(currentImage.getAttribute("data"));
if (count > 0) {
currentImage = img[count - 1];
document.getElementById("modal-footer").innerHTML = "Image " + count++ + " of " + i;
}
modalImg.src = currentImage.dataset.biggerSrc;
}
document.getElementById('next').onclick = function() {
var count = parseInt(currentImage.getAttribute("data"));
if (count < img.length - 2) {
currentImage = img[count + 1];
document.getElementById("modal-footer").innerHTML = "Image " + (count + 2) + " of " + i;;
}
modalImg.src = currentImage.dataset.biggerSrc;
}
document.getElementsByClassName("close")[0].onclick = function() {
modal.style.display = "none";
}.myImg {
border-radius: 5px;
cursor: pointer;
width: 60%;
display: block;
margin: 0 auto;
}
.myImg:hover {
opacity: 0.7;
}
.modal {
display: none;
position: fixed;
z-index: 1;
padding-top: 20px;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgb(0, 0, 0);
background-color: rgba(0, 0, 0, 0.9);
}
.modal-content {
margin: auto;
display: block;
width: 65%;
}
.modal-content {
-webkit-animation-name: zoom;
-webkit-animation-duration: 0.6s;
animation-name: zoom;
animation-duration: 0.6s;
}
/* Next & previous buttons */
.prev,
.next {
cursor: pointer;
position: absolute;
top: 0;
top: 50%;
width: auto;
margin-top: -22px;
padding: 50px;
color: white;
font-weight: bold;
font-size: 36px;
transition: 0.6s ease;
border-radius: 0 3px 3px 0;
}
/* 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);
}
.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;
}
#modal-footer {
font-size: 30px;
position: absolute;
bottom: 25px;
left: 0;
}<div class = "container">
<img class = "myImg" src = "https://placehold.co/300x150?text=slide 1" data-bigger-src = "https://placehold.co/600x300?text=slide 1" width = "300" height = "150">
<img class = "myImg" src = "https://placehold.co/300x150?text=slide 2" data-bigger-src = "https://placehold.co/600x300?text=slide 2" width = "300" height = "150" style = "Display: none;">
<img class = "myImg" src = "https://placehold.co/300x150?text=slide 3" data-bigger-src = "https://placehold.co/600x300?text=slide 3" width = "300" height = "150" style = "Display: none;">
<div id = "myModal" class = "modal">
<span class = "close">X</span>
<img class = "modal-content" id = "img01">
<a id = "prev" class = "prev">❮</a>
<a id = "next" class = "next">❯</a>
<div id = "modal-footer">
</div>
</div>
<div class = "container">
<img class = "myImg" src = "https://placehold.co/300x150?text=slide 1" data-bigger-src = "https://placehold.co/600x300?text=slide 1" width = "300" height = "150">
<img class = "myImg" src = "https://placehold.co/300x150?text=slide 2" data-bigger-src = "https://placehold.co/600x300?text=slide 2" width = "300" height = "150" style = "Display: none;">
<img class = "myImg" src = "https://placehold.co/300x150?text=slide 3" data-bigger-src = "https://placehold.co/600x300?text=slide 3" width = "300" height = "150" style = "Display: none;">
<div id = "myModal" class = "modal">
<span class = "close">X</span>
<img class = "modal-content" id = "img01">
<a id = "prev" class = "prev">❮</a>
<a id = "next" class = "next">❯</a>
<div id = "modal-footer">
</div>
</div>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В идеале вы должны использовать только одно модальное окно. Также id должен быть уникальным для всех элементов.
Итак, давайте пойдем по идеалу и оставим один модальный вариант. Что касается изображений, мы сначала пройдемся по .container, беря изображения из каждого. В этот код можно было бы внести множество улучшений, но он работает.
var modal = document.getElementById("myModal")
var containers = document.querySelectorAll(".container")
var modalImg = document.getElementById('img01')
var modalFooter = document.getElementById("modal-footer")
var currentContainer = null
var currentImage = null
containers.forEach(function(container) {
var imgs = container.querySelectorAll(".myImg")
for (var i = 0; i < imgs.length; i++) {
imgs[i].setAttribute('data', i);
imgs[i].onclick = function(ev) {
currentContainer = container
modal.style.display = "block";
modalImg.src = this.dataset.biggerSrc;
currentImage = this;
modalFooter.innerHTML = "Image 1 of " + i + " of " + currentContainer.id;
}
}
})
document.getElementById('prev').onclick = function() {
var count = parseInt(currentImage.getAttribute("data"));
var imgs = currentContainer.querySelectorAll(".myImg")
if (count > 0) {
currentImage = imgs[count - 1]
modalFooter.innerHTML = "Image " + count++ + " of " + imgs.length;
}
modalImg.src = currentImage.dataset.biggerSrc;
}
document.getElementById('next').onclick = function() {
var count = parseInt(currentImage.getAttribute("data"));
var imgs = currentContainer.querySelectorAll(".myImg")
if (count < imgs.length - 1) {
currentImage = imgs[count + 1]
modalFooter.innerHTML = "Image " + (count + 2) + " of " + imgs.length;
}
modalImg.src = currentImage.dataset.biggerSrc;
}
document.querySelector(".close").onclick = function() {
modal.style.display = "none";
}.myImg {
border-radius: 5px;
cursor: pointer;
width: 60%;
display: block;
margin: 0 auto;
}
.myImg:hover {
opacity: 0.7;
}
.modal {
display: none;
position: fixed;
z-index: 1;
padding-top: 20px;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgb(0, 0, 0);
background-color: rgba(0, 0, 0, 0.9);
}
.modal-content {
margin: auto;
display: block;
width: 65%;
}
.modal-content {
-webkit-animation-name: zoom;
-webkit-animation-duration: 0.6s;
animation-name: zoom;
animation-duration: 0.6s;
}
/* Next & previous buttons */
.prev,
.next {
cursor: pointer;
position: absolute;
top: 0;
top: 50%;
width: auto;
margin-top: -22px;
padding: 50px;
color: white;
font-weight: bold;
font-size: 36px;
transition: 0.6s ease;
border-radius: 0 3px 3px 0;
}
/* 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);
}
.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;
}
#modal-footer {
font-size: 30px;
position: absolute;
bottom: 25px;
left: 0;
}<div id = "gallery1" class = "container">
<img class = "myImg" src = "../images/17Csmall.PNG" data-bigger-src = "../images/17C.PNG" width = "300" height = "150">
<img class = "myImg" src = "../images/17C-a.PNG" data-bigger-src = "../images/17C-a.PNG" width = "300" height = "150" style = "Display: none;">
<img class = "myImg" src = "../images/17C-b.PNG" data-bigger-src = "../images/17C-b.PNG" width = "300" height = "150" style = "Display: none;">
</div>
<div id = "gallery2" class = "container">
<img class = "myImg" src = "../images/18Csmall.PNG" data-bigger-src = "../images/18C.PNG" width = "300" height = "150">
<img class = "myImg" src = "../images/18C-a.PNG" data-bigger-src = "../images/18C-a.PNG" width = "300" height = "150" style = "Display: none;">
<img class = "myImg" src = "../images/18C-b.PNG" data-bigger-src = "../images/18C-b.PNG" width = "300" height = "150" style = "Display: none;">
</div>
<div id = "myModal" class = "modal">
<span class = "close">X</span>
<img class = "modal-content" id = "img01">
<a id = "prev" class = "prev">❮</a>
<a id = "next" class = "next">❯</a>
<div id = "modal-footer">
</div>
</div>
Это именно то, что я хотел! Большое спасибо!!! Я все еще новичок в JavaScript, поэтому ценю вашу помощь!