首页 > 其他分享 >移动端拖动

移动端拖动

时间:2023-07-26 17:01:04浏览次数:36  
标签:obj1 icur arr obj 拖动 let 移动 speed

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <title>拖拽</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        ul {
            list-style: none;
        }
        #drag ul {
            width: 612px;
        }
        #drag ul li {
            width: 100px;
            height: 100px;
            float: left;
            border: 1px solid transparent;
        }
        #drag ul li img {
            width: 100px;
            height: 100px;
        }
        
        @media only screen and (max-width: 750px) {
            #drag ul {
                width: 100%;
            }
            #drag ul li {
                width: 100px;
                height: 100px;
                float: left;
                border: 1px solid transparent;
            }
            #drag ul li img {
                width: 100px;
                height: 100px;
            }
        }
    </style>
</head>
<body>
    <div id="drag">
        <ul>
            <li>
                <img src="img/1.png" alt="1.jpg">
            </li>
            <li>
                 <img src="img/Request-1.png" alt="2.jpg">
            </li>
            <li>
                 <img src="img/logo.png" alt="4.jpg">
            </li>
            <li>
                 <img src="img/sold.jpg" alt="5.jpg">
            </li>
            <li>
                <img src="img/1.png" alt="1.jpg">
            </li>
            <li>
                 <img src="img/Request-1.png" alt="2.jpg">
            </li>
            <li>
                 <img src="img/logo.png" alt="4.jpg">
            </li>
            <li>
                 <img src="img/sold.jpg" alt="5.jpg">
            </li>
            <li>
                <img src="img/1.png" alt="1.jpg">
            </li>
            <li>
                 <img src="img/Request-1.png" alt="2.jpg">
            </li>
            <li>
                 <img src="img/logo.png" alt="4.jpg">
            </li>
            <li>
                 <img src="img/sold.jpg" alt="5.jpg">
            </li>
            <li>
                <img src="img/1.png" alt="1.jpg">
            </li>
            <li>
                 <img src="img/Request-1.png" alt="2.jpg">
            </li>
            <li>
                 <img src="img/logo.png" alt="4.jpg">
            </li>
            <li>
                 <img src="img/sold.jpg" alt="5.jpg">
            </li>
            <li>
                 <img src="img/sold.jpg" alt="5.jpg">
            </li>
            <li>
                 <img src="img/logo.png" alt="4.jpg">
            </li>
        </ul>
    </div>
    <script type="text/javascript">
    if (
      navigator.userAgent.match(/Mobi/i) ||
      navigator.userAgent.match(/Android/i) ||
      navigator.userAgent.match(/iPhone/i)
    ){
        let liItems = $("li")  // 获取到每个li
        let zIndex = 1   //定义li的层级
        /**
         * 循环每个li获取他们的位置
         * offsetLeft
         * offsetTop
        */
        let distanceL = []  //  定义距离对象数组
        for(let i = 0; i<liItems.length; i++) {
            distanceL.push(
                {
                    left: parseInt(liItems.eq(i).offset().left),
                    top: parseInt(liItems.eq(i).offset().top),
                }
            )
        }
        //  把刚循环出来的位置值转换到图片的样式
        for(let i = 0; i<liItems.length; i++) {
            liItems.eq(i).css('position',"absolute");
            liItems.eq(i).css('left',distanceL[i].left + 'px');
            liItems.eq(i).css('top',distanceL[i].top + 'px');
            liItems.eq(i).css('margin',0);
            liItems.eq(i).data('index',i);
        }
        
        // 拖拽功能
        for (let i = 0; i < liItems.length; i++) {
            drag(liItems.eq(i))
        }
        /**
         * 拖拽函数
        */
        function drag(obj) {
            // 给该对象绑定鼠标按下事件
            obj.on("touchstart",function(e) {
                // 获取当前鼠标点击的位置
                let x = e.originalEvent.targetTouches[0].pageX;
                let y = e.originalEvent.targetTouches[0].pageY;
                // 获取当前图片的位置
                let left = obj.offset().left;
                let top = obj.offset().top;
                // 设置li的层级不断往上加
                obj.css('zIndex',zIndex++);
                // 移动过程中
                obj.on("touchmove",function(e) {
                    // 获取移动中的位置,减去点击时候的位置,再加上图片原来的位置
                    let moveLeft = e.originalEvent.changedTouches[0].pageX - x + left
                    let moveTop = e.originalEvent.changedTouches[0].pageY - y + top
                    obj.css('left',moveLeft + "px");
                    obj.css('top',moveTop + "px");
                    // 移动的时候先把边框去掉
                    for(let i = 0; i< liItems.length; i++) {
                        liItems.eq(i).css('border',"1px solid transparent");
                    }
                    // 检测碰撞
                    let hit = nearLi(obj)
                    if(hit) {
                        hit.css('border',"1px dashed red"); 
                    }
                })
                //  当鼠标抬起的时候,需要把鼠标松开事件改为null
                obj.on("touchend",function(e) {
                    obj.off('touchmove touchend');
                    // 抬起来的时候再次获取碰撞的数据
                    let oLi = nearLi(obj);
                    if(oLi){
                    oLi.off('touchmove touchend');
                        //  交换位置
                        animate(obj, {left: distanceL[oLi.data('index')].left, top: distanceL[oLi.data('index')].top},10, 0.08);
                        animate(oLi, {left: distanceL[obj.data('index')].left, top: distanceL[obj.data('index')].top},10, 0.08);
                        //  清除交换的边框
                        oLi.css('border',"1px solid transparent");
                        // 交换索引
                        let temp = obj.data('index');
                        obj.data('index',oLi.data('index')) ;
                        oLi.data('index',temp);
                    }else{
                        animate(obj, {left: distanceL[obj.data('index')].left, top: distanceL[obj.data('index')].top},10, 0.08);
                    }
        
                })
                //返回false是为了屏蔽h5中图片标签<img>默认的拖拽事件
                return false;
            })
        }
        //  计算最小距离
        function nearLi(obj) {
            let n = 10000000000;
            let hit = '';
            for (let i = 0; i < liItems.length; i++) {
                if (!obj.is(liItems.eq(i)) && impact(obj, liItems.eq(i))) {
                    // 计算碰撞的li距离
                    let c = distance(obj, liItems.eq(i));
                    if (c < n) {
                        n = c;
                        hit = liItems.eq(i);
                    }
                }
            }
            return hit;
        }
        //  碰撞检查
        function impact(obj1, obj2) {
            //对象1的各各边距 
            let left1 = obj1.offset().left; //左边距
            let top1 = obj1.offset().top; //上边距
            let right1 = left1 + obj1.outerWidth(); //对象右边距离屏幕左边的距离
            let bottom1 = top1 + obj1.outerHeight(); //对象下边距离屏幕顶端的距离
            //对象2的各各边距
            let left2 = obj2.offset().left;
            let top2 = obj2.offset().top;
            let right2 = left2 + obj2.outerWidth();
            let bottom2 = top2 + obj2.outerHeight();
            if (right1 <= left2 || bottom1 <= top2 || left1 >= right2 || top1 >= bottom2) {          
                return false;
            } else {          
                return true;
            }
        }
        //  勾股定理计算斜边
        function distance(obj1, obj2) {
            let a = obj1.offset().left - obj2.offset().left;
            let b = obj1.offset().top - obj2.offset().top;
            return Math.sqrt(a * a + b * b);
        }
        function animate(obj, json, interval, sp, fn) {
            clearInterval(obj.timer);
            function getStyle(obj, arr) {
                return obj.css(arr);
            }
            obj.timer = setInterval(function(){
                let flag = true;
                for(let arr in json) {
                    let icur = 0;
                    if(arr == "opacity") {
                        icur = Math.round(parseFloat(getStyle(obj, arr))*100);
                    } else {
                        icur = parseInt(getStyle(obj, arr));
                    }
                    let speed = (json[arr] - icur) * sp;
                    speed = speed > 0 ? Math.ceil(speed): Math.floor(speed);
                    if(icur != json[arr]){
                        flag = false;
                    }
                    $('#stext').val(icur +'!='+ json[arr]+'-'+arr+':'+flag+':'+obj.data('index'));
                    if(arr == "opacity"){
                        obj.css('filter',"alpha(opacity : '+(icur + speed)+' )");
                        obj.css('opacity',(icur + speed)/100);
                    }else {
                        obj.css(arr,icur + speed + "px");
                    }
                }
                if(flag){console.log('clear');
                    clearInterval(obj.timer);
                    if(fn){
                        fn();
                    }
                }
            },interval);
        }
    }else{
        let liItems = document.getElementsByTagName("li")  // 获取到每个li
        let zIndex = 1   //定义li的层级
        /**
         * 循环每个li获取他们的位置
         * offsetLeft
         * offsetTop
        */
        let distanceL = []  //  定义距离对象数组
        for(let i = 0; i<liItems.length; i++) {
            distanceL.push(
                {
                    left: liItems[i].offsetLeft,
                    top: liItems[i].offsetTop
                }
            )
        }
        
        //  把刚循环出来的位置值转换到图片的样式
        for(let i = 0; i<liItems.length; i++) {
            liItems[i].index = i;
            liItems[i].style.position = "absolute";
            liItems[i].style.left = distanceL[i].left + 'px';
            liItems[i].style.top = distanceL[i].top + 'px';
            liItems[i].style.margin = 0;
        }
        
        // 拖拽功能
        for (let i = 0; i < liItems.length; i++) {
            drag(liItems[i])
        }
        
        /**
         * 拖拽函数
        */
        function drag(obj) {
            // 给该对象绑定鼠标按下事件
            obj.onmousedown = function(ev) {
                ev = ev || window.event
                // 获取当前鼠标点击的位置
                let x = ev.clientX
                let y = ev.clientY
        
                // 获取当前图片的位置
                let left = this.offsetLeft
                let top = this.offsetTop
        
                // 设置li的层级不断往上加
                this.style.zIndex = zIndex++
        
                // 移动过程中
                document.onmousemove = function(ev) {
                    ev = ev || window.event
                    // 获取移动中的位置,减去点击时候的位置,再加上图片原来的位置
                    let moveLeft = ev.clientX - x + left
                    let moveTop = ev.clientY - y + top
                    obj.style.left = moveLeft + "px"
                    obj.style.top = moveTop + "px"
        
                    // 移动的时候先把边框去掉
                    for(let i = 0; i< liItems.length; i++) {
                        liItems[i].style.border = "1px solid transparent"
                    }
        
                    // 检测碰撞
                    let hit = nearLi(obj)
                    if(hit) {
                        hit.style.border = "1px dashed red"
                    }
                }
        
                //  当鼠标抬起的时候,需要把鼠标松开事件改为null
                document.onmouseup = function() {
                    document.onmousemove = null;
                    document.onmouseup = null;
                    // 抬起来的时候再次获取碰撞的数据
                    let oLi = nearLi(obj);
                    if(oLi){
                        //  交换位置
                        animate(obj, {left: distanceL[oLi.index].left, top: distanceL[oLi.index].top},10, 0.08);
                        animate(oLi, {left: distanceL[obj.index].left, top: distanceL[obj.index].top},10, 0.08);
                        //  清除交换的边框
                        oLi.style.border = "1px solid transparent";
                        // 交换索引
                        console.log(obj.index);
                        let temp = obj.index;
                        obj.index = oLi.index;
                        oLi.index = temp;
                        console.log(obj.index);
                    }else{
                        animate(obj, {left: distanceL[obj.index].left, top: distanceL[obj.index].top},10, 0.08);
                        // obj.style.left = arr[obj.index].left+"px";
                        // obj.style.top = arr[obj.index].top+"px";
                    }
                }
                //返回false是为了屏蔽h5中图片标签<img>默认的拖拽事件
                return false;
            }
        }
        
        //  计算最小距离
        function nearLi(obj) {
            let n = 10000000000;
            let hit = '';
            for (let i = 0; i < liItems.length; i++) {
                if (obj != liItems[i] && impact(obj, liItems[i])) {
                    // 计算碰撞的li距离
                    let c = distance(obj, liItems[i]);
                    if (c < n) {
                        n = c;
                        hit = liItems[i];
                    }
                }
            }
            return hit;
        }
        
        //  碰撞检查
        function impact(obj1, obj2) {
            //对象1的各各边距 
            let left1 = obj1.offsetLeft; //左边距
            let top1 = obj1.offsetTop; //上边距
            let right1 = left1 + obj1.offsetWidth; //对象右边距离屏幕左边的距离
            let bottom1 = top1 + obj1.offsetHeight; //对象下边距离屏幕顶端的距离
            //对象2的各各边距
            let left2 = obj2.offsetLeft;
            let top2 = obj2.offsetTop;
            let right2 = left2 + obj2.offsetWidth;
            let bottom2 = top2 + obj2.offsetHeight;
        
            if (right1 <= left2 || bottom1 <= top2 || left1 >= right2 || top1 >= bottom2) {
                //  console.log("不成功")  // 不成功           
                return false;
            } else {
                //  console.log("成功")  //成功           
                return true;
            }
        }
        
        //  勾股定理计算斜边
        function distance(obj1, obj2) {
            let a = obj1.offsetLeft - obj2.offsetLeft;
            let b = obj1.offsetTop - obj2.offsetTop;
            return Math.sqrt(a * a + b * b);
        }
        
        function animate(obj, json, interval, sp, fn) {
            clearInterval(obj.timer);
        
            function getStyle(obj, arr) {
                if(obj.currentStyle){
                    return obj.currentStyle[arr];    //针对ie
                } else {
                    return document.defaultView.getComputedStyle(obj, null)[arr]; 
                }
            }
            obj.timer = setInterval(function(){
                let flag = true;
                for(let arr in json) {
                    let icur = 0;
                    //k++;
                    if(arr == "opacity") {
                        icur = Math.round(parseFloat(getStyle(obj, arr))*100);
                    } else {
                        icur = parseInt(getStyle(obj, arr));
                    }
                    let speed = (json[arr] - icur) * sp;
                    speed = speed > 0 ? Math.ceil(speed): Math.floor(speed);
                    if(icur != json[arr]){
                        flag = false;
                    } 
                    if(arr == "opacity"){
                        obj.style.filter = "alpha(opacity : '+(icur + speed)+' )";
                        obj.style.opacity = (icur + speed)/100;
                    }else {
                        obj.style[arr] = icur + speed + "px";
                    }
                }
        
                if(flag){
                    clearInterval(obj.timer);
                    if(fn){
                        fn();
                    }
                }
            },interval);
        }
    }
    </script>
