您好,登錄后才能下訂單哦!
這篇文章主要介紹純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); }
以上是“純js如何實現輪播圖效果”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。