圖片輪播(淡入淡出)--JS原生和jQuery實現

圖片輪播(淡入淡出)--js原生和jquery實現


圖片輪播有不少種方式,這裏採用其中的 淡入淡出形式

js原生和jQuery均可以實現,jquery由於封裝了不少用法,因此用起來就簡單許多,轉換成js使用,其實也就是用js原生模擬出這些用法。

但無論怎樣,構造一個最基本的表現層是必須的

簡單的圖片輪播通常由幾個部分構成。

對於淡入淡出式

1.首先是個外圍部分(其實也就是最外邊的總體wrapper)

2.接着就是你設置圖片輪播的地方(也就是一個banner吧)

3.而後是一個圖片組(能夠用新的div 也能夠直接使用 ul-->li形式)

4.而後是一個透明背景層,放在圖片底部

5.而後是一個圖片描述info層,放在透明背景層的左下角(div 或 ul-->li)

6.而後是一個按鈕層,用來定位圖片組的index吧,放在透明背景層的右下角(div 或 ul-->li)

7.固然了,有些時候還在圖片兩端放兩個箭頭 <  和 >  ,指示圖片輪播方向(這裏先不用,若是要使用也同理)javascript


由此,能夠先構造出html結構css

<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部分的信息內容,有些時候就能夠綁定一下下。要注意的是,imgList中圖片的寬度和高度最後立刻設定,若是在css中才統一設定會變慢一些。html

我給三個部分的active都添加的對應的on類,實際使用的時候可能不須要那麼多activejava

接下來給它設置一下css樣式node

<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>

說明一下:jquery

一、banner即爲圖片輪播的範圍,這裏設定爲寬400高200,圖片的ul外圍也如此設置。閉包

二、要顯示active項,因此先統一全部li設置display:none,再添加個on類設置 display:inlineapp

三、由於當使用jquery的fadeIn()時,是變化爲display:list-item,因此要在banner那裏加上overflow:hidden ,否則若是快速切換圖片的話,總體圖片高度會超出所給的高度。ide

四、要注意給每一個部分添加 z-index值,防止被覆蓋沒法展示出來的現象函數

 

 

寫到這裏,先檢查一下頁面是否已經正確顯示出第一項。若是已經顯示好,再增添js處理部分。

1、jQuery方式   demo

1.有一個當前圖片對應的標號 curIndex = 0;

2.默認會自動輪播,因此默認給其添加

var autoChange = setInterval(function(){ 
        if(curIndex <  $(".imgList li").length-1){ 
            curIndex ++; 
        }else{ 
            curIndex = 0;
        }
        //調用變換處理函數
        changeTo(curIndex);  
    },2500);

默認curIndex自增,以後重置爲0

3.其中changeTo()函數切換

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;
                }
                //調用變換處理函數
                changeTo(curIndex);  
            },2500);
        });
    });

滑入清除定時器,並進行圖片切換處理。而後設置curIndex爲當前item(這個要注意別忘了)

滑出重置定時器,還原默認狀態了

這樣一來,淡入淡出就完成了。

完整代碼

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5 <title>圖片輪播 jq(淡入淡出)</title>
 6 <style type="text/css">
 7     body,div,ul,li,a,img{margin: 0;padding: 0;}
 8     ul,li{list-style: none;}
 9     a{text-decoration: none;}
