简单轮播图2
该文章是《前端新手写轮播图》的第二篇,添加了过渡动画,自动轮播的功能
功能
- 点击切换图片
- 自动轮播
- 无缝轮播
- 有动画过渡
展示

设计思路
-
将轮播图以行的形式进行排列(每张图大小是一样的)
-
增加一个视窗(我们看到的内容区),这个视窗的大小是图片的大小,将视窗之外的内容设置隐藏
-
给以行排列的图片设置成绝对定位
-
每点击一次切换,进行绝对定位的计算,让该显示的图片定位到视窗区域
-
在最后加上克隆最前面两张的图片。这样便能无缝轮播

将视窗外的内容不隐藏,就会看到以下内容

关键源码解析
在第一篇文章前端新手写轮播图的基础上进行解析
-
如何进行无缝轮播?
答:在最后加上克隆最前面两张的图片。当轮播到第六张图片时,先去掉间隔时间,然后瞬间定位到第二张图片。当轮播到第一张时,去掉间隔时间,瞬间定位到第五张图片。这样下次在临界图片处轮播时候就能进行无缝轮播。
1. 在最后加上克隆最前面两张的图片。 let swipePic = document.querySelector('.swipe__pic'); cloneNode(swipePic, 0); cloneNode(swipePic, 1); const cloneNode = (elem, index) => { //复制节点,放到最后,使得动画过渡效果连续 let nodeTmp = swipePicChildNode[index].cloneNode(true); elem.appendChild(nodeTmp); }; 2. 处理轮播到临界图片的情况 // 单个图片的宽度 const singlePicWidth = 200; const setPosition = (currrentPosition) => { // 轮播到最后一张图片时,定位到第二张图片 if (currrentPosition == (singlePicWidth - swipeWidth)) { setTransitionDuration('0s'); setLeftWidth(-singlePicWidth); } // 轮播到第一张图片时,定位到倒数第二张图片 if(currrentPosition == 0) { setTransitionDuration('0s'); setLeftWidth(2*singlePicWidth - swipeWidth); } return; }; -
创建位置按钮
// 创建点击按钮的节点 const createBottonNode = (elem, index) => { let nodeTmp = document.createElement('div'); nodeTmp.innerText = index + 1; nodeTmp.className = 'swipe__button-item'; nodeTmp.onclick = () => { actionClick(index); } elem.appendChild(nodeTmp); }; -
设置自动轮播
// 动画过渡时间 const durationTime = 1000; // 模拟点击 const autoClick = (dirction, startPlay) => { // 设置轮播过渡时间 swipePic.style.webkitTransitionDuration = durationTime + 'ms'; // 计算轮播后的宽度 let styleLeft = parseInt(swipePic.style.left) + singlePicWidth*dirction; // 设置剩余宽度 swipePic.style.left = styleLeft + 'px'; setButtonPos(); // 在轮播完之后进行位置的切换,不然不会执行轮播的过渡动画 setTimeout(() => { setPosition(styleLeft); startPlay && startPlay(); // 设置自动轮播 }, durationTime); }; // 设置自动轮播 function startPlay() { timePlay = setInterval(autoClick, durationTime + 1000); } // 模拟向右滑动动作 arrowRight.onclick = () => { // 去除自动轮播 stopPlay(); // 点击动作,点击执行完后设置自动轮播 picMove(plus, startPlay); };