做过很多种类型的幻灯片,无缝滑动幻灯加上自动播放应该是幻灯最常见的形式,各大组件库提供的幻灯也一般是这种形式。
那这次用原生js实现一个。
点击图片看效果。
功能:
1、默认自动播放,鼠标经过停止,移开继续自动播放。
2、点击上一张、下一张,通过左右滑动实现切换。
3、通过克隆节点实现无缝滑动。
4、核心在于定时器的运用。
核心代码:
//准备数据 // 初始化界面 // 克隆第一个节点到最后,克隆最后一个节点到最前面 // 点击下一张 改变num的值 ,实现图片向左边滑动一张 条件:如果滑动到最后一张,要立刻移动到第二张 改变小圆点的高亮状态 // 点击上一张 改变num的值 实现图片向右边滑动一张 条件:如果滑动到第一张,则立刻移动到倒数第二张,改变小圆点的高亮 // 点击小圆点,改变num的值,滑动图片到对应的位置,改变高亮状态 // 找对象 const oBanner = document.querySelector('.fy-banner'); const oUl = oBanner.querySelector('.fy-banner-ul'); const oDoitUl = oBanner.querySelector('.pagebarlist'); const oDoitLis = oDoitUl.getElementsByClassName('pagebaritem'); const oBtnNext = oBanner.querySelector('.btn-next'); const oBtnPrev = oBanner.querySelector('.btn-prev'); // 准备数据 let arr = ['images/banner_1.png', 'images/banner_2.jpg']; let len = arr.length; // 获取banner的宽度 let oBannerWidth = oBanner.clientWidth; // console.log(oBannerWidth); // 初始化界面 let str = ''; let str1 = ''; arr.forEach(function (item) { str += `<li class="fy-banner-li"> <a href="#" class="fy-banner-a"> <img src="${item}" alt="中秋活动" class="fy-banner-img"> </a> </li>`; str1 += `<li class="pagebaritem"></li>`; }) oUl.innerHTML = str; oDoitUl.innerHTML = str1; // 把最后一个节点克隆到第一个位置 oUl.prepend(oUl.lastElementChild.cloneNode(true)); // 把第二个节点克隆到最后一个位置 oUl.append(oUl.children[1].cloneNode(true)); // 初始化第一个 0 1 2 3 let num = 0; oDoitLis[num].classList.add('active'); oUl.style.transform = `translateX(-${oBannerWidth * (num + 1)}px)`; // 自动播放 let timer = null; timer = setInterval(autoPlay, 3000); oBanner.addEventListener('mouseenter', function () { clearInterval(timer); }) oBanner.addEventListener('mouseleave', function () { timer = setInterval(autoPlay, 3000); }) // 点击下一张 oBtnNext.addEventListener('click', function () { autoPlay(); }) // 点击上一张 oBtnPrev.addEventListener('click', function () { // num的变化 1 0 num--; // 图片滑动 // 异步的时候把动画移除了,所以需要再次添加上动画过程。 slide(); if (num <= -1) { num = len - 1; // 回到倒数第二张图片的位置 stopSlide(); } // 小圆点高亮的变化 changeDoit(); }); // 点击小圆点的切换 [...oDoitLis].forEach(function (item, index) { item.addEventListener('click', function () { // 更新num的值 num = index; // 图片滑动 slide(); // 高亮更新 changeDoit(); }) }) function autoPlay () { // num的变化 1 0 num++; // 图片滑动 // 异步的时候把动画移除了,所以需要再次添加上动画过程。 slide(); if (num >= len) { num = 0; // 回到第二张图片的位置 stopSlide(); } changeDoit(); } // 图片滑动 function slide () { oUl.style.transition = '0.5s linear'; oUl.style.transform = `translateX(-${oBannerWidth * (num + 1)}px)`; } // 图片停止滑动 function stopSlide () { setTimeout(function () { // 异步执行把图片挪回到初始位置的时候,不能有动画 oUl.style.transition = 'none'; oUl.style.transform = `translateX(-${oBannerWidth * (num + 1)}px)`; }, 500) } // 小圆点高亮的变化函数 function changeDoit () { [...oDoitLis].forEach(function (item, index) { item.classList.remove('active'); }) oDoitLis[num].classList.add('active'); } }
发表评论:
◎请发表你卖萌撒娇或一针见血的评论,严禁小广告。