<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>demo</title> <style> * { padding: 0; margin: 0; box-sizing: border-box; } #swiper { width: 960px; height: 400px; position: relative; margin: 0 auto; overflow: hidden; } .swiper-container { position: absolute; height: 400px; left: 0; top: 0; display: flex; transition: all 0.3s; user-select: none; display: flex; align-items: center; } li { width: 300px; height: 300px; list-style: none; } li.magnify { transform: scale(1.1); transition: all 1s; } li.lessen { transform: scale(0.9); transition: all 1s; } li img { width: 300px; height: 300px; } li:not(last-child) { margin-right: 30px; } </style></head><body> <div id="swiper"> </div></body><script> // 首先获取视图层元素 const swiperEl = document.querySelector('#swiper'); const createUl = document.createElement('ul') createUl.innerHTML = ` <ul class="swiper-container"> <li> <img draggable="false" src="./img/01.jpg" alt=""> </li> <li> <img draggable="false" src="./img/02.jpg" alt=""> </li> <li> <img draggable="false" src="./img/03.jpg" alt=""> </li> <li> <img draggable="false" src="./img/04.jpg" alt=""> </li> <li> <img draggable="false" src="./img/05.jpg" alt=""> </li> <li> <img draggable="false" src="./img/06.jpg" alt=""> </li> <li> <img draggable="false" src="./img/07.jpg" alt=""> </li> <li> <img draggable="false" src="./img/08.jpg" alt=""> </li> <li> <img draggable="false" src="./img/09.jpg" alt=""> </li> </ul>` swiperEl.appendChild(createUl) // 在视图层里边查找容器元素 const containerEl = swiperEl.querySelector('.swiper-container'); let state = 0; // 鼠标默认状态 let index = 0 let oldEvent = null; // 用来记录鼠标上次的地位 // 获取到所有的滑块元素 const itemEls = containerEl.querySelectorAll('li'); itemEls[1].classList.add('magnify') itemEls[0].classList.add('lessen') itemEls[2].classList.add('lessen') // 获取到滑块的宽度 const itemWidth = itemEls[0].offsetWidth; // let left = containerEl.offsetLeft; // 存储容器的left,这里咱们依据index来计算初始容器的left值 let left = 0 - (itemWidth + 30) * index; // 设置容器的初始地位 containerEl.style.left = left + 'px'; containerEl.addEventListener('mousedown', (event) => { state = 1; // 设置为1示意按下了鼠标 startEvent = oldEvent = event; // 当鼠标按下时候记录初始地位 }); containerEl.addEventListener('mousemove', (event) => { if (state != 1) return; // 只有当state == 1时候才容许执行该事件 if (event.pageX < oldEvent.pageX) { left -= oldEvent.pageX - event.pageX; } else { left += event.pageX - oldEvent.pageX; } // 完事之后记得把以后鼠标的地位赋值给oldEvent oldEvent = event; // 最初再把left赋值给容器 containerEl.style.left = left + 'px'; }); containerEl.addEventListener('mouseup', (event) => { state = 0; // 复原默认状态 if (event.pageX < startEvent.pageX) { index++; } else { index--; } if (index < 0) { index = 0; } else if (index > itemEls.length - 3) { index = itemEls.length - 3; } left = 0 - (itemWidth + 30) * index; containerEl.style.left = left + 'px'; animation(index) }); // 自动播放状态 let autoplay = true; setInterval(() => { if (!autoplay) return index++; if (index > itemEls.length - 3) { index = 0; } left = 0 - (itemWidth + 30) * index; containerEl.style.left = left + 'px'; animation(index) }, 2000); containerEl.addEventListener('mouseover', () => { // 鼠标挪动到容器上,进行播放 autoplay = false; }); containerEl.addEventListener('mouseout', () => { // 鼠标从容器上移开,复原播放 autoplay = true; }); const animation = (index) => { for (let i = 0; i < itemEls.length; i++) { ADD_DELETE_ClASS('remove', i, 'magnify') ADD_DELETE_ClASS('remove', i, 'lessen') } ADD_DELETE_ClASS('add', index + 1, 'magnify') ADD_DELETE_ClASS('add', index, 'lessen') ADD_DELETE_ClASS('add', index + 2, 'lessen') } const ADD_DELETE_ClASS = (state, index, name) => { if (state === 'add') { return itemEls[index].classList.add(name) } else { itemEls[index].classList.remove(name) } }</script></html>