使用javascript實現簡單的輪播圖效果
最近在做公司的網站,有一個輪播圖的功能,網上倒是有現成的js元件,我用了一下swiper,但是發現嵌入進去時不太好用,好在公司的網站要求也不是很高,索性就使用純的js做一下唄。
1.首先新建一個html頁面,先把簡單的佈局做出來
我的html部分如下
<body> <div class="wrap" id="wrap"> <ul class="pics" id="pic"> <li> <img src="img/banner1.jpg" /> </li> <li> <img src="img/banner2.jpg" /> </li> <li> <img src="img/banner3.jpg" /> </li> </ul> <ol class="listNum" id="listNum"> <li class="active"><span>0</span></li> <li><span>1</span></li> <li><span>2</span></li> </ol> </div> </body>
就做一個輪播圖,為一個div,,其中輪播圖中用到的三個圖片用ul, 下面的ol 為輪播圖索引的數字
接下來,就是對此佈局進行css的樣式,思路就是 外層div(wrap)的寬度跟圖片li的寬度設定一樣,然後整個wrap部分的overflow設定為hidden, 設定為不可見,(我這裡是最簡單的輪播圖的實現,很適合初學者的使用)就用到了display屬性的none和block的切換來實現輪播圖,其他的用絕對定位,或者margin值做也是可以的,但我這裡用最簡單的實現,下面是我的css部分
<style> *{ margin: 0; padding: 0; } .wrap{ width: 1000px; height: 400px; border: 1px solid black; margin: 100px auto; overflow: hidden; position: relative; } .wrap ul{ list-style: none; } .wrap ul li{ width: 100%; height: 400px; } .wrap img{ width: 100%; height: 100%; } .listNum{ position: absolute; bottom: 5px; left: 45%; } .listNum li{ display: inline-block; border: 1px solid black; width: 15px; height: 15px; border-radius: 15px; background-color: yellow; } .listNum li:hover{ cursor: pointer; background-color: red; } .listNum li span{ display: none; } .listNum .active{ background-color: red; } </style>
這裡html部分和css部分不是重點,我這裡不做說明了。
終點是接下來的javascript部分,先貼上完整的javascript程式碼部分
<script> var timer = null; var index = 0; var wrap = null; var pic = null; var pics = null; var listNum = null; var listNumLi = null; var timer1 = null; var timer2 = null; window.onload = function(){ //alert("開始"); wrap = document.getElementById("wrap"); pic = document.getElementById("pic"); pics = pic.getElementsByTagName("li"); listNum = document.getElementById("listNum"); listNumLi = listNum.getElementsByTagName("li"); //預設輪播圖的第一個數字 timer1 = setInterval(autoPlay, 5000); //出了輪播圖 wrap.onmouseout = function(){ console.log("消失了"); timer2 = setInterval(autoPlay, 5000); } //數字索引的滑鼠進入時間 for(var i=0;i<listNumLi.length;i++){ listNumLi[i].idx = i; listNumLi[i].onmouseover = function(){ clearInterval(timer1); clearInterval(timer2); index = this.idx; changePic(this.idx); } } //進入輪播圖 wrap.onmousemove = function(){ console.log("進入了"); clearInterval(timer1); clearInterval(timer2); } } function autoPlay(){ //alert("之前的index:"+index); if(++index >= pics.length){ //alert("進來了吧index:"+index); index = 0; } //alert("之後的index:"+index); changePic(index); } function changePic(idx){ for(var i=0;i<pics.length;i++){ pics[i].style.display = "none"; } for(var i=0;i<listNumLi.length;i++){ listNumLi[i].className = ""; } //alert("idx:"+idx); pics[idx].style.display = "block"; listNumLi[idx].className = "active"; } </script>
這裡用到了js的定時器,說到定時器,先來了解一下js中的兩種定時器,
1.setTimeout(function, interval)
2.setInterval(function, interval)
這裡直接粘一下網友寫的區別吧
1、JS中的定時器有兩種:
window.setTimeout([function],[interval]) 設定一個定時器,並且設定了一個等待的時間[interval],當到達時間後,執行對應的方法[function],當方法執行完成定時器停止(但是定時器還在,只不過沒用了); window.setInterval([function],[interval]) 設定一個定時器,並且設定了一個等待的時間[interval],當到達時間後,執行對應的方法[function],當方法執行完成,定時器並沒有停止,以後每隔[interval]這麼長的時間都會重新的執行對應的方法[function],直到我們手動清除定時器為止; 2、JS中的定時器是有返回值的:->返回值是一個數字,代表當前是第幾個定時器 var timer1=window.setTimeout(function(){},1000); //timer1->1 當前是第一個定時器
var timer2=window.setTimeout(function(){},1000); //timer2->2 當前是第二個定時器
window.clearTimeout(timer1); //->把第一個定時器清除掉,這裡也可以用window.clearInterval(timer1)、window.clearTimeout(1)、window.clearInterval(timer1);
var timer3=window.setTimeout(function(){},1000); //timer3->3 當前是第三個定時器 ,雖然上面的定時器timer1清除掉了,但是號還是繼續往後排的;
3、清除定時器:
window.clearInterval(timer1)/window.clearTimeout(time1);兩種清除方式都可以清除通過setTimeout和setInterval設定的定時器(兩種方式在設定定時器的時候有區別,清除定時器的時候沒有區別),並且引數不僅可以是timer,還可以是其返回值,例如1,2;需要注意的是,定時器即使清除了,其返回值也不會清除,之後設定的定時器的返回值也會在其返回值的基礎上繼續向後排,這點類似於銀行的排隊領號,即使1號的業務辦理完了,後邊的人仍是從2號開始繼續領號,而不是重新從1開始;
總結:setTimeout 用一次(主要用於延時做某件事)
setInterval 主要用來迴圈做某件事
兩者的使用場景不同, 這裡粘一下 上面的地址:http://www.cnblogs.com/wangying731/p/5164780.html
好了說完定時器,下面就來說一說我這裡輪播圖的實現吧!
一。我這裡用到的是程序式程式設計,沒有用到抽象式程式設計
二。剛開始都是使用js來獲取一些元素,這裡不做介紹
三。分步驟實現
1.先實現 迴圈輪播
init()函式中的 這一句:
timer1 = setInterval(autoPlay, 5000);
function autoPlay(){
//alert("之前的index:"+index);
if(++index >= pics.length){
//alert("進來了吧index:"+index);
index = 0;
}
//alert("之後的index:"+index);
changePic(index);
}
function changePic(idx){
for(var i=0;i<pics.length;i++){
pics[i].style.display = "none";
}
for(var i=0;i<listNumLi.length;i++){
listNumLi[i].className = "";
}
//alert("idx:"+idx);
pics[idx].style.display = "block";
listNumLi[idx].className = "active";
}
使用定時器先將 pics中的所有圖片隱藏,在使用索引index來定時顯示 圖片 每執行一次index的值通過++index 加1 這裡使用index++不行 這裡的index為全域性變數
這樣簡單的自動輪播的功能就出來了,
接下來,再做圖片索引的滑鼠移入事件,滑鼠移入哪個索引值,就顯示哪個圖片,
//數字索引的滑鼠進入時間
for(var i=0;i<listNumLi.length;i++){
listNumLi[i].idx = i;
listNumLi[i].onmouseover = function(){
clearInterval(timer1);
clearInterval(timer2);
index = this.idx;
changePic(this.idx);
}
}
接下來寫wrap區域的滑鼠一出事件,將 timer清理掉,我第一次在這裡全篇只寫了一個timer ,就是init()函式中建立的也是
timer = setInterval(autoPlay, 5000);
listNum滑鼠移入事件中建立的也是timer = setInterval(autoPlay, 5000);
所以在wrap區域的滑鼠移除事件清楚地是timer ,具體程式碼如下:
<script>
var timer = null;
var index = 0;
var wrap = null;
var pic = null;
var pics = null;
var listNum = null;
var listNumLi = null;
window.onload = function(){
//alert("開始");
wrap = document.getElementById("wrap");
pic = document.getElementById("pic");
pics = pic.getElementsByTagName("li");
listNum = document.getElementById("listNum");
listNumLi = listNum.getElementsByTagName("li");
//預設輪播圖的第一個數字
timer = setInterval(autoPlay, 5000);
//出了輪播圖
wrap.onmouseout = function(){
console.log("消失了");
timer = setInterval(autoPlay, 5000);
}
//數字索引的滑鼠進入時間
for(var i=0;i<listNumLi.length;i++){
listNumLi[i].idx = i;
listNumLi[i].onmouseover = function(){
clearInterval(timer1);
clearInterval(timer2);
index = this.idx;
changePic(this.idx);
}
}
//進入輪播圖
wrap.onmousemove = function(){
console.log("進入了");
clearInterval(timer1);
clearInterval(timer2);
}
}
function autoPlay(){
//alert("之前的index:"+index);
if(++index >= pics.length){
//alert("進來了吧index:"+index);
index = 0;
}
//alert("之後的index:"+index);
changePic(index);
}
function changePic(idx){
for(var i=0;i<pics.length;i++){
pics[i].style.display = "none";
}
for(var i=0;i<listNumLi.length;i++){
listNumLi[i].className = "";
}
//alert("idx:"+idx);
pics[idx].style.display = "block";
listNumLi[idx].className = "active";
}
</script>
這樣做的後果是,有時候wrap區域的滑鼠移入時,定時器沒有清理掉,導致滑鼠已經放上輪播圖的圖片了,但是定時器還在執行,就是過一會兒輪播圖的圖片還是會變,這樣就不行。
因為init()函式中的timer和滑鼠移入數字索引時建立的timer有可能不一樣,故沒有清理掉,所以在程式碼中這兩處建立不同的timer,然後再清理的時候把這兩個timer都清理掉。具體程式碼如下:(完整的javascript程式碼)
<script>
var timer = null;
var index = 0;
var wrap = null;
var pic = null;
var pics = null;
var listNum = null;
var listNumLi = null;
var timer1 = null;
var timer2 = null;
window.onload = function(){
//alert("開始");
wrap = document.getElementById("wrap");
pic = document.getElementById("pic");
pics = pic.getElementsByTagName("li");
listNum = document.getElementById("listNum");
listNumLi = listNum.getElementsByTagName("li");
//預設輪播圖的第一個數字
timer1 = setInterval(autoPlay, 5000);
//出了輪播圖
wrap.onmouseout = function(){
console.log("消失了");
timer2 = setInterval(autoPlay, 5000);
}
//數字索引的滑鼠進入時間
for(var i=0;i<listNumLi.length;i++){
listNumLi[i].idx = i;
listNumLi[i].onmouseover = function(){
clearInterval(timer1);
clearInterval(timer2);
index = this.idx;
changePic(this.idx);
}
}
//進入輪播圖
wrap.onmousemove = function(){
console.log("進入了");
clearInterval(timer1);
clearInterval(timer2);
}
}
function autoPlay(){
//alert("之前的index:"+index);
if(++index >= pics.length){
//alert("進來了吧index:"+index);
index = 0;
}
//alert("之後的index:"+index);
changePic(index);
}
function changePic(idx){
for(var i=0;i<pics.length;i++){
pics[i].style.display = "none";
}
for(var i=0;i<listNumLi.length;i++){
listNumLi[i].className = "";
}
//alert("idx:"+idx);
pics[idx].style.display = "block";
listNumLi[idx].className = "active";
}
</script>
這樣下來,一個簡單的輪播圖效果就做完了,只包含兩個簡單的功能:
1.定時輪播
2.滑鼠移入輪播圖數字所以區域時,對應的圖片顯示
但是 用滑鼠拖動圖片的功能還沒有,下次有機會再展示吧
不積跬步,無以至千里
不積小流,無以成江海