web技术

使用原生js实现轮播图效果

2023-07-08 03:49 作者:Admin

这几天在逛网站的时候,发现很多网站都有轮播图这个效果,所以我就仿照小米的官网用原生js写了一个轮播图效果,希望大家喜欢。

这是我发布在github上的最后实现的效果:https://heternally.github.io/banner/

大家也可以去我的segmentfault观看。

下面我简单跟大家说一下我实现该效果的过程,如果有什么错误的地方,欢迎大家说出来,以方便大家互相学习。

我相信前面简单的html+css大家应该都会,我这里就不说了,简单给大家展示一下代码:

HTML部分

<div id="wrap">
  <div class="banner">
    <div class="banner-img">
      <img src="images/1.jpg" width="1226" height="460" alt="轮播图1" />
    </div>
  </div>

  <div class="banner">
    <div class="banner-img">
      <img src="images/2.jpg" width="1226" height="460" alt="轮播图2" />
    </div>
  </div>

  <div class="banner">
    <div class="banner-img">
      <img src="images/3.jpg" width="1226" height="460" alt="轮播图3" />
    </div>
  </div>

  <div class="banner">
    <div class="banner-img">
      <img src="images/4.jpg" width="1226" height="460" alt="轮播图4" />
    </div>
  </div>

  <div class="banner">
    <div class="banner-img">
      <img src="images/5.jpg" width="1226" height="460" alt="轮播图5" />
    </div>
  </div>

  <div class="tab">
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
  </div>

  <div class="prev"></div>
  <div class="next"></div>
</div>

css部分

* {
	margin: 0;
	padding: 0;
}

#wrap {
	position: relative;
	margin: 20px auto;
	width: 1226px;
	height: 460px;
}

#wrap .banner {
	position: absolute;
	top: 0;
	width: 100%;
	height: 100%;
	opacity: 0;
	transition: opacity 2s;
}

#wrap .tab {
	position: absolute;
	bottom: 10px;
	right: 10px;
}

#wrap .tab span {
	display: inline-block;
	width: 6px;
	height: 6px;
	margin: 3px;
	background: rgba(105,105,105,0.5);
	border-radius: 50%;
	cursor: pointer;
	border: 2px solid #887B6E;
}

#wrap .tab span.on {
	background: #E2CEB7;
}

#wrap .tab span:hover {
	background: #E2CEB7;
}

#wrap .prev {
	position: absolute;
	left: 20px;
	top: 210px;
	width: 41px;
	height: 69px;
	background: url("images/icon-slides.png") 82px;
	cursor: pointer;
}

#wrap .prev:hover {
	background: url("images/icon-slides.png");
}

#wrap .next {
	position: absolute;
	right: 20px;
	top: 210px;
	width: 41px;
	height: 69px;
	background: url("images/icon-slides.png") 41px;
	cursor: pointer;
}

#wrap .next:hover {
	background: url("images/icon-slides.png") 123px;
}

上面的代码都很简单,稍微看看就可以了,下面开始重点说下js部分

首先我先获取各个节点,通过类名,ID等方法:

var oBody = document.getElementsByTagName("body")[0];
var aBanner = document.getElementsByClassName("banner");
var aSpan = document
  .getElementsByClassName("tab")[0]
  .getElementsByTagName("span");
var oNext = document.getElementsByClassName("next")[0];
var Oprev = document.getElementsByClassName("prev")[0];
var Oon = document.getElementsByClassName("on")[0];

接下来是初始化界面,因为我在css里面设置了图片的不透明度opacity:0;所以我在实现轮播图前先使得第一张图片显示和第一个小圆点颜色为白色:

aBanner[0].style.opacity = "1";
aSpan[0].className = "on";
var num = 0;

然后就是设置前一张,后一张,小圆点的按钮效果了,实现点击小圆点,会使相对应的图片显示,点击前一张,会使前一张图片显示;后一张效果一样:

for (var i = 0; i < aSpan.length; i++) {
  aSpan[i].index = i;
  aSpan[i].onclick = function () {
    //点击小圆点图片相对应的进行切换
    for (var j = 0; j < aSpan.length; j++) {
      num = this.index;
      aSpan[j].className = "";
      aBanner[j].style.opacity = "0";
    }
    aSpan[num].className = "on";
    aBanner[num].style.opacity = "1";
  };
  oNext.onclick = function () {
    //按下图片切换到后一张
    for (var j = 0; j < aSpan.length; j++) {
      if (aSpan[j].className == "on") {
        aSpan[j].className = "";
        aBanner[j].style.opacity = "0";
        j++;
        num++;
        if (j > 4) {
          j = 0;
        }
        aSpan[j].className = "on";
        aBanner[j].style.opacity = "1";
      }
    }
  };

  Oprev.onclick = function () {
    //按下图片切换到前一张
    for (var j = 0; j < aSpan.length; j++) {
      if (aSpan[j].className == "on") {
        aSpan[j].className = "";
        aBanner[j].style.opacity = "0";
        j--;
        num--;
        if (j < 0) {
          j = 4;
        }
        aSpan[j].className = "on";
        aBanner[j].style.opacity = "1";
      }
    }
  };
}

1.在这部分给一个for循环,length为小圆点的个数,在这个循环中,先给每个圆点的下标值赋值,使得每个圆点对应一张图片;

2.然后编写点击圆点的函数,在函数中实现当前圆点的时候,获取当前的下标值,讲该值赋给全局变量num,将所以图片的opacity设置为o,去掉所有圆点的"on"样式,然后将第num张图片的opacity设置为1,添加"on"样式,这样就实现了点击圆点跳转到相应的图片。

3.同样的就可以实现向前向后按钮效果。

最后设置一个定时器的函数,实现图片轮播:

function Time() {
  /*设置定时器运行的函数*/
  num++;
  if (num < 5) {
    for (var j = 0; j < aSpan.length; j++) {
      aSpan[j].className = "";
      aBanner[j].style.opacity = "0";
    }
    aSpan[num].className = "on";
    aBanner[num].style.opacity = "1";
  } else {
    num = -1;
  }
}
clearInterval(timer);
var timer = setInterval("Time()", 2000); /*调用定时器*/

oBody.onmouseover = function () {
  /*鼠标引入,清除定时器,轮播图停止*/
  clearInterval(timer);
};
oBody.onmouseout = function () {
  /*鼠标移出,重新调用定时器,轮播图开始*/
  clearInterval(timer);
  timer = setInterval("Time()", 2000);
};

在调用定时器的时候,我用的使setInterval,或者你要使用setTimerout也是可以的;

在调用定时器要先清除定时器,不然会让定时器一直叠加,使得轮播速度越来越快;我还加了当鼠标移入的时候,轮播图停止,即定时器被清除了,当鼠标移出的时候,定时器又重新被调用。

标签: #轮播图 #JavaScript
推荐文章
HTML5 Canvas是一种强大的Web技术,它允许我们使用JavaScript在网页上创建和...
在这个程序中,我们将使用JavaScript创建一个可以在屏幕上放烟花的效果。我...
轮播图在网站中几乎无处不在,占用地方少,交互性好。今天就来聊聊如何用vu...
大部分网站或APP的首页差不多都运用到了轮播图,下边就探讨一下关于轮播图的...
轮播图实现思路:1、img_ul类里面存放img标签,将需要展示的图片依次排开,在...
推荐专题
如何自己建网站?建网站难不难?其实建网站说难不难,说容易也并不容易,难...
本专题精心收集整理了多种HTML+CSS+JS轮播图实现方案,带详细代码和讲解,正...