web移动端touch&手势&轮播图

触摸事件touch
绑定事件
obj.addEventListener('touchstart',function(){});

/*
touchstart(手指触摸屏幕时触发)
touchmove(手指在屏幕滑动时)
touchend(手指离开屏幕时)
touchcancel(被迫终止滑动时,如来电,弹消息)
*/
事件对象
touchList//触摸点(和屏幕接触点的)的集合
changedTouches // 改变后的触摸点集合(每个事件都会记录)
targetTouches  //当前元素的触发点集合(离开屏幕时不会记录触摸点)
touches  //页面上所有触发点集合(同上)

e.touches[0] //第一个触摸点
clientX、pageX、screenX的区别
clientX //基于浏览器窗口(视口)
pageX //基于页面(视口)
screenX //基于屏幕
        box.addEventListener('touchstart',function (e) {
            console.log("start");
            console.log(e);
            console.log(e.touches[0].clientX+"---->"+e.touches[0].clientY);
            console.log(e.touches[0].pageX+"--->"+e.touches[0].pageY);
            console.log(e.touches[0].screenX+"--->"+e.touches[0].screenY);
        })

在这里插入图片描述

移动端的手势事件(swipe,swipeLeft,swipeRight,swipeUp,swipeDown)
<script>
    window.onload=function () {
        //理解移动端的手势事件
        //swipe  swipeLeft  swipeRight  swipeUp  swipeDown
        //左滑和右滑手势怎么实现

        var bindSwipeEvent=function (dom,leftCallback,rightCallback) {
            //手势的条件
            //1、必须滑动过
            //2、滑动的距离50px
            var isMove=false;
            var startX=0;
            var distanceX=0;
            dom.addEventListener('touchstart',function (e) {
                startX=e.touches[0].clientX;
            });
            dom.addEventListener('touchmove',function (e) {
                isMove=true;
                var moveX=e.touches[0].clientX;
                distanceX=moveX-startX;
            });
            dom.addEventListener('touchend',function (e) {
                //滑动结束
                if(isMove && Math.abs(distanceX)>50){
                    if(distanceX>0){
                        rightCallback&&rightCallback.call(this,e);
                    }else{
                        leftCallback&& leftCallback.call(this,e);
                    }
                }
            });

        };
        bindSwipeEvent(document.getElementsByTagName('div')[0],function (e) {
            console.log(this);
            console.log('左滑手势');
        },function (e) {
            console.log(this);
            console.log('右滑手势');
        });
    };
</script>
轮播图

在这里插入图片描述
在这里插入图片描述

