【问题标题】:Adding two image gallery messes eachother添加两个图片库会互相混淆
【发布时间】:2020-05-25 01:58:00
【问题描述】:

我有一个图片库,其中包含一个大图片下的一些图片,大图片是下面的图片之一。但是,当我添加一个新的图片库时,它会覆盖旧的图片库,当我点击这些图片时,它会更改我不想要的第一个图库图片。我认为我的 javascript 代码中有一些错误,它针对我所有的画廊,我可以让它只针对点击的图像吗? 这是一个小提琴:https://jsfiddle.net/u8pbtLra/

这是代码

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 xSlides = slides.length;
  alert(xSlides);
  var slideIndexes = [0,1,0];
  alert(slideIndexes);
  var dots = document.getElementsByClassName("demo");
  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";
}

html:

    <div class="container2">
  <div class="mySlides">
    <div class = "bb" style="background-image:url(https://lh3.googleusercontent.com/-NREkKmTtXX0/AAAAAAAAAAI/AAAAAAAAADg/w2IRnCo5AwQ/photo.jpg?sz=328);"></div> 
    <!-- The above div is the problem -->
  </div>

  <div class="mySlides">
    <img src="https://i.stack.imgur.com/FyV3d.gif" style="width:100%">
  </div>

  <div class="row">
    <div class="column">
      <img class="demo cursor" src="https://lh3.googleusercontent.com/-NREkKmTtXX0/AAAAAAAAAAI/AAAAAAAAADg/w2IRnCo5AwQ/photo.jpg?sz=328"  onclick="currentSlide(1)"  width="100%" alt="text">
    </div>
    <div class="column">
      <img class="demo cursor" src="https://i.stack.imgur.com/FyV3d.gif" width="100%" onclick="currentSlide(2)" alt="text">
    </div>
  </div>
</div>

【问题讨论】:

  • 真的很难理解你想做什么。您的小提琴中有 3 张图片:下面 1 大 2 小。当你点击小猫时,大男人被猫代替了。你到底想要什么?
  • 您的第二张幻灯片也称为mySlides,因此您的代码并不真正知道哪些幻灯片属于哪个幻灯片。最简单的解决方案是将第二张幻灯片重命名为mySlidesTwo,并重写代码,以便它知道目标是哪张幻灯片。
  • 是的,但我做不到
  • 你有我的问题@Kokodoko
  • 我需要能够添加多个画廊而不改变他们的班级

标签: javascript html


【解决方案1】:

代码的问题是两个画廊都使用了同一个类。如果您不想重命名类,您可以将this 传递给您的点击处理程序,然后找到父元素。然后,您可以将父元素传递给showSlides 函数以获取死者幻灯片。

有一些方法可以改进代码,但我保持原样。

看这个例子:

var slideIndex = 1;
let wrappers = document.querySelectorAll(".wrapper");
wrappers.forEach(function(el) {
  showSlides(slideIndex, el);
});



// Next/previous controls
function plusSlides(n) {
  showSlides(slideIndex += n);
}

// Thumbnail image controls
function currentSlide(el, n) {
  // Get the wrapper element and pass it as a variable to showSlides
  let wrapper = el.closest(".wrapper");
  showSlides(slideIndex = n, wrapper);
}

function showSlides(n, wrapper) {
  var i;
  // find only the slides and dot that are decedents of current wrapper
  var slides = wrapper.querySelectorAll(".mySlides");
  var dots = wrapper.querySelectorAll(".demo");
  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";
}
.container3 {
  position: absolute;
  height: 100px;
  width: 20%;
  margin: auto;
  right: 0;
  left: 0;
}

.container2 {
  position: absolute;
  height: 100px;
  width: 20%;
  margin: auto;
  right: 0;
  left: 0;
  bottom: 0;
}

.bb {
  height: 100px;
  background: center center no-repeat;
  background-size: cover;
}

.mySlides {
  display: none;
}

.cursor {
  cursor: pointer;
}

.row {
  width: 100%;
  display: flex;
}

.demo {
  opacity: 0.6;
}

.active,
.demo:hover {
  opacity: 1;
}
<!-- add wrapper class -->
<div class="container3 wrapper">
  <div class="mySlides">
    <div class="bb" style="background-image:url(https://lh3.googleusercontent.com/-NREkKmTtXX0/AAAAAAAAAAI/AAAAAAAAADg/w2IRnCo5AwQ/photo.jpg?sz=328);"></div>
    <!-- The above div is the problem -->
  </div>

  <div class="mySlides">
    <img src="https://i.stack.imgur.com/FyV3d.gif" style="width:100%">
  </div>

  <div class="row">
    <div class="column">
      <!-- pass this to handler -->
      <img class="demo cursor" src="https://lh3.googleusercontent.com/-NREkKmTtXX0/AAAAAAAAAAI/AAAAAAAAADg/w2IRnCo5AwQ/photo.jpg?sz=328" onclick="currentSlide(this,1)" width="100%" alt="text">
    </div>
    <div class="column">
      <!-- pass this to handler -->
      <img class="demo cursor" src="https://i.stack.imgur.com/FyV3d.gif" width="100%" onclick="currentSlide(this, 2)" alt="text">
    </div>
  </div>
</div>


<!-- add wrapper class -->
<div class="container2 wrapper">
  <div class="mySlides">
    <div class="bb" style="background-image:url(https://lh3.googleusercontent.com/-NREkKmTtXX0/AAAAAAAAAAI/AAAAAAAAADg/w2IRnCo5AwQ/photo.jpg?sz=328);"></div>
    <!-- The above div is the problem -->
  </div>

  <div class="mySlides">
    <img src="https://i.stack.imgur.com/FyV3d.gif" style="width:100%">
  </div>

  <div class="row">
    <div class="column">
      <!-- pass this to handler -->
      <img class="demo cursor" src="https://lh3.googleusercontent.com/-NREkKmTtXX0/AAAAAAAAAAI/AAAAAAAAADg/w2IRnCo5AwQ/photo.jpg?sz=328" onclick="currentSlide(this,1)" width="100%" alt="text">
    </div>
    <div class="column">
      <!-- pass this to handler -->
      <img class="demo cursor" src="https://i.stack.imgur.com/FyV3d.gif" width="100%" onclick="currentSlide(this, 2)" alt="text">
    </div>
  </div>
</div>

【讨论】:

  • 哇,非常感谢朋友,我仔细研究了一下,这样我就更明白了!:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 2016-10-01
  • 2011-08-08
  • 2014-05-14
相关资源
最近更新 更多