鼠标拖动div(pc/移动)/touch事件/mouse事件

2.这周接了一个分享到QQ后者微信的分享页任务,里面有一个拖动div左右滑动的功能,由于第一次做,弄了五六个小时,终于出来了

1.HTML

<div id="videoShow" class="video_show">
    <div class="video_item">
        <a href="javascript:void(0)" class="align_center"><img alt="图片" src="${basePath}/images/luffy.jpg"></a>
        <span>One Piece Gold</span>
    </div>
</div>

2.css

父div样式

    display: flex;
    transition-duration: 0ms;
    transform: translateX(0px);

子div

    flex-shrink: 0;

transition-duration: 0ms; 规定完成过渡效果需要花费的时间
transform: translate3d(0px, 0px, 0px); 该(transform)属性允许我们对元素进行旋转,缩放,移动,倾斜
transform: translateX(0px); 该(transform)属性允许我们对元素进行左右移动

3.判断设备类型,网上有很多

主要是区分是移动设备还是pc设备,移动设备的事件
移动端:(touchstart,touchmove,touchend),
pc端:(mousedown,mousemove,mouseup,mouseleave)

3.贴上代码:

//获取设备宽度
var deviceWidth = document.body.scrollWidth;
//body的实际宽度(最外层div的宽度)
var videoShowWidth = deviceWidth;
//html并没有占满整个屏幕,最大宽度为750px
if(deviceWidth>750){
        videoShowWidth = 750;
}
var positionX = 0;
var positionY = 0;
//当前transform属性的值
var transgormX = 0;
var videoShow = document.getElementById("videoShow");   //videoShow是拖动div
var videoShowPositionX1 = $(videoShow).offset().left;       //该div的左上角横坐标
//确定右上角坐标
if(deviceWidth>750){
    videoShowPositionX2 = (deviceWidth + 750)/2;
}else{
    videoShowPositionX2 = videoShowPositionX1 + $(videoShow).width();      
}
$(videoShow).attr("style","transition-duration: 0ms;transform: translateX(0px);");    //添加移动div需要的css
// 电脑与pc事件不同
//对div进行处理width:num,根据实际宽度确定div的宽度
$(videoShow).css("width",videoShowWidth);
$(".video_item").css("width",videoShowWidth/3);
if(IsPC()){
//电脑移动事件
    //鼠标按下事件
    $(videoShow).bind('mousedown',function(e){
        // 鼠标按下捕获此时位置
        positionX = e.pageX;
        posiitonY = e.pageY;
        var transformStr = $(this).attr("style");
        transformStr = transformStr.substring(transformStr.lastIndexOf("translateX(")+11);
        transformX = parseInt(transformStr.substring(0,transformStr.lastIndexOf("p")));
        //确定本次拖动的div宽度值
        var widthStr = videoShow.style.width;
        thisWidth = parseInt(widthStr.substring(0,widthStr.lastIndexOf("p")));
        //鼠标按下,绑定鼠标移动事件
        $(this).bind('mousemove',function(e){
            e.preventDefault();
            // transformX+e.pageX-positionX表示当前移动的距离
            $(this).css("transition-duration","0ms");
            $(this).css("transform","translateX("+(transformX+e.pageX-positionX)+"px)");
            $(videoShow).css("width",thisWidth+positionX-e.pageX);
        });
    });
    //mouseup,鼠标松开事件(移动出元素位置,此事件捕获不到),mouseleave,移动出钙元素时的事件
    //(注:若鼠标在元素之外仍需要拖动效果,那么可以为document对象添加mouse事件)
    $(videoShow).bind('mouseup mouseleave',function(e){
        $(this).unbind('mousemove');
        //该div的子标签
        var videoItems = $(".video_item");
        //第一个标签若大于父div左上角横坐标时
        var videoItem1 = videoItems[0];
        if($(videoItem1).offset().left>videoShowPositionX1){
            videoShow.style.transform = 'translateX(0px)';
            $(videoShow).css("width",videoShowWidth);
        }
        // 最后一个标签的位置,父元素右上角坐标值
        var videoItem2 = videoItems[videoItems.length-1];
        var videoItemPositionX = $(videoItem2).offset().left+$(videoItem2).width();
        if(videoItemPositionX<videoShowPositionX2){
            //此时展示最后三个元素,宽度为最大宽度
            videoShow.style.transform = 'translateX('+(0-(videoShowWidth/3)*(videoItems.length-3))+'px)';
            $(videoShow).css("width",videoShowWidth/3*videoItems.length);
        }
    });
}else{
    //客户端拖动事件
    //获取
    videoShow.addEventListener('touchstart',function(event){
        event.preventDefault();
        if(event.targetTouches.length == 1){
            var touch = event.targetTouches[0];
            positionX = touch.pageX;
            //确定本次拖动transform的初始值
            var transformStr = videoShow.style.transform;
            transformStr = transformStr.substring(11);
            var index = transformStr.lastIndexOf("p");
            transformStr = transformStr.substring(0, index);
            transformX = parseInt(transformStr);
            //确定本次拖动的div宽度值
            var widthStr = videoShow.style.width;
            thisWidth = parseInt(widthStr.substring(0,widthStr.lastIndexOf("p")));
        }
    }, false);
    videoShow.addEventListener('touchmove', function(event) {
        //阻止其他事件
        event.preventDefault();
        //获取当前坐标
        if(event.targetTouches.length == 1){
            var touch = event.targetTouches[0];
            videoShow.style.transform = 'translateX('+(transformX+touch.pageX-positionX)+'px)';
            $(videoShow).css("width",thisWidth+positionX-touch.pageX);
        }
    }, false);
    videoShow.addEventListener('touchend', function(event) {
        //判断div是否越界
        // 第一个标签位置不能大于指定值(父元素的左上角横坐标值),
        var videoItems = $(".video_item");
        var videoItem1 = videoItems[0];
        if($(videoItem1).offset().left>videoShowPositionX1){
            videoShow.style.transform = 'translateX('+(videoShowPositionX1)+'px)';
            //此时恢复初始状态
            $(videoShow).css("width",videoShowWidth);
        }
        // 最后一个标签的位置,父元素右上角坐标值
        var videoItem2 = videoItems[videoItems.length-1];
        var videoItemPositionX = $(videoItem2).offset().left+$(videoItem2).width();
        if(videoItemPositionX<videoShowPositionX2){
            //此时展示最后三个元素,宽度为最大宽度
            videoShow.style.transform = 'translateX('+(0-(videoShowWidth/3)*(videoItems.length-3))+'px)';
            $(videoShow).css("width",videoShowWidth/3*videoItems.length);
        }
    }, false);
}

最后在魅族,ipone,ipad,pc端测试成功
注,pc端由于该div子元素包含img和a标签mousemove事件,会被抑制。在IE和FF之外的浏览器中 e.preventDefault(); 会抑制其他事件不起作用,所以可以达到拖动效果。
但是在IE和FF浏览器中此段代码无效,所以在这两个浏览器中没有鼠标拖动效果,这两个浏览器需要其他的方式抑制其他事件,时间原因没有尝试)

于2017年1月13日对博客做了补充修改

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值