📜  带有灯箱弹出窗口的图像滑块 (1)

📅  最后修改于: 2023-12-03 15:09:44.349000             🧑  作者: Mango

带有灯箱弹出窗口的图像滑块

在现代web应用程序中,图像滑块已成为一个常见的UI设计元素。图像滑块通常由一个包含多个图像的滑块和一组控制器组成,用户可以用这些控制器来滑动滑块以查看不同的图像。但是,在某些情况下,图像会呈现得非常大,并且可能需要在灯箱中放大显示。因此,在这种情况下,为图像滑块添加灯箱功能就非常必要了。

实现图像滑块

下面是一个简单的图像滑块的实现示例:

<div class="slider">
  <div class="slider__images">
    <img src="image-1.jpg" alt="">
    <img src="image-2.jpg" alt="">
    <img src="image-3.jpg" alt="">
    <img src="image-4.jpg" alt="">
  </div>
  <div class="slider__controls">
    <button class="slider__control" data-slider-action="prev">&lt;</button>
    <button class="slider__control" data-slider-action="next">&gt;</button>
  </div>
</div>

在上面的示例中,我们创建了一个带有四个图像的滑块,以及两个控制按钮。接下来,我们需要实现滑块的滑动逻辑。

const sliderImages = document.querySelector('.slider__images');
const sliderControls = document.querySelectorAll('.slider__control');

let currentSlide = 0;
const slideWidth = sliderImages.clientWidth;

sliderControls.forEach(control => {
  control.addEventListener('click', () => {
    if (control.dataset.sliderAction === 'prev') {
      currentSlide--;
    } else {
      currentSlide++;
    }

    if (currentSlide < 0) {
      currentSlide = sliderImages.children.length - 1;
    } else if (currentSlide >= sliderImages.children.length) {
      currentSlide = 0;
    }

    sliderImages.style.transform = `translateX(-${currentSlide * slideWidth}px)`;
  });
});

在上面的代码中,我们使用querySelectorquerySelectorAll函数来查找滑块的元素,并添加了事件监听器来响应控制器的点击事件,从而实现滑块的滑动。代码中还包括了一些边界检查来确保滑块的滑动是循环的。

实现灯箱

现在,我们需要在点击图像时添加一个灯箱功能。我们可以使用一个包含放大版本图像的div元素来实现灯箱。以下是灯箱的HTML代码:

<div class="lightbox">
  <div class="lightbox__content">
    <img src="" alt="" class="lightbox__image">
    <button class="lightbox__close">&times;</button>
  </div>
</div>

在上面的代码中,我们创建了一个包含一个放大版本图像和一个关闭按钮的灯箱。接下来,我们需要通过JavaScript来显示和隐藏灯箱,并在灯箱中显示正确的图像。

const sliderImages = document.querySelector('.slider__images');
const sliderControls = document.querySelectorAll('.slider__control');
const lightbox = document.querySelector('.lightbox');
const lightboxImage = document.querySelector('.lightbox__image');
const lightboxClose = document.querySelector('.lightbox__close');

let currentSlide = 0;
const slideWidth = sliderImages.clientWidth;

sliderControls.forEach(control => {
  control.addEventListener('click', () => {
    if (control.dataset.sliderAction === 'prev') {
      currentSlide--;
    } else {
      currentSlide++;
    }

    if (currentSlide < 0) {
      currentSlide = sliderImages.children.length - 1;
    } else if (currentSlide >= sliderImages.children.length) {
      currentSlide = 0;
    }

    sliderImages.style.transform = `translateX(-${currentSlide * slideWidth}px)`;
  });
});

sliderImages.addEventListener('click', event => {
  if (event.target.tagName === 'IMG') {
    lightboxImage.src = event.target.src;
    lightbox.classList.add('lightbox--visible');
  }
});

lightboxClose.addEventListener('click', () => {
  lightbox.classList.remove('lightbox--visible');
});

在上面的代码中,我们添加了一个click事件监听器来查找被点击的图像,并在灯箱中显示它。我们还添加了一个事件监听器来关闭灯箱。

最后,我们需要添加CSS样式来确保灯箱居中,并使其在显示时不会滚动:

.lightbox {
  display: none;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.8);
  z-index: 999;
}

.lightbox--visible {
  display: flex;
  align-items: center;
  justify-content: center;
}

.lightbox__content {
  position: relative;
  max-width: 90%;
  max-height: 90%;
  overflow: hidden;
}

.lightbox__image {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
}

.lightbox__close {
  position: absolute;
  top: 1rem;
  right: 1rem;
  font-size: 2rem;
  color: #fff;
  background: transparent;
  border: none;
  cursor: pointer;
}

在上面的CSS代码中,我们定义了两个类:.lightbox.lightbox--visible。第一个类定义了灯箱的位置和外观,而第二个类则定义了灯箱如何在显示时居中,并使其看起来像一个浮出窗口。

现在,我们可以在页面中实现一个带有灯箱弹出窗口的图像滑块了!