1. 程式人生 > >使用原生js實現輪播圖效果

使用原生js實現輪播圖效果

這幾天在逛網站的時候,發現很多網站都有輪播圖這個效果,所以我就仿照小米的官網用原生js寫了一個輪播圖效果,希望大家喜歡。
這是我釋出在github上的最後實現的效果:https://heternally.github.io/banner/

下面我簡單跟大家說一下我實現該效果的過程,如果有什麼錯誤的地方,歡迎大家說出來,以方便大家互相學習。

我相信前面簡單的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也是可以的;

在呼叫定時器要先清除定時器,不然會讓定時器一直疊加,使得輪播速度越來越快;我還加了當滑鼠移入的時候,輪播圖停止,即定時器被清除了,當滑鼠移出的時候,定時器又重新被呼叫。
知乎原文 我的部落格 微信公眾號