需求分析
1、自动轮播且无缝(轮播8张图,ul:first-child中共10张图)   定时器,过渡transition
2、滑动效果   利用touch事件完成
3、滑动结束的时候滑动距离distanceX不超过屏幕的1/3——吸附回去  过渡
4、滑动距离超过屏幕的1/3——切换(上一张index--,下一张index++根据滑动的方向(distanceX>0)

准备工作
    //轮播图
    var banner=document.querySelector('.banner');

    //屏幕宽度
    var width=banner.offsetWidth;

    //图片容器
    var imageBox=banner.querySelector('ul:first-child');


    //点容器
    var pointBox=banner.querySelector('ul:last-child');

    //所有的点
    var points=pointBox.querySelectorAll('li');

    //加过渡
    var addTransition=function () {
        imageBox.style.transition='all 0.2s';
        imageBox.style.webkitTransition='all 0.2s';
    };

    //清过渡
    var removeTransition=function () {
        imageBox.style.transition='none';
        imageBox.style.webkitTransition='none';
    };

    //做位移
    var setTranslateX=function (translateX) {
        imageBox.style.transform='translateX('+translateX+'px)';
        imageBox.style.webkitTransform='translateX('+translateX+'px)';
    };
自动无缝轮播
var index=1;//当前显示第二张图
var timer=setInterval(function () {
    index++;
    //加过渡
    addTransition();

    //做位移
    setTranslateX(-index*width);
},1000);

//实现无缝
imageBox.addEventListener('transitionend',function () {
        //自动滚动的无缝
        if(index>=9){
            index=1;
            //瞬间定位
            //清过渡
            removeTransition();
            setTranslateX(-index*width);
        }
        //滑动的无缝——向右
        else if(index<=0){
            index=8;
            removeTransition();
            setTranslateX(-index*width);
        }

        /*根据索引设置点*/
        setPoint();
});

//设置点
var setPoint=function () {
   //清除样式
   for(var i=0;i<points.length;i++){
       var obj=points[i];
       obj.classList.remove('now');
   }
   //给对应点加上样式
   points[index-1].classList.add('now');
};

touchstart(起始点startX)
var startX=0;
var distanceX=0;
var isMove=false;
imageBox.addEventListener('touchstart',function (e) {
   //清除定时器
   clearInterval(timer);

   //记录起始位置的X坐标
   startX=e.touches[0].clientX;
});
touchmove(计算位移distanceX—>imageBox移动距离-index*width+distanceX)
imageBox.addEventListener('touchmove',function (e) {
    //记录滑动过程的x坐标
    var moveX=e.touches[0].clientX;

    //计算位移,有正负方向
    distanceX=moveX-startX;

    //计算目标元素的位移  不用管正负
    //元素将要的定位=当前定位+手指移动的距离
    var translateX=-index*width+distanceX;

    //滑动-->元素随着手指的滑动做位置的改变
    //清过渡
    removeTransition();
    setTranslateX(translateX);
    isMove=true;
});
touchend(比较手指滑动距离Math.abs(distanceX)和width/3—>做吸附|切换)
 imageBox.addEventListener('touchend',function (e) {
     //要使用移动的距离
     if(isMove){
         if(Math.abs(distanceX)<width/3){
             //吸附
             addTransition();
             setTranslateX(-index*width);
         }
         else{
             //切换
             //左滑动  下一张
             if(distanceX<0)
                 index++;
             //右滑动   上一张
             if(distanceX>0)
                 index--;

             addTransition();
             setTranslateX(-index*width);
         }
     }

     //重置  防止污染第二次滑动
     startX=0;
     distanceX=0;
     isMove=false;
     clearInterval(timer);
     
     //恢复自动轮播
     timer=setInterval(function () {
         index++;
         //加过渡
         addTransition();

         //做位移
         setTranslateX(-index*width);
     },1000);

 });
注意事项

1、兼容(webkit)
2、index的临界值
3、清除定时器、设置定时器
4、重置变量
5、优化(isMove)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现移动端touch事件的横向滑动列表效果可以使用原生的JavaScript和CSS3来实现。 首先,我们需要在HTML中创建一个容器元素,用来包含列表项。容器元素需要设置overflow-x属性为scroll,使得内容超出容器范围时可以滚动。 ```html <div class="container"> <ul class="list"> <li>项1</li> <li>项2</li> <li>项3</li> <li>项4</li> <li>项5</li> </ul> </div> ``` 然后,在CSS中,我们需要设置容器元素和列表项的样式,以及使用CSS3的transition属性来实现平滑的过渡效果。 ```css .container { width: 100%; overflow-x: scroll; -webkit-overflow-scrolling: touch; /* 添加iOS滚动效果 */ } .list { display: flex; flex-wrap: nowrap; /* 设置列表项不换行 */ transition: transform 0.3s ease; /* 添加平滑的过渡效果 */ } .list li { width: 100px; height: 100px; margin-right: 10px; background-color: #ccc; } ``` 最后,在JavaScript中,我们需要监听容器元素的touchstart、touchmove和touchend事件,计算滑动距离并通过改变列表项的transform属性来实现横向滑动效果。 ```javascript const container = document.querySelector('.container'); const list = document.querySelector('.list'); let isDragging = false; let startPosition = 0; let currentTranslate = 0; let prevTranslate = 0; let animationId = 0; container.addEventListener('touchstart', touchStart); container.addEventListener('touchmove', touchMove); container.addEventListener('touchend', touchEnd); container.addEventListener('touchcancel', touchEnd); function touchStart(event) { if (event.target.classList.contains('list')) { isDragging = true; startPosition = event.touches[0].clientX; animationId = requestAnimationFrame(updateAnimation); container.classList.add('grabbing'); } } function touchMove(event) { if (isDragging) { const currentPosition = event.touches[0].clientX; currentTranslate = prevTranslate + currentPosition - startPosition; } } function touchEnd() { isDragging = false; cancelAnimationFrame(animationId); prevTranslate = currentTranslate; container.classList.remove('grabbing'); } function updateAnimation() { list.style.transform = `translateX(${currentTranslate}px)`; animationId = requestAnimationFrame(updateAnimation); } ``` 通过以上代码,我们就成功地实现移动端touch事件的横向滑动列表效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值