原生js和jquery實現(xiàn)圖片輪播淡入淡出效果
圖片輪播有很多種方式,這里采用其中的 淡入淡出形式
js原生和jQuery都可以實現(xiàn),jquery因為封裝了很多用法,所以用起來就簡單許多,轉(zhuǎn)換成js使用,其實也就是用js原生模擬出這些用法。
但不管怎樣,構(gòu)造一個最基本的表現(xiàn)層是必須的
簡單的圖片輪播一般由幾個部分構(gòu)成。
對于淡入淡出式
1.首先是個外圍部分(其實也就是最外邊的整體wrapper)
2.接著就是你設(shè)置圖片輪播的地方(也就是一個banner吧)
3.然后是一個圖片組(可以用新的div 也可以直接使用 ul-->li形式)
4.然后是一個透明背景層,放在圖片底部
5.然后是一個圖片描述info層,放在透明背景層的左下角(div 或 ul-->li)
6.然后是一個按鈕層,用來定位圖片組的index吧,放在透明背景層的右下角(div 或 ul-->li)
7.當然了,有些時候還在圖片兩端放兩個箭頭 < 和 > ,指示圖片輪播方向(這里先不用,如果要使用也同理)
由此,可以先構(gòu)造出html結(jié)構(gòu)
<div class="wrapper"><!-- 最外層部分 --> <div class="banner"><!-- 輪播部分 --> <ul class="imgList"><!-- 圖片部分 --> <li class="imgOn"><a href="#"><img src="./img/test1.jpg" width="400px" height="200px" alt="puss in boots1"></a></li> <li><a href="#"><img src="./img/test2.jpg" width="400px" height="200px" alt="puss in boots2"></a></li> <li><a href="#"><img src="./img/test3.jpg" width="400px" height="200px" alt="puss in boots3"></a></li> <li><a href="#"><img src="./img/test4.jpg" width="400px" height="200px" alt="puss in boots4"></a></li> <li><a href="#"><img src="./img/test5.jpg" width="400px" height="200px" alt="puss in boots5"></a></li> </ul> <div class="bg"></div> <!-- 圖片底部背景層部分--> <ul class="infoList"><!-- 圖片左下角文字信息部分 --> <li class="infoOn">puss in boots1</li> <li>puss in boots2</li> <li>puss in boots3</li> <li>puss in boots4</li> <li>puss in boots5</li> </ul> <ul class="indexList"><!-- 圖片右下角序號部分 --> <li class="indexOn">1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul> </div> </div>
圖片部分的alt說明即為infoList部分的信息內(nèi)容,有些時候就可以綁定一下下。要注意的是,imgList中圖片的寬度和高度最后馬上設(shè)定,如果在css中才統(tǒng)一設(shè)定會變慢一些。
我給三個部分的active都添加的對應(yīng)的on類,實際使用的時候可能不需要那么多active
接下來給它設(shè)置一下css樣式
<style type="text/css"> body,div,ul,li,a,img{margin: 0;padding: 0;} ul,li{list-style: none;} a{text-decoration: none;} .wrapper{position: relative;margin: 30px auto;width: 400px;height: 200px;} .banner{width: 400px;height: 200px;overflow: hidden;} .imgList{width:400px;height:200px;z-index: 10;} .imgList li{display: none;} .imgList .imgOn{display: inline;} .bg{position: absolute;bottom: 0;width: 400px;height: 40px;z-index:20;opacity: 0.4;filter:alpha(opacity=40);background: black;} .infoList{position: absolute;left: 10px;bottom: 10px;z-index: 30;} .infoList li{display: none;} .infoList .infoOn{display: inline;color: white;} .indexList{position: absolute;right: 10px;bottom: 5px;z-index: 30;} .indexList li{float: left;margin-right: 5px;padding: 2px 4px;border: 2px solid black;background: grey;cursor: pointer;} .indexList .indexOn{background: red;font-weight: bold;color: white;} </style>
說明一下:
1、banner即為圖片輪播的范圍,這里設(shè)定為寬400高200,圖片的ul外圍也如此設(shè)置。
2、要顯示active項,所以先統(tǒng)一所有l(wèi)i設(shè)置display:none,再添加個on類設(shè)置 display:inline
3、因為當使用jquery的fadeIn()時,是變化為display:list-item,所以要在banner那里加上overflow:hidden ,不然如果快速切換圖片的話,整體圖片高度會超出所給的高度。
4、要注意給每個部分添加 z-index值,防止被覆蓋無法展現(xiàn)出來的現(xiàn)象
寫到這里,先檢查一下頁面是否已經(jīng)正確顯示出第一項。如果已經(jīng)顯示好,再增添js處理部分。
一、jQuery方式
1.有一個當前圖片對應(yīng)的標號 curIndex = 0;
2.默認會自動輪播,所以默認給其添加
var autoChange = setInterval(function(){ if(curIndex < $(".imgList li").length-1){ curIndex ++; }else{ curIndex = 0; } //調(diào)用變換處理函數(shù) changeTo(curIndex); },2500);
默認curIndex自增,之后重置為0
3.其中changeTo()函數(shù)切換
function changeTo(num){ $(".imgList").find("li").removeClass("imgOn").hide().eq(num).fadeIn().addClass("imgOn"); $(".infoList").find("li").removeClass("infoOn").eq(num).addClass("infoOn"); $(".indexList").find("li").removeClass("indexOn").eq(num).addClass("indexOn"); }
看著辦吧..
4.然后當鼠標滑入滑出右下角的下標時也要處理
$(".indexList").find("li").each(function(item){ $(this).hover(function(){ clearInterval(autoChange); changeTo(item); curIndex = item; },function(){ autoChange = setInterval(function(){ if(curIndex < $(".imgList li").length-1){ curIndex ++; }else{ curIndex = 0; } //調(diào)用變換處理函數(shù) changeTo(curIndex); },2500); }); });
滑入清除定時器,并進行圖片切換處理。然后設(shè)置curIndex為當前item(這個要注意別忘了)
滑出重置定時器,還原默認狀態(tài)了
這樣一來,淡入淡出就完成了。
完整代碼
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>圖片輪播 jq(淡入淡出)</title> <style type="text/css"> body,div,ul,li,a,img{margin: 0;padding: 0;} ul,li{list-style: none;} a{text-decoration: none;} .wrapper{position: relative;margin: 30px auto;width: 400px;height: 200px;} .banner{width: 400px;height: 200px;overflow: hidden;} .imgList{width:400px;height:200px;z-index: 10;} .imgList li{display: none;} .imgList .imgOn{display: inline;} .bg{position: absolute;bottom: 0;width: 400px;height: 40px;z-index:20;opacity: 0.4;filter:alpha(opacity=40);background: black;} .infoList{position: absolute;left: 10px;bottom: 10px;z-index: 30;} .infoList li{display: none;} .infoList .infoOn{display: inline;color: white;} .indexList{position: absolute;right: 10px;bottom: 5px;z-index: 30;} .indexList li{float: left;margin-right: 5px;padding: 2px 4px;border: 2px solid black;background: grey;cursor: pointer;} .indexList .indexOn{background: red;font-weight: bold;color: white;} </style> </head> <body> <div class="wrapper"><!-- 最外層部分 --> <div class="banner"><!-- 輪播部分 --> <ul class="imgList"><!-- 圖片部分 --> <li class="imgOn"><a href="#"><img src="./img/test1.jpg" width="400px" height="200px" alt="puss in boots1"></a></li> <li><a href="#"><img src="./img/test2.jpg" width="400px" height="200px" alt="puss in boots2"></a></li> <li><a href="#"><img src="./img/test3.jpg" width="400px" height="200px" alt="puss in boots3"></a></li> <li><a href="#"><img src="./img/test4.jpg" width="400px" height="200px" alt="puss in boots4"></a></li> <li><a href="#"><img src="./img/test5.jpg" width="400px" height="200px" alt="puss in boots5"></a></li> </ul> <div class="bg"></div> <!-- 圖片底部背景層部分--> <ul class="infoList"><!-- 圖片左下角文字信息部分 --> <li class="infoOn">puss in boots1</li> <li>puss in boots2</li> <li>puss in boots3</li> <li>puss in boots4</li> <li>puss in boots5</li> </ul> <ul class="indexList"><!-- 圖片右下角序號部分 --> <li class="indexOn">1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul> </div> </div> <script type="text/javascript" src="./js/jquery.min.js"></script> <script type="text/javascript"> var curIndex = 0; //當前index // alert(imgLen); // 定時器自動變換2.5秒每次 var autoChange = setInterval(function(){ if(curIndex < $(".imgList li").length-1){ curIndex ++; }else{ curIndex = 0; } //調(diào)用變換處理函數(shù) changeTo(curIndex); },2500); $(".indexList").find("li").each(function(item){ $(this).hover(function(){ clearInterval(autoChange); changeTo(item); curIndex = item; },function(){ autoChange = setInterval(function(){ if(curIndex < $(".imgList li").length-1){ curIndex ++; }else{ curIndex = 0; } //調(diào)用變換處理函數(shù) changeTo(curIndex); },2500); }); }); function changeTo(num){ $(".imgList").find("li").removeClass("imgOn").hide().eq(num).fadeIn().addClass("imgOn"); $(".infoList").find("li").removeClass("infoOn").eq(num).addClass("infoOn"); $(".indexList").find("li").removeClass("indexOn").eq(num).addClass("indexOn"); } </script> </body> </html>
二、js原生方式
原生方式大致來說就是模擬jquery
因為我用了太多的class,所以要增加一些class的處理函數(shù)(可以用id,應(yīng)該會更便捷)
通過class名取標簽元素(注意了,因為現(xiàn)在我只針對于標簽有一個class的來說,多個class應(yīng)該會出錯)
//通過class獲取節(jié)點 function getElementsByClassName(className){ var classArr = []; var tags = document.getElementsByTagName('*'); for(var item in tags){ if(tags[item].nodeType == 1){ if(tags[item].getAttribute('class') == className){ classArr.push(tags[item]); } } } return classArr; //返回 }
模擬jq的addClass和removeClass
// 判斷obj是否有此class function hasClass(obj,cls){ //class位于單詞邊界 return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')); } //給 obj添加class function addClass(obj,cls){ if(!this.hasClass(obj,cls)){ obj.className += cls; } } //移除obj對應(yīng)的class function removeClass(obj,cls){ if(hasClass(obj,cls)){ var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)'); obj.className = obj.className.replace(reg,''); } }
再模擬jq的fadeIn和fadeOut函數(shù)
//淡入處理函數(shù) function fadeIn(elem){ setOpacity(elem,0); //初始全透明 for(var i = 0;i<=20;i++){ //透明度改變 20 * 5 = 100 (function(){ var level = i * 5; //透明度每次變化值 setTimeout(function(){ setOpacity(elem, level) },i*25); //i * 25 即為每次改變透明度的時間間隔,自行設(shè)定 })(i); //每次循環(huán)變化一次 } } //淡出處理函數(shù) function fadeOut(elem){ for(var i = 0;i<=20;i++){ //透明度改變 20 * 5 = 100 (function(){ var level = 100 - i * 5; //透明度每次變化值 setTimeout(function(){ setOpacity(elem, level) },i*25); //i * 25 即為每次改變透明度的時間間隔,自行設(shè)定 })(i); //每次循環(huán)變化一次 } }
其中設(shè)置透明度函數(shù)的處理形式
//設(shè)置透明度 function setOpacity(elem,level){ if(elem.filters){ elem.style.filter = "alpha(opacity="+level+")"; }else{ elem.style.opacity = level / 100; } }
然后就是基本部分的用法了
先初始化經(jīng)常用到的變量以及圖片的自動切換
var curIndex = 0, //當前index imgArr = getElementsByClassName("imgList")[0].getElementsByTagName("li"), //獲取圖片組 imgLen = imgArr.length, infoArr = getElementsByClassName("infoList")[0].getElementsByTagName("li"), //獲取圖片info組 indexArr = getElementsByClassName("indexList")[0].getElementsByTagName("li"); //獲取控制index組 // 定時器自動變換2.5秒每次 var autoChange = setInterval(function(){ if(curIndex < imgLen -1){ curIndex ++; }else{ curIndex = 0; } //調(diào)用變換處理函數(shù) changeTo(curIndex); },2500); //調(diào)用添加事件處理 addEvent();
其中的changeTo就是處理函數(shù),addEvent就是給右下角的那些按鈕設(shè)定事件處理
//變換處理函數(shù) function changeTo(num){ //設(shè)置image var curImg = getElementsByClassName("imgOn")[0]; fadeOut(curImg); //淡出當前 image removeClass(curImg,"imgOn"); addClass(imgArr[num],"imgOn"); fadeIn(imgArr[num]); //淡入目標 image //設(shè)置image 的 info var curInfo = getElementsByClassName("infoOn")[0]; removeClass(curInfo,"infoOn"); addClass(infoArr[num],"infoOn"); //設(shè)置image的控制下標 index var _curIndex = getElementsByClassName("indexOn")[0]; removeClass(_curIndex,"indexOn"); addClass(indexArr[num],"indexOn"); } //給右下角的圖片index添加事件處理 function addEvent(){ for(var i=0;i<imgLen;i++){ //閉包防止作用域內(nèi)活動對象item的影響 (function(_i){ //鼠標滑過則清除定時器,并作變換處理 indexArr[_i].onmouseover = function(){ clearTimeout(autoChange); changeTo(_i); curIndex = _i; }; //鼠標滑出則重置定時器處理 indexArr[_i].onmouseout = function(){ autoChange = setInterval(function(){ if(curIndex < imgLen -1){ curIndex ++; }else{ curIndex = 0; } //調(diào)用變換處理函數(shù) changeTo(curIndex); },2500); }; })(i); } }
如此一來,原生版的也完成了
完整代碼
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>圖片輪播 js原生(淡入淡出)</title> <style type="text/css"> body,div,ul,li,a,img{margin: 0;padding: 0;} ul,li{list-style: none;} a{text-decoration: none;} .wrapper{position: relative;margin: 30px auto;width: 400px;height: 200px;} .banner{width: 400px;height: 200px;overflow: hidden;} .imgList{width:400px;height:200px;z-index: 10;} .imgList li{display: none;} .imgList .imgOn{display: inline;} .bg{position: absolute;bottom: 0;width: 400px;height: 40px;z-index:20;opacity: 0.4;filter:alpha(opacity=40);background: black;} .infoList{position: absolute;left: 10px;bottom: 10px;z-index: 30;} .infoList li{display: none;} .infoList .infoOn{display: inline;color: white;} .indexList{position: absolute;right: 10px;bottom: 5px;z-index: 30;} .indexList li{float: left;margin-right: 5px;padding: 2px 4px;border: 2px solid black;background: grey;cursor: pointer;} .indexList .indexOn{background: red;font-weight: bold;color: white;} </style> </head> <body> <div class="wrapper"><!-- 最外層部分 --> <div class="banner"><!-- 輪播部分 --> <ul class="imgList"><!-- 圖片部分 --> <li class="imgOn"><a href="#"><img src="./img/test1.jpg" width="400px" height="200px" alt="puss in boots1"></a></li> <li><a href="#"><img src="./img/test2.jpg" width="400px" height="200px" alt="puss in boots2"></a></li> <li><a href="#"><img src="./img/test3.jpg" width="400px" height="200px" alt="puss in boots3"></a></li> <li><a href="#"><img src="./img/test4.jpg" width="400px" height="200px" alt="puss in boots4"></a></li> <li><a href="#"><img src="./img/test5.jpg" width="400px" height="200px" alt="puss in boots5"></a></li> </ul> <div class="bg"></div> <!-- 圖片底部背景層部分--> <ul class="infoList"><!-- 圖片左下角文字信息部分 --> <li class="infoOn">puss in boots1</li> <li>puss in boots2</li> <li>puss in boots3</li> <li>puss in boots4</li> <li>puss in boots5</li> </ul> <ul class="indexList"><!-- 圖片右下角序號部分 --> <li class="indexOn">1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul> </div> </div> <script type="text/javascript"> var curIndex = 0, //當前index imgArr = getElementsByClassName("imgList")[0].getElementsByTagName("li"), //獲取圖片組 imgLen = imgArr.length, infoArr = getElementsByClassName("infoList")[0].getElementsByTagName("li"), //獲取圖片info組 indexArr = getElementsByClassName("indexList")[0].getElementsByTagName("li"); //獲取控制index組 // 定時器自動變換2.5秒每次 var autoChange = setInterval(function(){ if(curIndex < imgLen -1){ curIndex ++; }else{ curIndex = 0; } //調(diào)用變換處理函數(shù) changeTo(curIndex); },2500); //調(diào)用添加事件處理 addEvent(); //給右下角的圖片index添加事件處理 function addEvent(){ for(var i=0;i<imgLen;i++){ //閉包防止作用域內(nèi)活動對象item的影響 (function(_i){ //鼠標滑過則清除定時器,并作變換處理 indexArr[_i].onmouseover = function(){ clearTimeout(autoChange); changeTo(_i); curIndex = _i; }; //鼠標滑出則重置定時器處理 indexArr[_i].onmouseout = function(){ autoChange = setInterval(function(){ if(curIndex < imgLen -1){ curIndex ++; }else{ curIndex = 0; } //調(diào)用變換處理函數(shù) changeTo(curIndex); },2500); }; })(i); } } //變換處理函數(shù) function changeTo(num){ //設(shè)置image var curImg = getElementsByClassName("imgOn")[0]; fadeOut(curImg); //淡出當前 image removeClass(curImg,"imgOn"); addClass(imgArr[num],"imgOn"); fadeIn(imgArr[num]); //淡入目標 image //設(shè)置image 的 info var curInfo = getElementsByClassName("infoOn")[0]; removeClass(curInfo,"infoOn"); addClass(infoArr[num],"infoOn"); //設(shè)置image的控制下標 index var _curIndex = getElementsByClassName("indexOn")[0]; removeClass(_curIndex,"indexOn"); addClass(indexArr[num],"indexOn"); } //設(shè)置透明度 function setOpacity(elem,level){ if(elem.filters){ elem.style.filter = "alpha(opacity="+level+")"; }else{ elem.style.opacity = level / 100; } } //淡入處理函數(shù) function fadeIn(elem){ setOpacity(elem,0); //初始全透明 for(var i = 0;i<=20;i++){ //透明度改變 20 * 5 = 100 (function(){ var level = i * 5; //透明度每次變化值 setTimeout(function(){ setOpacity(elem, level) },i*25); //i * 25 即為每次改變透明度的時間間隔,自行設(shè)定 })(i); //每次循環(huán)變化一次 } } //淡出處理函數(shù) function fadeOut(elem){ for(var i = 0;i<=20;i++){ //透明度改變 20 * 5 = 100 (function(){ var level = 100 - i * 5; //透明度每次變化值 setTimeout(function(){ setOpacity(elem, level) },i*25); //i * 25 即為每次改變透明度的時間間隔,自行設(shè)定 })(i); //每次循環(huán)變化一次 } } //通過class獲取節(jié)點 function getElementsByClassName(className){ var classArr = []; var tags = document.getElementsByTagName('*'); for(var item in tags){ if(tags[item].nodeType == 1){ if(tags[item].getAttribute('class') == className){ classArr.push(tags[item]); } } } return classArr; //返回 } // 判斷obj是否有此class function hasClass(obj,cls){ //class位于單詞邊界 return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')); } //給 obj添加class function addClass(obj,cls){ if(!this.hasClass(obj,cls)){ obj.className += cls; } } //移除obj對應(yīng)的class function removeClass(obj,cls){ if(hasClass(obj,cls)){ var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)'); obj.className = obj.className.replace(reg,''); } } </script> </body> </html>
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
相關(guān)文章
jQuery實現(xiàn)點擊行選中或取消CheckBox的方法
這篇文章主要介紹了jQuery實現(xiàn)點擊行選中或取消CheckBox的方法,涉及jQuery針對頁面元素的循環(huán)遍歷與屬性操作相關(guān)技巧,需要的朋友可以參考下2016-08-08通過jquery獲取上傳文件名稱、類型和大小的實現(xiàn)代碼
這篇文章主要介紹了在文件上傳到服務(wù)器之前,我們可以通過jquery來獲取上傳文件的名稱,類型和尺寸大小,需要的朋友可以參考下2018-04-04Jquery 動態(tài)循環(huán)輸出表格具體方法
這篇文章主要介紹了Jquery 動態(tài)循環(huán)輸出表格具體方法,有需要的朋友可以參考一下2013-11-11