知乎原文 個人博客 微信公衆號
這幾天在逛網站的時候,發現不少網站都有輪播圖這個效果,因此我就仿照小米的官網用原生js寫了一個輪播圖效果,但願你們喜歡。
這是我發佈在github上的最後實現的效果:https://heternally.github.io/...javascript
下面我簡單跟你們說一下我實現該效果的過程,若是有什麼錯誤的地方,歡迎你們說出來,以方便你們互相學習。php
我相信前面簡單的html+css你們應該都會,我這裏就不說了,簡單給你們展現一下代碼:css
HTML部分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部分java
* { 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部分git
首先我先獲取各個節點,經過類名,ID等方法:github
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;
而後就是設置前一張,後一張,小圓點的按鈕效果了,實現點擊小圓點,會使相對應的圖片顯示,點擊前一張,會使前一張圖片顯示;後一張效果同樣:ide
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"; } } } }
在這部分給一個for循環,length爲小圓點的個數,在這個循環中,先給每一個圓點的下標值賦值,使得每一個圓點對應一張圖片;函數
而後編寫點擊圓點的函數,在函數中實現當前圓點的時候,獲取當前的下標值,講該值賦給全局變量num,將因此圖片的opacity設置爲o,去掉全部圓點的"on"樣式,而後將第num張圖片的opacity設置爲1,添加"on"樣式,這樣就實現了點擊圓點跳轉到相應的圖片。
一樣的就能夠實現向前向後按鈕效果.
最後設置一個定時器的函數,實現圖片輪播:
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也是能夠的;
在調用定時器要先清除定時器,否則會讓定時器一直疊加,使得輪播速度愈來愈快;我還加了當鼠標移入的時候,輪播圖中止,即定時器被清除了,當鼠標移出的時候,定時器又從新被調用。