![image.png](/uploads/projects/qingfeng-patf3@tn12x1/118d789c38b623a4bc2dafb510a61c1c.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/8cba0011a99688c7834763cc2444472d.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/3df7b296035bdca0c9dcd52b6ee02fe8.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/53ec6e1b290d0988cf6af18a264c3ee0.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/0a46a58ee10c1b7c663a593ad7aabb3d.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/460fc2a8853c4d86f551d9532aaf2302.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/5b383b8da3dc7cab257346592b73e4e1.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/7628bee71d93e9b7727a7446c26d7179.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/e73b91a156e21e6fd0cc128d84975794.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/700aafe50df501165fad3c0b3e40557d.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/9e157da17780975eafb495dca5fc0254.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/bb50c0bbdf7b43283ceee8fcde8a6fae.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/b60a2b50f33178a3c058ca486836e6a8.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/deb079f06f82a8c8defb02a81726c1e8.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/2f9e9525c5cf872f44a7b4a61b1a6131.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/950fbecf2880c5d8ae8468d75e160389.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/6db8d62a9d8c716df8fa9ba488d7ecb3.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/619cff44d8c9c1a5229ba749ab75ba90.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/8b2f4f079382250989da59183da3ffca.png)
![image.png](/uploads/projects/qingfeng-patf3@tn12x1/e40a50c19666f0f50dfae214d8bcc410.png)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0,
maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">
<!-- 引入样式 -->
<link rel="stylesheet" href="./css/normalize.css">
<link rel="stylesheet" href="./css/index.css">
<title>手机端轮播图</title>
<script src="./js/index.js"></script>
</head>
<body>
<!-- 返回顶部模块 -->
<div class="goBack"></div>
<!-- 焦点图模块 -->
<div class="focus">
<ul>
<li><img src="./upload/focus3.jpg" alt=""></li>
<li><img src="./upload/focus1.jpg" alt=""></li>
<li><img src="./upload/focus2.jpg" alt=""></li>
<li><img src="./upload/focus3.jpg" alt=""></li>
<li><img src="./upload/focus1.jpg" alt=""></li>
</ul>
<ol>
<li class="current"></li>
<li></li>
<li></li>
</ol>
</div>
</body>
</html>
/* goBack */
.goBack {
display: none;
position: fixed;
bottom: 50px;
right: 20px;
width: 38px;
height: 38px;
background: url(../images/back.png) no-repeat;
background-size: 38px 38px;
}
/* focus */
.focus {
position: relative;
padding-top: 44px;
overflow: hidden;
}
.focus ul {
overflow: hidden;
width: 500%;
/* 左移和父级一样宽 */
margin-left: -100%;
}
.focus ul li {
float: left;
width: 20%;
}
.focus img {
width: 100%;
}
.focus ol {
position: absolute;
bottom: 5px;
right: 5px;
margin: 0;
}
.focus ol li {
display: inline-block;
width: 5px;
height: 5px;
background-color: red;
list-style: none;
border-radius: 2px;
transition: all .3s;
}
.focus ol li.current {
width: 15px;
}
window.addEventListener('load', function () {
// 1. 获取元素
var focus = document.querySelector('.focus');
var ul = focus.children[0];
//获取focus的宽度
var w = focus.offsetWidth;
var ol = focus.children[1];
//利用定时器 自动播放
var index = 0;
var timer = setInterval(function () {
index++;
//每次移动距离
var translatex = -index * w;
//给ul添加过渡效果 实现图片移动
ul.style.transition = 'all .3s';
//使用transform 就不需要使用定位了
ul.style.transform = 'translateX(' + translatex + 'px)';
}, 2000);
// 2. 无缝滚动:监听过渡事件transitionend完成之后 再调换位置
ul.addEventListener('transitionend', function () {
//无缝滚动 走到最后一张 让索引号恢复为0
if (index >= 3) {
index = 0;
//去掉过渡 让ul 款速的跳转到目标位置(下标为0的位置)
ul.style.transition = 'none';
// 去掉过渡后先移位到最开始下标为0 的位置
var translatex = -index * w;
ul.style.transform = 'translateX(' + translatex + 'px)';
} else if (index < 0) {
index = 2;
ul.style.transition = 'none';
// 去掉过渡后先移位到最开始下标为0 的位置
var translatex = -index * w;
ul.style.transform = 'translateX(' + translatex + 'px)';
}
// 3. 小圆点跟随变化
// 把ol里面li 带有current类名的选出来 去掉类名 remove
ol.querySelector('li.current').classList.remove('current');
// 让当前索引号的小li 加上current add
ol.children[index].classList.add('current');
})
// 4. 手指滑动轮播图
// 触摸元素 touchstart: 获取手指初始坐标
var startX = 0;
var moveX = 0; //后面我们还会使用这个移动距离
var flag = false; //用户按下后 没有挪动
ul.addEventListener('touchstart', function (e) {
//触屏的时候停止计时器
clearInterval(timer);
startX = e.targetTouches[0].pageX;
console.log(startX);
})
// 移动手指 touchmove: 计算手指的滑动距离,并且移动盒子
ul.addEventListener('touchmove', function (e) {
flag = true; //表示移动了
// 计算移动距离
moveX = e.targetTouches[0].pageX - startX;
// 移动盒子: 盒子原来的位置 +手指移动的距离
// 因为原来的位置一定是靠边的 所以这里的初始位置值为 -index * w
var translatex = -index * w + moveX;
// 手指拖动的时候 不需要动画效果 所以去掉过渡效果
ul.style.transition = 'none';
ul.style.transform = 'translateX(' + translatex + 'px)';
e.preventDefault(); //阻止滚动屏幕
})
ul.addEventListener('touchend', function () {
if (flag) { //只有手指移动之后 我们才判断是否回弹 或者播放下一张
// (1) 如果移动距离大于50像素 我们就播放上一张 或者下一张
if (Math.abs(moveX) > 50) {
// 如果是右边滑动 就是播放上一张 moveX是正值
if (moveX > 0) {
index--;
} else {
// 如果是左边滑动 就是播放上一张 moveX是负值
index++;
}
// 做运动
var translatex = -index * w;
//给ul添加过渡效果 实现图片移动
ul.style.transition = 'all .3s';
//使用transform 就不需要使用定位了
ul.style.transform = 'translateX(' + translatex + 'px)';
} else {
// (2)如果移动距离 小于50px 我们就回弹
var translatex = -index * w;
ul.style.transition = 'all .1s';
ul.style.transform = 'translateX(' + translatex + 'px)';
}
flag = false;
}
//手指离开重启定时器
clearInterval(timer); //先清除定时器
timer = setInterval(function () {
index++;
//每次移动距离
var translatex = -index * w;
//给ul添加过渡效果 实现图片移动
ul.style.transition = 'all .3s';
//使用transform 就不需要使用定位了
ul.style.transform = 'translateX(' + translatex + 'px)';
}, 2000);
})
//返回顶部模块制作
var goBack = document.querySelector('.goBack');
var nav = document.querySelector('nav');
window.addEventListener('scroll', function () {
if (window.pageYOffset >= nav.offsetTop) {
goBack.style.display = 'block';
} else {
goBack.style.display = 'none';
}
})
goBack.addEventListener('click', function () {
window.scroll(0, 0);
})
})