10 
11     .wrapper{position: relative;margin: 30px auto;width: 400px;height: 200px;}
12     .banner{width: 400px;height: 200px;overflow: hidden;}
13     .imgList{width:400px;height:200px;z-index: 10;}
14     .imgList li{display: none;}
15     .imgList .imgOn{display: inline;}
16     .bg{position: absolute;bottom: 0;width: 400px;height: 40px;z-index:20;opacity: 0.4;filter:alpha(opacity=40);background: black;}
17     .infoList{position: absolute;left: 10px;bottom: 10px;z-index: 30;}
18     .infoList li{display: none;}
19     .infoList .infoOn{display: inline;color: white;}
20     .indexList{position: absolute;right: 10px;bottom: 5px;z-index: 30;}
21     .indexList li{float: left;margin-right: 5px;padding: 2px 4px;border: 2px solid black;background: grey;cursor: pointer;}
22     .indexList .indexOn{background: red;font-weight: bold;color: white;}
23 </style>
24 </head>
25 <body>
26     <div class="wrapper"><!-- 最外層部分 -->
27         <div class="banner"><!-- 輪播部分 -->
28             <ul class="imgList"><!-- 圖片部分 -->
29                 <li class="imgOn"><a href="#"><img src="./img/test1.jpg" width="400px" height="200px" alt="puss in boots1"></a></li>
30             <li><a href="#"><img src="./img/test2.jpg" width="400px" height="200px" alt="puss in boots2"></a></li>
31             <li><a href="#"><img src="./img/test3.jpg" width="400px" height="200px" alt="puss in boots3"></a></li>
32             <li><a href="#"><img src="./img/test4.jpg" width="400px" height="200px" alt="puss in boots4"></a></li>
33             <li><a href="#"><img src="./img/test5.jpg" width="400px" height="200px" alt="puss in boots5"></a></li>
34             </ul>
35             <div class="bg"></div> <!-- 圖片底部背景層部分-->
36             <ul class="infoList"><!-- 圖片左下角文字信息部分 -->
37                 <li class="infoOn">puss in boots1</li>
38                 <li>puss in boots2</li>
39                 <li>puss in boots3</li>
40                 <li>puss in boots4</li>
41                 <li>puss in boots5</li>
42             </ul>
43             <ul class="indexList"><!-- 圖片右下角序號部分 -->
44                 <li class="indexOn">1</li>
45                 <li>2</li>
46                 <li>3</li>
47                 <li>4</li>
48                 <li>5</li>
49             </ul>
50         </div>
51     </div>
52     <script type="text/javascript" src="./js/jquery.min.js"></script>
53     <script type="text/javascript">
54     var curIndex = 0;  //當前index
55          //   alert(imgLen);
56           // 定時器自動變換2.5秒每次
57     var autoChange = setInterval(function(){ 
58         if(curIndex <  $(".imgList li").length-1){ 
59             curIndex ++; 
60         }else{ 
61             curIndex = 0;
62         }
63         //調用變換處理函數
64         changeTo(curIndex);  
65     },2500);
66 
67     $(".indexList").find("li").each(function(item){ 
68         $(this).hover(function(){ 
69             clearInterval(autoChange);
70             changeTo(item);
71             curIndex = item;
72         },function(){ 
73             autoChange = setInterval(function(){ 
74                 if(curIndex <  $(".imgList li").length-1){ 
75                     curIndex ++; 
76                 }else{ 
77                     curIndex = 0;
78                 }
79                 //調用變換處理函數
80                 changeTo(curIndex);  
81             },2500);
82         });
83     });
84     function changeTo(num){ 
85         $(".imgList").find("li").removeClass("imgOn").hide().eq(num).fadeIn().addClass("imgOn");
86         $(".infoList").find("li").removeClass("infoOn").eq(num).addClass("infoOn");
87         $(".indexList").find("li").removeClass("indexOn").eq(num).addClass("indexOn");
88     }
89     </script>
90 </body>
91 </html>
View Code

 

2、js原生方式  demo

原生方式大體來講就是模擬jquery

由於我用了太多的class,因此要增長一些class的處理函數(能夠用id,應該會更便捷)

經過class名取標籤元素(注意了,由於如今我只針對於標籤有一個class的來講,多個class應該會出錯)

   //經過class獲取節點
    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對應的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函數

    //淡入處理函數
    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 即爲每次改變透明度的時間間隔,自行設定
            })(i);          //每次循環變化一次
        }
    }

        //淡出處理函數
    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 即爲每次改變透明度的時間間隔,自行設定
            })(i);          //每次循環變化一次
        }
    }

其中設置透明度函數的處理形式

        //設置透明度
    function setOpacity(elem,level){ 
        if(elem.filters){ 
            elem.style.filter = "alpha(opacity="+level+")";
        }else{ 
            elem.style.opacity = level / 100;
        }
    }

 

而後就是基本部分的用法了

先初始化常常用到的變量以及圖片的自動切換

        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;
        }
        //調用變換處理函數
        changeTo(curIndex);  
    },2500);
    //調用添加事件處理
    addEvent();        

其中的changeTo就是處理函數,addEvent就是給右下角的那些按鈕設定事件處理

