欢迎访问宙启技术站
智能推送

原生JS实现的轮播图功能详解

发布时间:2023-05-16 23:09:00

轮播图是网站中常用的一个功能,用于展示多个图片或广告,通过滑动或淡入淡出的动画效果来提升网站的视觉效果和用户体验。而本文将介绍如何使用原生JS实现轮播图的功能。

一、HTML结构

首先,我们需要准备一个基本的HTML结构,如下所示:

<div class="slider">
  <div class="slides">
    <div class="slide">
      <img src="image1.jpg" alt="slide-image-1" class="slide-image">
    </div>
    <div class="slide">
      <img src="image2.jpg" alt="slide-image-2" class="slide-image">
    </div>
    <div class="slide">
      <img src="image3.jpg" alt="slide-image-3" class="slide-image">
    </div>
  </div>
  <div class="controls">
    <button class="prev">Prev</button>
    <button class="next">Next</button>
  </div>
</div>

代码中,.slider代表整个轮播图的容器,.slides代表轮播图的图片容器,.slide代表每张轮播图,.slide-image是对应轮播图的图片。另外,.controls代表轮播图的控制器,.prev代表向前一个图片的按钮,.next代表向后一个图片的按钮。

二、样式

接下来,我们需要为轮播图添加一些基本的样式,如下所示:

.slider {
  position: relative;
  width: 100%;
  height: 500px;
  overflow: hidden;
}
 
.slides {
  position: absolute;
  top: 0;
  left: 0;
  width: 300%;
  height: 100%;
  display: flex;
}
 
.slide {
  width: 33.3333%;
  height: 100%;
}
 
.slide-image {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
 
.controls {
  position: absolute;
  z-index: 2;
  display: flex;
  justify-content: center;
  bottom: 30px;
  width: 100%;
}
 
.prev,
.next {
  margin: 0 10px;
  padding: 10px 20px;
  background-color: #f69d3c;
  color: white;
  border: none;
  font-size: 14px;
  cursor: pointer;
}

这些样式主要是用于设置轮播图的宽高、图片容器和轮播图图片的样式,同时还添加了一些对应的控制器样式。

三、动画效果

现在开始实现轮播图的动画效果。首先,我们需要定义一个计时器变量和一个变量来保存当前图片的索引值:

let slideIndex = 0;
let timer;

接着,我们可以使用setInterval函数实现图片自动切换:

timer = setInterval(autoPlay, 3000);
 
function autoPlay() {
  slideIndex++;
  if (slideIndex >= slides.length) {
    slideIndex = 0;
  }
  showSlide(slideIndex);
}

代码中,autoPlay函数会将当前图片的索引值加1,并判断是否已经到达最后一张图片,如果是,则将索引值归零。最后,调用showSlide函数来切换图片。

此时,我们需要定义showSlide函数来实现图片的切换:

function showSlide(index) {
  for (let i = 0; i < slides.length; i++) {
    slides[i].style.left = "-" + index + "00%";
  }
}

代码中,for循环遍历所有图片,将对应图片容器的left属性设置为-index * 100%,即向左移动index个图片容器的宽度。

此时,我们打开浏览器,可以看到轮播图已经可以正常切换了,但是还没有添加控制器和鼠标悬停事件。

四、控制器和鼠标悬停事件

我们现在需要给控制器添加事件,并在鼠标悬停时停止图片的自动切换。

首先,我们为.prev.next按钮分别添加事件处理程序:

let prevBtn = document.querySelector(".prev");
let nextBtn = document.querySelector(".next");
 
prevBtn.addEventListener("click", function() {
  slideIndex--;
  if (slideIndex < 0) {
    slideIndex = slides.length - 1;
  }
  showSlide(slideIndex);
});
 
nextBtn.addEventListener("click", function() {
  slideIndex++;
  if (slideIndex >= slides.length) {
    slideIndex = 0;
  }
  showSlide(slideIndex);
});

代码中,我们使用querySelector函数分别获取.prev.next按钮,并为其添加点击事件处理程序。当点击.prev按钮时,将当前图片的索引值减1,并判断是否到达 张图片,如果是,则将索引值设置为最后一张图片的索引值;当点击.next按钮时,将当前图片的索引值加1,并判断是否到达最后一张图片,如果是,则将索引值归零。

接着,我们需要为轮播图容器添加鼠标悬停事件,来停止图片的自动切换:

slider.addEventListener("mouseover", function() {
  clearInterval(timer);
});
 
slider.addEventListener("mouseout", function() {
  timer = setInterval(autoPlay, 3000);
});

代码中,我们使用addEventListener函数分别为轮播图容器添加mouseovermouseout事件处理程序,当鼠标悬停在轮播图容器上时,调用clearInterval函数来停止图片的自动切换;当鼠标离开轮播图容器时,重新设置计时器变量来恢复图片的自动切换。

五、完整代码

最后,我们将上面的代码整合在一起,可以得到完整的轮播图实现代码,如下所示:

let slideIndex = 0;
let timer;
const slider = document.querySelector(".slider");
const slides = document.querySelectorAll(".slide");
 
timer = setInterval(autoPlay, 3000);
 
function autoPlay() {
  slideIndex++;
  if (slideIndex >= slides.length) {
    slideIndex = 0;
  }
  showSlide(slideIndex);
}
 
function showSlide(index) {
  for (let i = 0; i < slides.length; i++) {
    slides[i].style.left = "-" + index + "00%";
  }
}
 
let prevBtn = document.querySelector(".prev");
let nextBtn = document.querySelector(".next");
 
prevBtn.addEventListener("click", function() {
  slideIndex--;
  if (slideIndex < 0) {
    slideIndex = slides.length - 1;
  }
  showSlide(slideIndex);
});
 
nextBtn.addEventListener("click", function() {
  slideIndex++;
  if (slideIndex >= slides.length) {
    slideIndex = 0;
  }
  showSlide(slideIndex);
});
 
slider.addEventListener("mouseover", function() {
  clearInterval(timer);
});
 
slider.addEventListener("mouseout", function() {
  timer = setInterval(autoPlay, 3000);
});

通过这个例子,我们不仅实现了轮播图的基本功能,还学会了如何使用原生JS来实现这一常用功能。