javascript - 做了个滑动插件,在chrome上模拟手机,感觉还不错,但是放到手机上明显有问题,只要滑动一点点,就移动好多~心塞!
大家讲道理
大家讲道理 2017-04-10 17:55:57
[JavaScript讨论组]

html代码如下:




Document


1

2

3

4


js代码如下:

function touchSlide(objectClassName,aImgClassName,zoom){

var op=document.getElementsByClassName(objectClassName)[0]; 
var endX;//滑动结束时的X轴坐标
var startX;//滑动开始时deX轴坐标
var scroll;//滑动滚出去的距离
var index=0;//当前显示的第几个p;从0开始计算;
var aImg=document.getElementsByClassName(aImgClassName);
var imgLength=aImg.length;
var aImgWidth=aImg[0].offsetWidth*(imgLength-1);
var imgWidth=aImg[0].offsetWidth;

op.addEventListener("touchstart",function(e){
    var touch=e.touches[0];
    startX=touch.pageX;
});

op.addEventListener("touchmove",function(e){
    var touch=e.touches[0];
    var moveLeft=op.offsetLeft;//滑动时的当前Left的距离;
        endX=touch.pageX;
        scroll=endX-startX;
        //console.log(scroll);
        op.style.left=moveLeft+scroll+'px';
});

op.addEventListener("touchend",function(e){
    var endLeft=op.offsetLeft;
    if(endLeft>0){
        op.style.left=0+'px';
    }else if(endLeft<-aImgWidth){
        op.style.left=-aImgWidth+'px';
    }else{
        var scrollPercent=Math.abs(scroll)/imgWidth;

        if(scrollPercent>zoom){
            if(scroll<0){//往左滑动
                index++;
                index=index>(imgLength-1)? index-1: index;
                op.style.left=-imgWidth*index+'px';    
            }else if(scroll>0){//往右滑动
                index--;
                index=index<0? 0: index;
                op.style.left=-imgWidth*index+'px';
            }
        }else{
            op.style.left=-imgWidth*index+'px';
        }
    }
});

}

touchSlide('pSwrap','img',0.2);

请各位提个好点的建议!如果可以顺便提个好点的思路。我觉得哈,这里最关键的就是如何判断当前滑动的是第几张,要往哪滑,以实现序号的增减,我的思路方法已经有了,但是感觉代码写的不完美,特别是在手机上运行的时候感觉不大好~

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(4)
伊谢尔伦

移动浏览器上要加上下面的meta标签,才能让像素对齐
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
将touchmove和touchend的监听放到touchstart时候才绑定
在touchend时将touchmove和touchend解绑

你的逻辑有问题,在touchmove的时候,不是减去刚触摸的坐标
应该在触摸移动一次就要更新开始的坐标

伊谢尔伦

function touchSlide(objectClassName,aImgClassName,zoom){

var op=document.getElementsByClassName(objectClassName)[0]; 
var endX;//滑动结束时的X轴坐标
var startX;//滑动开始时deX轴坐标
var scroll;//滑动滚出去的距离
var index=0;//当前显示的第几个p;从0开始计算;
var aImg=document.getElementsByClassName(aImgClassName);
var imgLength=aImg.length;
var aImgWidth=aImg[0].offsetWidth*(imgLength-1);
var imgWidth=aImg[0].offsetWidth;

op.addEventListener("touchstart",function(e){
    var touch=e.touches[0];
    startX=touch.pageX;
    op.addEventListener("touchmove",function(e){
    var touch=e.touches[0];
    var moveLeft=op.offsetLeft;//滑动时的当前Left的距离;
        endX=touch.pageX;
        scroll=endX-startX;
        //console.log(scroll);
        op.style.left=moveLeft+scroll+'px';
});

op.addEventListener("touchend",function(e){
    var endLeft=op.offsetLeft;
    if(endLeft>0){
        op.style.left=0+'px';
    }else if(endLeft<-aImgWidth){
        op.style.left=-aImgWidth+'px';
    }else{
        var scrollPercent=Math.abs(scroll)/imgWidth;

        if(scrollPercent>zoom){
            if(scroll<0){//往左滑动
                index++;
                index=index>(imgLength-1)? index-1: index;
                op.style.left=-imgWidth*index+'px';    
            }else if(scroll>0){//往右滑动
                index--;
                index=index<0? 0: index;
                op.style.left=-imgWidth*index+'px';
            }
        }else{
            op.style.left=-imgWidth*index+'px';
        }
    }

    op.removeEventListner('touchmove');
    op.removeEventListner('touchend');

});
});


}

touchSlide('pSwrap','img',0.2);

这样了,感觉还是不行 meta也加了

PHPz

html和body宽度建议用js获取。。。加上meta viewport后手机上宽度一般没有500px那么宽

还有建议用translate3d 硬件加速性能好些。

黄舟

可以使用开源的iSlider,效果很好~

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号