注 : 此處內容較多, 只顯示程式碼, 具體講解看註釋. 具體參考 "黑馬 pink老師" https://www.bilibili.com/video/BV1Sy4y1C7ha?p=328&spm_id_from=pageDriver
資料夾結構
html 結構
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <link rel="stylesheet" type="text/css" href="css/css.css" /> <link rel="stylesheet" type="text/css" href="css/base.css"/> <script src="js/animate.js" type="text/javascript" charset="utf-8"></script> <script src="js/index.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div class="focus fl"> <!-- 左側按鈕 --> <a href="javascript:;" class="arrow-l"> < </a> <!-- 右側按鈕 --> <a href="javascript:;" class="arrow-r"> </a> <!-- 核心的滾動區域 --> <ul> <li> <a href="#"><img src="img/1.jpeg" alt=""></a> </li> <li> <a href="#"><img src="img/2.jpeg" alt=""></a> </li> <li> <a href="#"><img src="img/3.webp" alt=""></a> </li> <li> <a href="#"><img src="img/4.webp" alt=""></a> </li> </ul> <!-- 小圓圈 --> <ol class="circle"> </ol> </div> </body> </html>
css 樣式 css檔案
/*這個檔案裡面放的是 首頁的樣式*/ .main { width: 980px; height: 455px; margin-left: 219px; margin-top: 10px; } .focus { position: relative; width: 500px; height: 333px; background-color: purple; overflow: hidden; } .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; }
清除 瀏覽器預設樣式 base檔案
/*清除元素預設的內外邊距 */ * { margin: 0; padding: 0; } /*讓所有斜體 不傾斜*/ em, i { font-style: normal; } /*去掉列表前面的小點*/ li { list-style: none; } /*圖片沒有邊框 去掉圖片底側的空白縫隙*/ img { border: 0; /*ie6*/ vertical-align: middle; } /*讓button 按鈕 變成小手*/ button { cursor: pointer; } /*取消連結的下劃線*/ a { color: #666; text-decoration: none; } a:hover { color: #e33333; } button, input { font-family: 'Microsoft YaHei', 'Heiti SC', tahoma, arial, 'Hiragino Sans GB', \\5B8B\4F53, sans-serif; /*取消輪廓線 藍色的*/ outline: none; } body { background-color: #fff; font: 12px/1.5 'Microsoft YaHei', 'Heiti SC', tahoma, arial, 'Hiragino Sans GB', \\5B8B\4F53, sans-serif; color: #666; } .hide, .none { display: none; } /*清除浮動*/ .clearfix:after { visibility: hidden; clear: both; display: block; content: "."; height: 0; } .clearfix { *zoom: 1 }
js index 程式碼
window.addEventListener('load', function() { // 1. 獲取元素 let arrow_l = document.querySelector('.arrow-l'); // 左側按鈕 let arrow_r = document.querySelector('.arrow-r'); // 右側按鈕 let focus = document.querySelector('.focus'); // 大盒子 let focusWidth = focus.offsetWidth; // 大盒子的寬度 // mouseenter 滑鼠劃入 不會觸發冒泡 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) }) // 2. 動態生成小圓圈 let ul = focus.querySelector('ul'); let ol = focus.querySelector('.circle'); for (let i = 0; i < ul.children.length; i++) { let li = document.createElement('li'); // 建立 li // 記錄當前小圓圓的索引號 通過自定義屬性來做 li.setAttribute('index', i); // 把小li插到 ol 裡面 ol.appendChild(li); // 4. 小圓圈的排他思想 我們可以直接在生成小圓圓的同時直接繫結點選事件 li.addEventListener('click', function() { // 幹掉所有人 for (let j = 0; j < ol.children.length; j++) { ol.children[j].className = ''; } // 留下我自己 this.className = 'current'; // 5. 點選小圓圈, 移動圖片 當然移動的是 ul // ul 的移動距離 小圓圓的索引號 乘以 圖片的寬度 注意是負值 // 當我們點選了某個小 li 就拿到當前小 li 的索引號 let index = this.getAttribute('index'); // 當我們點選了某個小li 就要把這個li 的索引號給 num num = index; // 當我們點選了某個小 li 就要把這個li 的索引號給 circle circle = index; console.log(focusWidth); console.log(index); animate(ul, -index * focusWidth); }) } // 把 ol 裡面的第一個小 li 設定類名為 current ol.children[0].className = 'current'; // 6. 克隆第一張圖片 (li) 放到 ul 最後面 let first = ul.children[0].cloneNode(true); ul.appendChild(first); // 7. 點選右側按鈕, 圖片滾動一張 let num = 0; let circle = 0; arrow_r.addEventListener('click', function() { if (flag) { flag = false; // 關閉節流閥 if (num == ul.children.length - 1) { // 如果走到了最後負值的一張圖片, 此時 我們的 ul 要快速復原 left 改為 0 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; // }; circle = circle == ol.children.length ? circle = 0 : circle; // 呼叫函式 circleChange(); } }); // 8. 左側按鈕 arrow_l.addEventListener('click', function() { if (flag) { flag = false; if (num == 0) { // 如果走到了最後負值的一張圖片, 此時 我們的 ul 要快速復原 left 改為 0 num = ul.children.length - 1; ul.style.left = -num * focusWidth + 'px'; } num--; animate(ul, -num * focusWidth, function () { flag = true; }); // 8. 點選右側按鈕, 小圓圈跟隨一起變化 可以再宣告一個變數控制小圓圈的播放; circle--; // 如果 circle < 0 說明張圖片, 則小圓圈要改為第四個小圓圈 // if (circle < 0) { // circle = ol.children.length - 1; // }; circle = circle < 0 ? circle = ol.children.length - 1 : circle; // 呼叫函式 circleChange(); } }) function circleChange() { // 先清除其餘小圓圓的 current 類名 for (let i = 0; i < ol.children.length; i++) { ol.children[i].className = ''; } // 留下當前的小圓圈的 current 類名 ol.children[circle].className = 'current'; } // 10. 自動播放輪播圖 let timer = setInterval(function() { // 手動呼叫事件 arrow_r.click(); }, 2000) })
js animate程式碼
function animate(obj, target, callback) { // 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); }
img 圖片
所有內容 , 複製貼上直接可用