//變換處理函數
    function changeTo(num){ 
        //設置image
        var curImg = getElementsByClassName("imgOn")[0];
        fadeOut(curImg);  //淡出當前 image
        removeClass(curImg,"imgOn");
        addClass(imgArr[num],"imgOn");
        fadeIn(imgArr[num]); //淡入目標 image
        //設置image 的 info
        var curInfo = getElementsByClassName("infoOn")[0];
        removeClass(curInfo,"infoOn");
        addClass(infoArr[num],"infoOn");
        //設置image的控制下標 index
        var _curIndex = getElementsByClassName("indexOn")[0];
        removeClass(_curIndex,"indexOn");
        addClass(indexArr[num],"indexOn");
    }
 //給右下角的圖片index添加事件處理
  function addEvent(){
    for(var i=0;i<imgLen;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;
            }
        //調用變換處理函數
            changeTo(curIndex);  
        },2500);
        };
         })(i);
    }
}

如此一來,原生版的也完成了

完整代碼

  1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2 <html xmlns="http://www.w3.org/1999/xhtml">
  3 <head>
  4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5 <title>圖片輪播 js原生(淡入淡出)</title>
  6 <style type="text/css">
  7     body,div,ul,li,a,img{margin: 0;padding: 0;}
  8     ul,li{list-style: none;}
  9     a{text-decoration: none;}
 10 
 11     .wrapper{position: relative;margin: 30px auto;width: 400px;height: 200px;}
 12     .banner{width: 400px;height: 200px;overflow: hidden;}
 13     .imgList{width:400px;height:200px;z-index: 10;}
 14     .imgList li{display: none;}
 15     .imgList .imgOn{display: inline;}
 16     .bg{position: absolute;bottom: 0;width: 400px;height: 40px;z-index:20;opacity: 0.4;filter:alpha(opacity=40);background: black;}
 17     .infoList{position: absolute;left: 10px;bottom: 10px;z-index: 30;}
 18     .infoList li{display: none;}
 19     .infoList .infoOn{display: inline;color: white;}
 20     .indexList{position: absolute;right: 10px;bottom: 5px;z-index: 30;}
 21     .indexList li{float: left;margin-right: 5px;padding: 2px 4px;border: 2px solid black;background: grey;cursor: pointer;}
 22     .indexList .indexOn{background: red;font-weight: bold;color: white;}
 23 </style>
 24 </head>
 25 <body>
 26     <div class="wrapper"><!-- 最外層部分 -->
 27         <div class="banner"><!-- 輪播部分 -->
 28             <ul class="imgList"><!-- 圖片部分 -->
 29                 <li class="imgOn"><a href="#"><img src="./img/test1.jpg" width="400px" height="200px" alt="puss in boots1"></a></li>
 30             <li><a href="#"><img src="./img/test2.jpg" width="400px" height="200px" alt="puss in boots2"></a></li>
 31             <li><a href="#"><img src="./img/test3.jpg" width="400px" height="200px" alt="puss in boots3"></a></li>
 32             <li><a href="#"><img src="./img/test4.jpg" width="400px" height="200px" alt="puss in boots4"></a></li>
 33             <li><a href="#"><img src="./img/test5.jpg" width="400px" height="200px" alt="puss in boots5"></a></li>
 34             </ul>
 35             <div class="bg"></div> <!-- 圖片底部背景層部分-->
 36             <ul class="infoList"><!-- 圖片左下角文字信息部分 -->
 37                 <li class="infoOn">puss in boots1</li>
 38                 <li>puss in boots2</li>
 39                 <li>puss in boots3</li>
 40                 <li>puss in boots4</li>
 41                 <li>puss in boots5</li>
 42             </ul>
 43             <ul class="indexList"><!-- 圖片右下角序號部分 -->
 44                 <li class="indexOn">1</li>
 45                 <li>2</li>
 46                 <li>3</li>
 47                 <li>4</li>
 48                 <li>5</li>
 49             </ul>
 50         </div>
 51     </div>
 52     <script type="text/javascript">
 53     var curIndex = 0,  //當前index
 54             imgArr = getElementsByClassName("imgList")[0].getElementsByTagName("li"), //獲取圖片組
 55             imgLen = imgArr.length,
 56             infoArr = getElementsByClassName("infoList")[0].getElementsByTagName("li"), //獲取圖片info組
 57             indexArr = getElementsByClassName("indexList")[0].getElementsByTagName("li"); //獲取控制index組
 58           // 定時器自動變換2.5秒每次
 59     var autoChange = setInterval(function(){ 
 60         if(curIndex < imgLen -1){ 
 61             curIndex ++; 
 62         }else{ 
 63             curIndex = 0;
 64         }
 65         //調用變換處理函數
 66         changeTo(curIndex);  
 67     },2500);
 68     //調用添加事件處理
 69     addEvent();
 70 
 71     //給右下角的圖片index添加事件處理
 72   function addEvent(){
 73     for(var i=0;i<imgLen;i++){ 
 74         //閉包防止做用域內活動對象item的影響
 75         (function(_i){  
 76         //鼠標滑過則清除定時器,並做變換處理
 77         indexArr[_i].onmouseover = function(){ 
 78             clearTimeout(autoChange);
 79             changeTo(_i);
 80             curIndex = _i;
 81         };
 82         //鼠標滑出則重置定時器處理
 83         indexArr[_i].onmouseout = function(){ 
 84             autoChange = setInterval(function(){ 
 85             if(curIndex < imgLen -1){ 
 86                 curIndex ++;
 87             }else{ 
 88                 curIndex = 0;
 89             }
 90         //調用變換處理函數
 91             changeTo(curIndex);  
 92         },2500);
 93         };
 94          })(i);
 95     }
 96 }
 97     //變換處理函數
 98     function changeTo(num){ 
 99         //設置image
100         var curImg = getElementsByClassName("imgOn")[0];
101         fadeOut(curImg);  //淡出當前 image
102         removeClass(curImg,"imgOn");
103         addClass(imgArr[num],"imgOn");
104         fadeIn(imgArr[num]); //淡入目標 image
105         //設置image 的 info
106         var curInfo = getElementsByClassName("infoOn")[0];
107         removeClass(curInfo,"infoOn");
108         addClass(infoArr[num],"infoOn");
109         //設置image的控制下標 index
110         var _curIndex = getElementsByClassName("indexOn")[0];
111         removeClass(_curIndex,"indexOn");
112         addClass(indexArr[num],"indexOn");
113     }
114 
115         //設置透明度
116     function setOpacity(elem,level){ 
117         if(elem.filters){ 
118             elem.style.filter = "alpha(opacity="+level+")";
119         }else{ 
120             elem.style.opacity = level / 100;
121         }
122     }
123 
124     //淡入處理函數
125     function fadeIn(elem){ 
126         setOpacity(elem,0);  //初始全透明
127         for(var i = 0;i<=20;i++){  //透明度改變 20 * 5 = 100
128             (function(){ 
129                 var level = i * 5;   //透明度每次變化值
130                 setTimeout(function(){ 
131                     setOpacity(elem, level)
132                 },i*25); //i * 25 即爲每次改變透明度的時間間隔,自行設定
133             })(i);          //每次循環變化一次
134         }
135     }
136 
137         //淡出處理函數
138     function fadeOut(elem){ 
139         for(var i = 0;i<=20;i++){  //透明度改變 20 * 5 = 100
140             (function(){ 
141                 var level = 100 - i * 5;  //透明度每次變化值
142                 setTimeout(function(){ 
143                     setOpacity(elem, level)
144                 },i*25); //i * 25 即爲每次改變透明度的時間間隔,自行設定
145             })(i);          //每次循環變化一次
146         }
147     }
148 
149     //經過class獲取節點
150     function getElementsByClassName(className){ 
151         var classArr = [];
152         var tags = document.getElementsByTagName('*');
153         for(var item in tags){ 
154             if(tags[item].nodeType == 1){ 
155                 if(tags[item].getAttribute('class') == className){ 
156                     classArr.push(tags[item]);
157                 }
158             }
159         }
160         return classArr; //返回
161     }
162 
163     // 判斷obj是否有此class
164     function hasClass(obj,cls){    //class位於單詞邊界
165         return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
166       }
167       //給 obj添加class
168     function addClass(obj,cls){  
169         if(!this.hasClass(obj,cls)){ 
170               obj.className += cls;
171         }
172     }
173     //移除obj對應的class
174     function removeClass(obj,cls){  
175         if(hasClass(obj,cls)){ 
176             var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
177                  obj.className = obj.className.replace(reg,'');
178         }
179     }
180 
181     </script>
182 </body>
183 </html>
View Code
相關文章
相關標籤/搜索