</body>
</html>

 

标签:obj1,icur,arr,obj,拖动,let,移动,speed
From: https://www.cnblogs.com/xmyfsj/p/17582950.html

相关文章

  • 移动端跨平台动效工具Lottie, PAG的使用
    动效工具Lottie Lottie是Airbnb开源的一套跨平台的完整的动画效果解决方案,设计师可以使用AdobeAfterEffects设计出漂亮的动画之后,使用Lottic提供的Bodymovin插件将设计好的动画导出成JSON格式,就可以直接运用在iOS、Android、Web和ReactNative之上,无需其他额......
  • 收集几个移动平台浏览器的User-Agent
    ListofallMobileBrowsersAndroidWebkitBrowserWebkitbasedbrowserfortheAndroidMobilePlatformClickonanystringtogetmoredetailsAndroidWebkitBrowserMozilla/5.0(Linux;U;Android4.0.3;ko-kr;LG-L160LBuild/IML74K)AppleWebkit/534.30......
  • 关于mv命令,系统是如何区分是移动还是重命名
    ​ 引入:精简回答版:重命名的本质仍是移动覆盖,所以不存在应该如何区分的问题 最近学习到linux基础命令中的mv命令,了解到mv命令的作用是对文件的移动和重命名,但自己一直想不明白系统是如何分辨该文件是移动or重命名,所以做了如下测试:mv命令格式:mv源文件目标文件根据猜想测试......
  • 头歌平台移动云启 —— HBase从入门到实战第1关:伪分布式环境搭建先按照上次实训
    头歌平台移动云启——HBase从入门到实战第1关:伪分布式环境搭建HBase是一个分布式的非关系型数据库,广泛应用于大数据领域。本文将介绍如何在头歌平台上搭建HBase的伪分布式环境,并提供相应代码示例。什么是伪分布式环境?伪分布式环境是指在单机上运行HBase的分布式模式,虽然只有......
  • 移动平均线Forexclub这样用,一眼识别买卖信号
    Forexclub建议使用H1时间框架和欧元/美元货币对。在该策略中,Forexclub使用了线性加权移动平均线作为主要指标,同时将其作为一个额外的过滤器。线性加权移动平均线(LWMA)的优势在于,它更重视最近的价格变动,而且长期时间框架几乎没有延迟。此外,Forexclub仅根据MA相对于价格变动的位置来......
  • NET(c#) 移动APP开发平台之Smobiler开发
    ​如果说基于.net的移动开发平台,目前比较流行的可能是xamarin了,不过除了这个,还有一个比xamarin更好用的国内的.net移动开发平台,smobiler,不用学习另外一套开发模式或者搭建复杂的开发环境,smobiler能够让大家像开发传统windows一样去开发移动手机应用,那么列举一下这个平台的特点。......
  • 移动端前端开发调试
    通过移动端使用Web服务的比率越来越大,例如淘宝2014年双十一,移动端交易份额就达到 42.6%。由此可见,掌握移动端的前端开发和测试是非常有必要的。本文只介绍与调试有关的内容,至于其他移动端开发知识(技巧、坑)太多太大,推荐 Mars 移动前端开发知识库。这个项目很久没有大动静了,欢......
  • 【腾讯 TMQ】移动 APP 测试用例设计的关注点
    应用的启动和停止1.1首次启动是否出现欢迎界面,欢迎界面的停留时间合理,欢迎界面后是否正常进入应用;首次启动时间是否合理;该拉取的信息是否正确;桌面图标是否创建成功,功能启动快捷键创建是否成功(某些安卓手机会有在桌面创建应用内某个功能的快捷键的需求)1.2二次启动启动时间是......
  • RTSP流媒体服务器LntonNVR(源码版)云服务平台下载录像后无法拖动时间轴的问题解决方案
    LntonNVR安防视频云服务平台是基于RTSP/Onvif协议的视频接入、处理及分发平台,可以分发出RTSP、RTMP、WS-FLV、HTTP-FLV、HLS、WebRTC等格式的视频流,可实现在全终端(PC、手机、平板、电子大屏/电视墙等)播放监控视频。有用户反馈,在使用LntonNVR下载录像时,下载后的录像时间无法拖动时间......
  • 拷贝构造函数 和 移动构造函数 深拷贝
    采用了深拷贝的方式,obj2 和 obj3 的 data 成员变量指向不同的内存空间,因此可以独立地释放资源而不会出现重复释放的问题.classMyClass{public:int*data;intsize;//默认构造函数MyClass():data(nullptr),size(0){}//拷贝构造函数(深拷......