純js實現輪播圖效果
本文實例為大傢分享瞭js實現輪播圖效果的具體代碼,供大傢參考,具體內容如下
結合我們前面學過的:鼠標監聽事件(移入移出、點擊),創建節點,排他思想、定時器等,就可以實現一個能手動和自動播放的輪播圖
效果圖
代碼
1. css
/*清除元素默認的內外邊距 */ * { margin: 0; padding: 0 } body{ width: 1000px; margin: 0 auto; } /*去掉列表前面的小點*/ li { list-style: none; } /*圖片沒有邊框 去掉圖片底側的空白縫隙*/ img { border: 0; /*ie6*/ vertical-align: middle; } /*取消鏈接的下劃線*/ a { color: #666; text-decoration: none; } a:hover { color: #e33333; } .fl { float: left; } .fr { float: right; } .focus { position: relative; width: 721px; height: 455px; background-color: purple; overflow: hidden; margin-top: 20px; } .focus ul { position: absolute; top: 0; left: 0; width: 600%; } .focus ul li { float: left; } .arrow-l, .arrow-r { display: none; position: absolute; top: 50%; margin-top: -20px; width: 24px; height: 40px; background: rgba(0, 0, 0, .3); text-align: center; line-height: 40px; color: #fff; font-family: 'icomoon'; font-size: 18px; z-index: 2; } .arrow-r { right: 0; } .circle { position: absolute; bottom: 10px; left: 50px; } .circle li { float: left; width: 8px; height: 8px; /*background-color: #fff;*/ border: 2px solid rgba(255, 255, 255, 0.5); margin: 0 3px; border-radius: 50%; /*鼠標經過顯示小手*/ cursor: pointer; } .current { background-color: #fff; }
2. html
<div class="focus fl"> <!-- 左側按鈕 --> <a href="javascript:;" class="arrow-l arrow"> < </a> <!-- 右側按鈕 --> <a href="javascript:;" class="arrow-r arrow"> > </a> <!-- 核心的滾動區域 --> <ul> <li> <a href="#" ><img src="images/focus.jpg" alt=""></a> </li> <li> <a href="#" ><img src="images/focus1.jpg" alt=""></a> </li> <li> <a href="#" ><img src="images/focus2.jpg" alt=""></a> </li> <li> <a href="#" ><img src="images/focus3.jpg" alt=""></a> </li> </ul> <!-- 小圓圈 --> <ol class="circle"> </ol> </div>
3. JavaScript
window.addEventListener('load', function() { // 1. 獲取元素 var arrow_l = document.querySelector('.arrow-l'); var arrow_r = document.querySelector('.arrow-r'); var focus = document.querySelector('.focus'); var focusWidth = focus.offsetWidth; // 2. 鼠標經過focus 就顯示隱藏左右按鈕 focus.addEventListener('mouseenter', function() { arrow_l.style.display = 'block'; arrow_r.style.display = 'block'; clearInterval(timer); timer = null; // 清除定時器變量 }); focus.addEventListener('mouseleave', function() { arrow_l.style.display = 'none'; arrow_r.style.display = 'none'; timer = setInterval(function() { //手動調用點擊事件 arrow_r.click(); }, 2000); }); // 3. 動態生成小圓圈 有幾張圖片,我就生成幾個小圓圈 var ul = focus.querySelector('ul'); var ol = focus.querySelector('.circle'); // console.log(ul.children.length); for (var i = 0; i < ul.children.length; i++) { // 創建一個小li var li = document.createElement('li'); // 記錄當前小圓圈的索引號 通過自定義屬性來做 li.setAttribute('index', i); // 把小li插入到ol 裡面 ol.appendChild(li); // 4. 小圓圈的排他思想 我們可以直接在生成小圓圈的同時直接綁定點擊事件 li.addEventListener('click', function() { // 幹掉所有人 把所有的小li 清除 current 類名 for (var i = 0; i < ol.children.length; i++) { ol.children[i].className = ''; } // 留下我自己 當前的小li 設置current 類名 this.className = 'current'; // 5. 點擊小圓圈,移動圖片 當然移動的是 ul // ul 的移動距離 小圓圈的索引號 乘以 圖片的寬度 註意是負值 // 當我們點擊瞭某個小li 就拿到當前小li 的索引號 var index = this.getAttribute('index'); // 當我們點擊瞭某個小li 就要把這個li 的索引號給 num num = index; // 當我們點擊瞭某個小li 就要把這個li 的索引號給 circle circle = index; // num = circle = index; console.log(focusWidth); console.log(index); animate(ul, -index * focusWidth); }) } // 把ol裡面的第一個小li設置類名為 current ol.children[0].className = 'current'; // 6. 克隆第一張圖片(li)放到ul 最後面 var first = ul.children[0].cloneNode(true); ul.appendChild(first); // 7. 點擊右側按鈕, 圖片滾動一張 var num = 0; // circle 控制小圓圈的播放 var circle = 0; // flag 節流閥 var flag = true; arrow_r.addEventListener('click', function() { if (flag) { flag = false; // 關閉節流閥 // 如果走到瞭最後復制的一張圖片,此時 我們的ul 要快速復原 left 改為 0 if (num == ul.children.length - 1) { ul.style.left = 0; num = 0; } num++; animate(ul, -num * focusWidth, function() { flag = true; // 打開節流閥 }); // 8. 點擊右側按鈕,小圓圈跟隨一起變化 可以再聲明一個變量控制小圓圈的播放 circle++; // 如果circle == 4 說明走到最後我們克隆的這張圖片瞭 我們就復原 if (circle == ol.children.length) { circle = 0; } // 調用函數 circleChange(); } }); // 9. 左側按鈕做法 arrow_l.addEventListener('click', function() { if (flag) { flag = false; if (num == 0) { num = ul.children.length - 1; ul.style.left = -num * focusWidth + 'px'; } num--; animate(ul, -num * focusWidth, function() { flag = true; }); // 點擊左側按鈕,小圓圈跟隨一起變化 可以再聲明一個變量控制小圓圈的播放 circle--; // 如果circle < 0 說明第一張圖片,則小圓圈要改為第4個小圓圈(3) // if (circle < 0) { // circle = ol.children.length - 1; // } circle = circle < 0 ? ol.children.length - 1 : circle; // 調用函數 circleChange(); } }); function circleChange() { // 先清除其餘小圓圈的current類名 for (var i = 0; i < ol.children.length; i++) { ol.children[i].className = ''; } // 留下當前的小圓圈的current類名 ol.children[circle].className = 'current'; } // 10. 自動播放輪播圖 var timer = setInterval(function() { //手動調用點擊事件 arrow_r.click(); }, 2000); })
重點!!!
用到的實現圖片移動的動畫文件,animate.js
function animate(obj, target, callback) { // console.log(callback); callback = function() {} 調用的時候 callback() // 先清除以前的定時器,隻保留當前的一個定時器執行 clearInterval(obj.timer); obj.timer = setInterval(function() { // 步長值寫到定時器的裡面 // 把我們步長值改為整數 不要出現小數的問題 // var step = Math.ceil((target - obj.offsetLeft) / 10); var step = (target - obj.offsetLeft) / 10; step = step > 0 ? Math.ceil(step) : Math.floor(step); if (obj.offsetLeft == target) { // 停止動畫 本質是停止定時器 clearInterval(obj.timer); // 回調函數寫到定時器結束裡面 // if (callback) { // // 調用函數 // callback(); // } callback && callback(); } // 把每次加1 這個步長值改為一個慢慢變小的值 步長公式:(目標值 - 現在的位置) / 10 obj.style.left = obj.offsetLeft + step + 'px'; }, 15); }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。