原生js实现轮播图

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
		<title></title>
		<script src="https://cdn.bootcdn.net/ajax/libs/vConsole/3.9.0/vconsole.min.js"></script>
    <script>
        // init vConsole
        var vConsole = new VConsole();
    </script>
		<style>
			* {
				box-sizing: border-box;
			}
			body{
				margin: 0;
			}
			#banner{
				position: relative;
				width: 100vw;
				overflow: hidden;
				border: 1px solid red;
			}
			.wrap{
				width: 300vw;
				display: flex;
			}
			.wrap a{
				width: 100vw;
			}
			.wrap a img{
				width: 100%;
				vertical-align: middle;
			}

			.circle{
				position: absolute;
				bottom: 3vw;
				width: 100vw;
				display: flex;
				justify-content: center;
			}
			.circle span{
				width: 4vw;
				height: 4vw;
				background: #ddd;
				border-radius: 50%;
				margin: 0 1.5vw;
			}
			.circle span.active{
				background: green;
			}
		</style>
		<script src="js/transform.js"></script>
	</head>
	<body>
		<section id="banner">
			<div class="wrap">
				<a href="#"><img src="images/banner_01.jpg" alt=""></a>
				<a href="#"><img src="images/banner_02.jpg" alt=""></a>
				<a href="#"><img src="images/banner_03.jpg" alt=""></a>
			</div>
			<div class="circle">
				<span class="active"></span><span></span><span></span>
			</div>
		</section>
		<script>
			var banner=document.querySelector('#banner'),
				wrap=document.querySelector('.wrap'),
				spans=document.querySelectorAll('.circle span'),
				imgWidth=banner.offsetWidth;	//一张图片的宽度
			
			let startPointX=0,	//按下时手指的坐标
				disPointX=0,	//手指坐标的差
				startEleX=0,	//按下时元素的位置
				cn=0,			//当前图片走的索引数
				ln=0;			//上一个图片走的索引
			
			Transform(wrap);

			//无缝滚动
			wrap.innerHTML+=wrap.innerHTML;	//复制了一份
			wrap.style.width=wrap.children.length*imgWidth+'px';

			banner.addEventListener('touchstart', ev=>{
				console.log('touchstart', ev)
				startPointX=ev.changedTouches[0].pageX;

				//按下的是第0张图,要做的事情:让wrap走到第2份的第0张,左边就有内容
				if(cn==0){
					cn=wrap.children.length/2;
				}

				//按下的是最后一张图,要做的事情:让wrap走到第0份的最后一张图
				if(cn==wrap.children.length-1){
					cn=wrap.children.length/2-1;
				}

				wrap.style.transition='';	//不去掉的放在拖动的时候会很慢
				wrap.translateX=-imgWidth*cn;	//当改变了cn的值后也需要修正一下wrap的位置
				startEleX=wrap.translateX;	//当wrap的位置改变后,需要去更新一下初始值(元素的位置)

				ev.preventDefault();
			});
			banner.addEventListener('touchmove',ev=>{
				disPointX=ev.changedTouches[0].pageX-startPointX;
				
				wrap.translateX=startEleX+disPointX;
			});

			//自动走
			banner.addEventListener('touchend',ev=>{
				//回弹的效果
				let backWidth=imgWidth/8;	//加弹的距离,超过这个距离才能运动到下一张,小于这个距离就需要回弹

				if(Math.abs(disPointX)>backWidth){	//这个条件满足了说明现拖动的距离已经超过回弹的距离了,可以运动到下一张了
					//判断现在是往右边拖还是往左边拖
					if(disPointX<0){	//往左边拖
						cn++;
					}

					if(disPointX>0){	//往右边拖
						cn--;
					}
				}

				wrap.style.transition='0.3s';
				wrap.translateX=-imgWidth*cn;


				//修改小圆点的class
				/* 
					现在图片的索引:0,1,2,3,4,5 => 0,1,2,0,1,2
					span标签的索引:0,1,2
				 */


				spans[ln].className='';	//先去掉上一个次圆点身上的class
				spans[cn%(wrap.children.length/2)].className='active';	//先去掉上一个次圆点身上的class
				ln=cn%(wrap.children.length/2);	//再最后的时候需要去更新一下上一个的索引,更新为这次。相对于下次来说,它的上一次是不是就是当前次
			});
		</script>
	</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值