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

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

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

关键源码解析
在第一篇文章前端新手写轮播图的基础上进行解析
如何进行无缝轮播?
答:在最后加上克隆最前面两张的图片。当轮播到第六张图片时,先去掉间隔时间,然后瞬间定位到第二张图片。当轮播到第一张时,去掉间隔时间,瞬间定位到第五张图片。这样下次在临界图片处轮播时候就能进行无缝轮播。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
331. 在最后加上克隆最前面两张的图片。
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;
};
创建位置按钮
1
2
3
4
5
6
7
8
9
10// 创建点击按钮的节点
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);
};设置自动轮播
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36// 动画过渡时间
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);
};