這是前陣子寫的2款原生JS輪播,一個是漸變輪播預覽,一個是滾動輪播預覽,現在補充博文總結。
漸變輪播
因為是梳理自己的思路,以下內容不貼代碼,具體效果和代碼見Github,可能有更好更簡潔的寫法,希望互相指正。
預覽效果 源碼地址
兼容性:IE7及以上,火狐和谷歌等主流瀏覽器
HTML&CSS
- 最外面1個總容器
#ad
,里面放1個圖片容器#list
,1個按鈕容器#btns
,2個箭頭#prev
和#next
;#ad
相對定位,其他相對于#ad
絕對定位。 - 所有圖片都是絕對定位,會重疊在一起,默認
z-index:0
;給選中的圖片和按鈕分別設置class
為selected
和on
,其中選中圖片的z-index:1
,才會出現在頂層。
JS
- 手動輪播:把選中圖片和按鈕添加相應類名
selected
和on
,把原來選中的按鈕和圖片取消相應類名。需要用循環,把所有按鈕都遍歷一遍,并且給每個按鈕都定義一個索引index
值。其中,需要判斷選中當前已選中的,則不操作。 - 自動輪播。函數
nextPic
用于實現下一張圖片,設置一個定時器,每隔一定時間就執行一次函數nextPic
。注意處理移動到最后一張和第一張 - 注意:鼠標移入按鈕時,自動輪播應該暫停;鼠標移出按鈕時,自動輪播應該繼續,且給一個當前的索引,告訴自動輪播從哪里開始播。
- 修改代碼:將第1步和第2步中代碼相似的部分合并寫為一個函數show()
- 將圖片和左右箭頭鼠標懸停時清除計時器,寫成函數
pause
,將圖片和左右箭頭鼠標離開時重啟計數器,寫成函數restart
- 給向左箭頭寫一個函數prevPic,用于顯示上一張圖片
- 設置左右箭頭的開始和暫停
- 為了實現切換時的透明度漸變效果,需要給圖片設置
transition
屬性。只設置selected
的話則會出現白底漸變效果,需要給所有圖片也設置默認的transition
屬性。但只兼容IE10及以上,因為IE9不支持transition
屬性
兼容IE9及以下
因為IE9不支持transition
屬性,嘗試用js實現漸入漸出,思路如下:
- 寫透明度變化函數
function setOpacity(elem,level){
if(elem.filters){ //IE9及以下有這個屬性
elem.style.filter="alpha(opacity="+level+")";
}else{
elem.style.opacity=level/100;
}
}
- 透明度變化是動態的,隔一段時間就要變化,首先想到用
setInterval
function fade_In(elem){
setOpacity(elem,0); //初始透明
var level=0;
setInterval(function(){
if(level<=95){
level+=5;
setOpacity(elem,level);
console.log(level);
}
}, 300);
}
- 也可以用
setTimout
,感覺比較繞(挺有意思的,值得深究)。先考慮用循環,注意循環內的匿名函數問題,可以用括號的方法自執行。
//淡入效果
function fadeIn(elem){
setOpacity(elem,0); //初始透明
for(var i=0;i<=20;i++){
(function(){
var level=i*5;
//try 1
//console.log(level); //測試用,會一次性全部依次輸出,如L61
//setOpacity(elem,level); //如果這樣寫,而不用L54的setTimeout的話是無效的,會一次性地全部實現,沒有動畫效果。
//try 2
/*if(level<=100){
console.log(level);
setInterval(setOpacity(elem,level), 300); //每隔一定時間就執行依次函數,但這里level已經是100了。應該是每隔一段時間就變化level。另外寫一個。
}*/
//正確:
setTimeout(function(){
setOpacity(elem,level)
}, i*300); //于是用setTimeout:i=0,間隔為0時,level=0;i=1,間隔為300時,level=5,依次……從而實現漸變。
})(i); //傳入參數i,函數立即執行,會依次執行21次
}
}
- 注意漸出的函數,容易寫錯,如下:
//淡出效果1:錯誤,實際是淡入效果
function fade_Out(elem){
for(var i=20;i>=0;i--){
(function(){
var level=i*5; //level從100到0
setTimeout(function(){
setOpacity(elem,level);
//console.log(level); //測試用,這里卻是從0到100
}, i*300);
//因為i=0時,即間隔時間為0,level=0;i=20,即間隔時間為6000,level=100。雖然for循環是從大到小,但setTimeout執行卻是按照間隔時間的順序的。所以實際上是淡入效果。
})(i);
}
}
正確的如下:
//淡出效果2:正確
function fadeOut(elem){
for(var i=0;i<=20;i++){
(function(){
var level=100-i*5; //level從100到0
setTimeout(function(){
setOpacity(elem,level)
}, i*300);
})(i);
}
}
在show函數里添加漸入和漸出,第一輪輪播切換時會出現第5張圖閃一下再切換到目標圖片,后面幾輪輪播就不會了———因為CSS中沒有設置默認透明度為0,選中透明度為1,切換的時候原來選中的一下子就變到底層了,所以會有第5張閃現。
P.S.由于本例中嘗試用
setTimeout
寫漸出時的出錯,引發的問題如:循環中的匿名函數問題,setTimeout
的多次執行,另外補充博文分析。
滾動輪播
明天繼續。