站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        JavaScript如何實(shí)現(xiàn)動態(tài)輪播圖效果?(代碼示例)

        本篇文章給大家?guī)淼膬?nèi)容是JavaScript如何實(shí)現(xiàn)動態(tài)輪播圖效果?(代碼示例)。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對大家有所幫助。

        JavaScript如何實(shí)現(xiàn)動態(tài)輪播圖效果?(代碼示例)

        功能描述:

        1.鼠標(biāo)經(jīng)過 左右側(cè)箭頭顯示,鼠標(biāo)離開 箭頭隱藏

        2.動態(tài)添加底部小圓圈并綁定單擊事件,并且讓小圓圈的點(diǎn)擊事件和左右箭頭點(diǎn)擊事件同步

        3.拷貝第一張圖片添加到ul最后可以實(shí)現(xiàn)動態(tài)添加圖片

        4.給箭頭綁定單擊事件,并且使圖片可以無縫輪播

        5.實(shí)現(xiàn)自動輪播(動畫函數(shù))

        具體實(shí)現(xiàn)代碼:

        1.鼠標(biāo)移入左右側(cè)箭頭顯示,鼠標(biāo)離開箭頭隱藏

        con.addEventListener('mouseenter', function() {     arrow_l.style.display = 'block';  // 將左右箭頭的display設(shè)為block     arrow_r.style.display = 'block'; }); con.addEventListener('mouseleave', function() {     arrow_l.style.display = 'none';  // 將左右箭頭display設(shè)為none     arrow_r.style.display = 'none'; });

        2.動態(tài)添加底部小圓圈并綁定單擊事件,并且讓小圓圈的點(diǎn)擊事件和左右箭頭點(diǎn)擊事件同步

         for(var i = 0; i < ul.children.length; i++) {     var li = document.createElement('li');     li.setAttribute('index', i);  // 通過添加自定義屬性來記錄小圓圈索引號     ol.appendChild(li);      // 將創(chuàng)建的li添加進(jìn)ol里     // 生成小圓圈的同時(shí)就可以給它綁定單擊事件     li.addEventListener('click', function() {         // 排他思想 干掉所有人,留下我自己         for(var i = 0; i < ol.children.length; i++) {  // 先把所有的小圓圈改為未選中狀態(tài)             ol.children[i].className = '';         }         // 再把當(dāng)前小圓圈改為選中狀態(tài)         this.className = 'current';         var index = this.getAttribute('index');  // 獲取當(dāng)前小圓圈的索引         // 將index值賦值給num以及circle,將小圓圈的點(diǎn)擊事件和左右箭頭點(diǎn)擊事件同步         num = index;         circle = index;         animate(ul, - index * conWidth);     }) }

        3.拷貝第一張圖片添加到ul最后可以實(shí)現(xiàn)動態(tài)添加圖片

        // 克隆第一張圖片 var first = ul.children[0].cloneNode(true); // true 深拷貝 ul.appendChild(first); // 拷貝第一張圖片添加到ul最后

        4.給箭頭綁定單擊事件,并且使圖片可以無縫輪播

        ①右側(cè)箭頭的單擊事件

        var num = 0;    // 用來存儲點(diǎn)擊后圖片序號 var circle = 0;   // 用來存儲點(diǎn)擊后小圓圈序號 var flag = true;   // flag 節(jié)流閥 防止用戶點(diǎn)擊過快 圖片播放太快 // 右側(cè)箭頭點(diǎn)擊播放 arrow_r.addEventListener('click', function() {     if(flag) {         // 點(diǎn)擊后先關(guān)閉節(jié)流閥         flag = false;         // 如果播放到了最后一張,就把left直接值設(shè)為0從頭播放,同時(shí)還原num         if(num == ul.children.length - 1) {             ul.style.left = 0;             num = 0;         }         num++;         animate(ul, - num * conWidth, function() {             // 回調(diào)函數(shù) 動畫執(zhí)行完后開啟節(jié)流閥             flag = true;         });         // 小圓圈和箭頭一起變化         circle++;         /* if(circle == ol.children.length) {               circle = 0;            } */         // 可以用三元運(yùn)算符判斷小圓圈是否到了最后一個(gè),如果是最后一個(gè)就還原circle         circle == ol.children.length ? circle = 0 : circle;         circleChange();   // 使當(dāng)前小圓圈為選中狀態(tài)(重復(fù)代碼封裝到一個(gè)函數(shù)里了)     } })

        ②左側(cè)箭頭的單擊事件

        arrow_l.addEventListener('click', function() {     if(flag) {         // 首先關(guān)閉節(jié)流閥         flag = false;         // 如果播放到了第一張,就把left值設(shè)為最后一張的值         if(num == 0) {             num = ul.children.length - 1;             ul.style.left = - num * conWidth + 'px';         }         num--;         animate(ul, - num * conWidth, function() {             flag = true;         });         // 小圓圈和箭頭一起變化          circle--;         // 三元表達(dá)式   circle < 0 時(shí)說明是第一張圖片,將小圓圈改為第四個(gè)(索引為3)         circle < 0 ? circle = ol.children.length - 1 : circle;         circleChange();     } })

        circleChange();函數(shù)代碼

        // 小圓圈的選中狀態(tài)(相同代碼可以封裝為一個(gè)函數(shù),使代碼更簡潔) function circleChange() {     // 排他思想     for(var i = 0; i < ol.children.length; i++) {         ol.children[i].className = '';     }     ol.children[circle].className = 'current'; }

        5.實(shí)現(xiàn)自動輪播(動畫函數(shù))

        // 自動播放輪播圖,相當(dāng)于隔一段時(shí)間調(diào)用一次右側(cè)箭頭點(diǎn)擊事件  var timer = setInterval(function() {      // 手動調(diào)用點(diǎn)擊事件      arrow_r.click(); }, 2000);

        動畫函數(shù) animate.jsps:我沒有把這個(gè)寫入下邊index.js里,這個(gè)要你自己弄進(jìn)去哦,可以作為animate.js文件引入進(jìn)去或者直接粘貼到你的js代碼里邊)

        // obj 動畫對象 // target 目標(biāo)位置 // callback 回調(diào)函數(shù) function animate(obj, target, callback) {     clearInterval(obj.timer);     obj.timer = setInterval(function() {         var step = (target - obj.offsetLeft) / 10;  // step步長值         step = step > 0 ? Math.ceil(step) : Math.floor(step); // 大于零向上取整,小于零向下取整         if(obj.offsetLeft == target) {             clearInterval(obj.timer);             // if(callback) { // 判斷是否傳了回調(diào)函數(shù)             //     callback(); // 回調(diào)函數(shù),當(dāng)動畫執(zhí)行完后才執(zhí)行             // }             // &&是短路運(yùn)算符,存在callback時(shí)才會繼續(xù)執(zhí)行callback()             callback && callback();         }         obj.style.left = obj.offsetLeft + step + 'px';     }, 15) }

        具體實(shí)現(xiàn)代碼如下:

        HTML代碼:

        <div class="con">     <i class="icon iconfont iconarrow_left arrow-l"></i>     <i class="icon iconfont iconarrow_right arrow-r"></i>     <ul>         <li>             <a href="javascript:;"><img src="images/img1.jpg" alt=""></a>         </li>         <li>             <a href="javascript:;"><img src="images/img2.jpg" alt=""></a>         </li>         <li>             <a href="javascript:;"><img src="images/img3.jpg" alt=""></a>         </li>         <li>             <a href="javascript:;"><img src="images/img4.jpg" alt=""></a>         </li>         <li>             <a href="javascript:;"><img src="images/img5.jpg" alt=""></a>         </li>     </ul>     <ol>     </ol> </div>

        ps: 我左右側(cè)小箭頭是使用的Iconfont圖標(biāo)(iconarrow_left,iconarrow_right),要引入進(jìn)去

        <link rel="stylesheet" href="http://at.alicdn.com/t/font_1518420_oljcm07nn2.css">

        CSS代碼:

        <style>     * {         margin: 0;         padding: 0;     }     ul,li,ol,a {         list-style: none;         text-decoration: none;     }     .con {         width: 533px;         height: 300px;         margin: 100px auto;         position: relative;         background-color: #f0f0f0;         overflow: hidden;     }     .arrow-l,.arrow-r{         display: none;         width: 20px;         height: 40px;         line-height: 40px;         text-align: center;         color: #eee;         position: absolute;         top: 45%;         background-color: rgba(0, 0, 0, 0.2);         z-index: 2;         cursor: pointer;     }     .arrow-l {         left: 0;     }     .arrow-r{         right: 0;     }     ul {         position: absolute;         width: 600%;     }     ul li {         float: left;     }     ul li img {         width: 533px;         height: 300px;     }     ol {         position: absolute;         left: 50%;         bottom: 8px;         -webkit-transform: translateX(-50%);         transform: translateX(-50%);     }     ol li {         float: left;         width: 6px;         height: 6px;         margin: 0 2px;         border-radius: 50%;         border: 2px solid rgba(255, 255, 255, 0.5);         cursor: pointer;     }     .current {         background-color: #ffe;     } </style>

        詳細(xì)JavaScript代碼(index.js)

         window.addEventListener('load', function() {   // 等頁面加載完畢     // 獲取需要用到的的元素     var arrow_l = document.querySelector('.arrow-l');     var arrow_r = document.querySelector('.arrow-r');     var con = document.querySelector('.con');     var conWidth = con.offsetWidth;     // 鼠標(biāo)經(jīng)過箭頭顯示,鼠標(biāo)離開箭頭隱藏     con.addEventListener('mouseenter', function() {         arrow_l.style.display = 'block';  // 將左右箭頭的display設(shè)為block         arrow_r.style.display = 'block';         // 鼠標(biāo)經(jīng)過停止定時(shí)器         clearInterval(timer);         timer = null; // 釋放定時(shí)器變量     });     con.addEventListener('mouseleave', function() {         arrow_l.style.display = 'none';  // 將左右箭頭display設(shè)為none         arrow_r.style.display = 'none';         // 鼠標(biāo)離開再重新開啟定時(shí)器         timer = setInterval(function() {             // 手動調(diào)用點(diǎn)擊事件             arrow_r.click();  // 自動輪播         }, 2000);     });          var ul = con.querySelector('ul');     var ol = con.querySelector('ol');     // 動態(tài)添加底部小圓圈     for(var i = 0; i < ul.children.length; i++) {         var li = document.createElement('li');         // 通過添加自定義屬性來記錄小圓圈索引號         li.setAttribute('index', i);         ol.appendChild(li);         // 生成小圓圈的同時(shí)就可以給它綁定單擊事件         li.addEventListener('click', function() {             // 排他思想 干掉所有人,留下我自己             for(var i = 0; i < ol.children.length; i++) {  // 先把所有的小圓圈改為未選中狀態(tài)                 ol.children[i].className = '';             }             // 再把當(dāng)前小圓圈改為選中狀態(tài)             this.className = 'current';             var index = this.getAttribute('index');  // 獲取當(dāng)前小圓圈的索引             // 將index值賦值給num以及circle,將小圓圈的點(diǎn)擊事件和左右箭頭點(diǎn)擊事件同步             num = index;             circle = index;             animate(ul, - index * conWidth);         })     }     // 讓第一個(gè)小圓圈底色為白色(選中狀態(tài))     ol.children[0].className = 'current';     // 克隆第一張圖片     var first = ul.children[0].cloneNode(true);  // true 深拷貝     ul.appendChild(first); // 拷貝第一張圖片添加到ul最后      var num = 0;    // 用來存儲點(diǎn)擊后圖片序號     var circle = 0;   // 用來存儲點(diǎn)擊后小圓圈序號     var flag = true;   // flag 節(jié)流閥 防止用戶點(diǎn)擊過快 圖片播放太快     // 右側(cè)箭頭點(diǎn)擊播放     arrow_r.addEventListener('click', function() {         if(flag) {             // 點(diǎn)擊后先關(guān)閉節(jié)流閥             flag = false;             // 如果播放到了最后一張,就把left直接值設(shè)為0從頭播放,同時(shí)還原num             if(num == ul.children.length - 1) {                 ul.style.left = 0;                 num = 0;             }             num++;             animate(ul, - num * conWidth, function() {                 // 回調(diào)函數(shù) 動畫執(zhí)行完后開啟節(jié)流閥                 flag = true;             });             // 小圓圈和箭頭一起變化             circle++;             /* if(circle == ol.children.length) {                   circle = 0;                } */             // 可以用三元運(yùn)算符判斷小圓圈是否到了最后一個(gè),如果是最后一個(gè)就還原circle             circle == ol.children.length ? circle = 0 : circle;             circleChange();   // 使當(dāng)前小圓圈為選中狀態(tài)         }     })      // 左側(cè)箭頭點(diǎn)擊播放     arrow_l.addEventListener('click', function() {         if(flag) {             // 關(guān)閉節(jié)流閥             flag = false;             // 如果播放到了第一張,就把left值設(shè)為最后一張的值             if(num == 0) {                 num = ul.children.length - 1;                 ul.style.left = - num * conWidth + 'px';             }             num--;             animate(ul, - num * conWidth, function() {                 flag = true;             });             // 小圓圈和箭頭一起變化              circle--;             // circle < 0 時(shí)說明是第一張圖片,將小圓圈改為第四個(gè)(索引為3)             if(circle < 0) {                 circle = ol.children.length - 1;             }             circleChange();         }     })     // 小圓圈的選中狀態(tài)(相同代碼可以封裝為一個(gè)函數(shù),使代碼更簡潔)     function circleChange() {         // 排他思想         for(var i = 0; i < ol.children.length; i++) {             ol.children[i].className = '';         }         ol.children[circle].className = 'current';     }     // 自動播放輪播圖,相當(dāng)于隔一段時(shí)間調(diào)用一次右側(cè)箭頭點(diǎn)擊事件     var timer = setInterval(function() {         // 手動調(diào)用點(diǎn)擊事件         arrow_r.click();     }, 2000); })

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 人妻少妇精品视频一区二区三区| 国产精品日韩欧美一区二区三区| 亚洲国产精品VA在线观看麻豆| 自拍偷自拍亚洲精品被多人伦好爽 | 少妇人妻偷人精品无码视频新浪| 国产精品H片在线播放| 国产精品精品自在线拍| 中文字幕精品无码一区二区| 日产精品久久久久久久性色| 精品国产一级在线观看| 久久亚洲国产欧洲精品一| 久久精品国产亚洲AV大全| 亚洲AV蜜桃永久无码精品| 国产午夜精品一区二区| 亚洲无删减国产精品一区| 69国产成人综合久久精品| 亚洲国产成人精品无码区在线观看| 人妻少妇精品无码专区动漫| 久久五月精品中文字幕| 精品国产国产综合精品| 国产精品亚洲专区无码WEB| 一区二区三区精品国产欧美| 久久精品这里热有精品| 国产精品毛片久久久久久久| 成人午夜精品视频在线观看| 国产精品日韩欧美一区二区三区 | 精品多毛少妇人妻AV免费久久| 午夜精品福利视频| 亚洲精品天天影视综合网 | 国产福利视精品永久免费| 精品久久久噜噜噜久久久| 青青草原精品国产亚洲av| 无码囯产精品一区二区免费| 亚洲av永久无码精品国产精品| 亚洲精品无码午夜福利中文字幕| 婷婷成人国产精品| 青春草无码精品视频在线观 | 日本精品中文字幕| 精品国产第1页| 四虎成人欧美精品在永久在线| 久久免费精品视频|