<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>移动轮播图</title>
<style>
* {
padding: 0;
margin: 0;
}
li {
list-style: none;
}
.banner {
position: relative;
/*padding-top: 44px;*/
overflow: hidden;
}
.banner img {
width: 100%;
}
.banner ul {
overflow: hidden;/*清楚浮动*/
width: 500%;
margin-left: -100%;/*让第一张漏出来 不添加的话是最后一张*/
}
.banner ul li {
float: left;
width: 20%; /*500%的20% 就是100%*/
}
.banner ol {
position: absolute;
bottom: 5px;
right: 5px;
margin: 0;/*清除ol的默认值*/
}
.banner ol li {
display: inline-block;
width: 5px;
height: 5px;
background-color: #fff;
list-style: none;
border-radius: 2px;
transition: all .3s;
}
.banner ol li.current {
width: 15px;
}
</style>
</head>
<body>
<div class="banner">
<ul>
<li><img src="image/b3.jpg" alt=""></li>
<li><img src="image/b1.jpg" alt=""></li>
<li><img src="image/b2.jpg" alt=""></li>
<li><img src="image/b3.jpg" alt=""></li>
<li><img src="image/b1.jpg" alt=""></li>
</ul>
<!-- 小圆点 -->
<ol>
<li class="current"></li>
<li></li>
<li></li>
</ol>
</div>
<script>
var banner = document.querySelector('.banner');
var ul = banner.children[0];//做运动的主体
var ol = banner.querySelector('ol');
var bannerW = banner.offsetWidth;
console.log(bannerW);
var index = 0;
// 图片自动播放
//1.1 开启定时器
var timer = setInterval(function () {
index++;
var translatex = -index * bannerW ;
//给ul添加过渡效果 让图片优雅的移动
ul.style.transition = 'all .3s';
ul.style.transform = 'translateX('+ translatex + 'px)';
},2000);
//1.2 图片无缝滚动 不能直接判断 因为有过渡效果 有延时
//等过渡完成后 再去判断 监听过渡完成的事件 transitionend
ul.addEventListener('transitionend',function () {
//判断是否到了最后一张
if (index == 3) {
index = 0;
ul.style.transition = 'none';//去掉过渡效果 让ul快速跳到目标位置
var translatex = -index * bannerW ;//利用最新的索引号 * 宽度 继续去滚动图片
ul.style.transform = 'translateX('+ translatex + 'px)';
}
//判断是否到了第一张
if (index < 0) {
index = 2;
ul.style.transition = 'none';//去掉过渡效果 让ul快速跳到目标位置
var translatex = -index * bannerW ;//利用最新的索引号 * 宽度 继续去滚动图片
ul.style.transform = 'translateX('+ translatex + 'px)';
}
// 3. 小圆点跟随变化
// 把ol里面li带有current类名的选出来去掉类名 remove
ol.querySelector('.current').classList.remove('current');
// 让当前索引号 的小li 加上 current add
ol.children[index].classList.add('current');
});
//2 手指滑动轮播图
//2.1 触摸元素 获得手指做标的值
var startX = 0;
var moveX = 0;
var flag = false;
ul.addEventListener('touchstart',function(e){
startX = e.targetTouches[0].pageX;
clearInterval(timer);
});
//2.2 移动手指 计算手指的滑动距离 并且移动盒子
ul.addEventListener('touchmove',function (e) {
//移动的距离 = 滑动的距离 - 初始的距离
moveX = e.targetTouches[0].pageX - startX;
console.log(moveX);
//移动盒子 盒子原来的位置 + 手指移动的距离
var translatex = -index * bannerW + moveX;
//手指拖动的时候 不需要动画效果 所以取消过渡效果
ul.style.transition = 'none';
ul.style.transform = 'translateX('+ translatex + 'px)';
flag = true; // 如果用户手指滑动过 就设置为true 如果没有滑动 flag就一直是false
e.preventDefault(); // 阻止滚动屏幕的行为
});
//4 手指离开屏幕 根据滑动距离分不同的情况
//如果移动距离小于某个像素 就回弹回去
//如果移动距离大于某个像素 就上一张 下一张 滑动
ul.addEventListener('touchend',function(){
if (flag) { //如果是true才做判断计算尺寸 如果是法拉色就不执行
//4.1 大于50的操作 播放图片
if (Math.abs(moveX) > 50) { //moveX 有可能是负值 所以取绝对值
//如果是右滑 播放上一张 moveX是正值
//如果是左滑 播放下一张 moveX是负值
if (moveX > 0) {//大于0 就是正值
index--;
} else {//小于0 就是负值
index++;
}
var translatex = -index * bannerW;
ul.style.transition = 'all 0.3s';
ul.style.transform = 'translateX('+ translatex + 'px)';
} else {//4.2 小于50的操作 回弹
var translatex = -index * bannerW;
ul.style.transition = 'all 0.3s';
ul.style.transform = 'translateX('+ translatex + 'px)';
}
}
//5 手指离开屏幕 定时器重新开始
clearInterval(timer); //开启前先把前面的定时器清除 保证页面只有一个定时器
timer = setInterval(function(){
index++;
var translatex = -index * bannerW ;
//给ul添加过渡效果 让图片优雅的移动
ul.style.transition = 'all .3s';
ul.style.transform = 'translateX('+ translatex + 'px)';
},2000)
});
</script>
</body>
</html>
![]()