JQuery实现移动端广告横向自动滚动效果

JQuery实现移动端广告横向自动滚动效果(触摸可左右滑动)

前段时间万恶产品要求实现几张图片横向滚动播放,用户触摸可自由左右滑动,网上找了很久也没有找到,最后自己磕磕碰碰实现了效果,虽然有些情况下有BUG,但是应该还是可以满足部分需求了,希望有大佬愿意修改一下部分情况下的BUG(比如当第一个li滚到一般的时候,最后一个已经完全展示,这时候继续滚动,后面就会出现部分时间空白,等第一个li滚动到消失,才会截取到后面填上)


	<!DOCTYPE html>
	<html lang="en">

		<head>
	    	<meta charset="UTF-8">
		    <meta name="viewport" content="width=device-width, initial-scale=1.0">
		    <meta http-equiv="X-UA-Compatible" content="ie=edge">
		    <script></script>//记得引入JQ文件
		    <title>Document</title>
		    <style>
		        ul {
		            list-style: none;
		            white-space: nowrap;
		            position: relative;
		            left: 0px;
		            font-size: 0px;
		            padding: 0px
		        }
		
		        li {
		            margin-left: 5px;
		        }
		
		        .liWidth {
		            width: 10rem;
		            height: 100px;
		            background: red;
		            display: inline-block;
		        }
		
		        .li2 {
		            background: #000;
		        }
		
		        .li3 {
		            background: green;
		        }
		    </style>
		</head>
	
		<body>
		    <div style="position:relative;margin: 40px auto 0;overflow: hidden;">
		        <ul class="milestoneUl">
		            <li class="liWidth p1 li1">
		
		            </li>
		            <li class="liWidth li2">
		
		            </li>
		            <li class="liWidth p3 li3">
		
		            </li>
		        </ul>
		    </div>
		    <script>
		        var liArr = $('.liWidth')
		        var ulWidth = $('.milestoneUl').width()
		        var leftValue = 0
		        var p = 0, //用于判断用户是左滑还是右滑
		            t = 0;
		        //定时器,设置每100毫秒移动移动距离
		        let aboutTime = setInterval(function () {
		            slideLR()
		            leftValue = leftValue - 2
		        }, 100)
		        $('.milestoneUl').on('touchstart', function (e) {
		            t = e.originalEvent.touches[0].pageX //用户触摸屏幕时候的X轴位置
		            clearInterval(aboutTime); //用户触摸屏幕是暂停定时器
		        })
		        $('.milestoneUl').on('touchmove', function (e) {
		            p = e.originalEvent.touches[0].pageX; //用户滑动到的位置的X轴位置
		            if (t < p) { //手动右滑
		                if (leftValue >= 10 && leftValue <=20) { //这里的两个数字因为设置的手动滑每次为4像素,所以设置了区间,防止用户滑动直接跳过某个数字(其实当用户滑动到leftValue=0的时候,就应该吧最右边的li放到最左边,但是如果设置0-10的话,会有一点跳跃感,所以我设置了10-20)
		                    leftValue = -$('.liWidth').width() //使用$('.liWidth').width()获取单个li宽度
		                    $(".p1").before($(".p3"));
		                    $(".liWidth:first-child").addClass("p1").siblings().removeClass("p1")
		                    $(".liWidth:last-child").removeClass("p1").addClass("p3").siblings().removeClass("p3")
		                }
		                $('.milestoneUl').css('left', leftValue)
		                leftValue = leftValue + 4
		            } else { //手动左滑,实现很简单,就是在自动滑动的基础上增加点滑动宽度,让客户能感受到在滑动
		                slideLR()
		                leftValue = leftValue - 4
		            }
		            setTimeout(function () {
		                t = p;
		            }, 0);
		        })
		        //当用户手指离开屏幕时候,重新开启定时器
		        $('.milestoneUl').on('touchend', function (e) {
		            aboutTime = setInterval(function () {
		                slideLR()
		                leftValue = leftValue - 2
		            }, 100);
		        })
		        //自动滚动函数
		        function slideLR() {
		            if ((Math.abs(leftValue) + ($('.liWidth').width()) * 2) >= ($('.liWidth').width()) * liArr.length+3) { //数字2代表li总数-1(比如有10个li,那么这里就是9),通过动态改变定位距离leftValue加上($('.liWidth').width()) * 2)和总长度比较,大于等于的时候,就把第一个格子移动到最后一个格子后面,这里加3是因为不加3自动滚动的时候会有一个明显的小跳跃感觉,个人猜测应该是和li之间的margin距离有关
		                leftValue = 0
		                $(".p3").after($(".p1")); //把第一个格子移动到最后一个格子后面
		                $(".liWidth:first-child").addClass("p1") //保证只有首个li有p1这个类名(类名可自己取)
		                $(".liWidth:last-child").removeClass("p1").addClass("p3").siblings().removeClass(
		                    "p3") //保证只有最后一个li有p3这个类名(类名可自己取)
		            }
		            $('.milestoneUl').css('left', leftValue) //
		        }
		    </script>
		</body>
	
	</html>
			
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值