原生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.當(dāng)然了,有些時候還在圖片兩端放兩個箭頭 < 和 > ,指示圖片輪播方向(這里先不用,如果要使用也同理)
由此,可以先構(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、因為當(dāng)使用jquery的fadeIn()時,是變化為display:list-item,所以要在banner那里加上overflow:hidden ,不然如果快速切換圖片的話,整體圖片高度會超出所給的高度。

4、要注意給每個部分添加 z-index值,防止被覆蓋無法展現(xiàn)出來的現(xiàn)象
寫到這里,先檢查一下頁面是否已經(jīng)正確顯示出第一項。如果已經(jīng)顯示好,再增添js處理部分。
一、jQuery方式
1.有一個當(dāng)前圖片對應(yīng)的標(biāo)號 curIndex = 0;
2.默認(rèn)會自動輪播,所以默認(rèn)給其添加
var autoChange = setInterval(function(){
if(curIndex < $(".imgList li").length-1){
curIndex ++;
}else{
curIndex = 0;
}
//調(diào)用變換處理函數(shù)
changeTo(curIndex);
},2500);
默認(rèn)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.然后當(dāng)鼠標(biāo)滑入滑出右下角的下標(biāo)時也要處理
$(".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為當(dāng)前item(這個要注意別忘了)
滑出重置定時器,還原默認(rèn)狀態(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; //當(dāng)前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名取標(biāo)簽元素(注意了,因為現(xiàn)在我只針對于標(biāo)簽有一個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, //當(dāng)前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); //淡出當(dāng)前 image
removeClass(curImg,"imgOn");
addClass(imgArr[num],"imgOn");
fadeIn(imgArr[num]); //淡入目標(biāo) image
//設(shè)置image 的 info
var curInfo = getElementsByClassName("infoOn")[0];
removeClass(curInfo,"infoOn");
addClass(infoArr[num],"infoOn");
//設(shè)置image的控制下標(biāo) 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){
//鼠標(biāo)滑過則清除定時器,并作變換處理
indexArr[_i].onmouseover = function(){
clearTimeout(autoChange);
changeTo(_i);
curIndex = _i;
};
//鼠標(biāo)滑出則重置定時器處理
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, //當(dāng)前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){
//鼠標(biāo)滑過則清除定時器,并作變換處理
indexArr[_i].onmouseover = function(){
clearTimeout(autoChange);
changeTo(_i);
curIndex = _i;
};
//鼠標(biāo)滑出則重置定時器處理
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); //淡出當(dāng)前 image
removeClass(curImg,"imgOn");
addClass(imgArr[num],"imgOn");
fadeIn(imgArr[num]); //淡入目標(biāo) image
//設(shè)置image 的 info
var curInfo = getElementsByClassName("infoOn")[0];
removeClass(curInfo,"infoOn");
addClass(infoArr[num],"infoOn");
//設(shè)置image的控制下標(biāo) 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)文章
結(jié)合JQ1.9通過js正則判斷各種瀏覽器版本的方法
本篇文章主要是對結(jié)合JQ1.9通過js正則判斷瀏覽器版本的方法進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12
jquery的clone方法應(yīng)用于textarea和select的bug修復(fù)
textarea和select的值clone的時候會丟掉,在clone的時候?qū)al再重新賦值一下,如果知道這個了就加單了2014-06-06
jQuery.datatables.js插件用法及api實例詳解
這篇文章主要介紹了jquery插件之jQuery.datatables.js用法及api實例詳解,本文給大家介紹的非常詳細(xì)具有參考借鑒價值,需要的朋友可以參考下2016-10-10
關(guān)于jQuery新的事件綁定機制on()的使用技巧
本篇文章介紹了,關(guān)于jQuery新的事件綁定機制on()的使用技巧。需要的朋友參考下2013-04-04

