zoukankan      html  css  js  c++  java
  • 拖拽排序 原理+代码

    1.该写法是面向对象

    1.定义鼠标位置;

    2.遍历需要换位的元素,

        01.添加初始化方法,从父元素中取出,设置positionabsolute

        Left top值为父元素的值

       02.添加move方法-->鼠表松开时回到原位->传入回调函数

       02.添加拖拽方法-->鼠标松开时调用move方法,回归原位置

       03.添加碰撞检测方法,根据不同情况direction 返回不同方向值;

       04.交换位置的方法:传入当前拖拽元素 和 方向值作为参数-->this的指向

    <!doctype html>
    <html lang="en">
     <head>
      <meta charset="UTF-8">
      <meta name="Generator" content="EditPlus®">
      <meta name="Author" content="">
      <meta name="Keywords" content="">
      <meta name="Description" content="">
      <script src="jquery.min.js"></script>
      <title>拖拽换位</title>
      <style>
        .item_content ul  {
            list-style:none;
        }
        .item_content ul li {
            200px;
            height:120px;
            float:left;
            margin:10px
            
        }
        .item_content {
            740px;
            height:460px;
            border:1px solid #ccc;
            float:left;
        }
        
        .item_content .item {
            200px;
            height:120px;
            line-height:120px;
            text-align:center;
            cursor:pointer;
            background:#ccc;
            
        }
        .item_content .item img {
            200px;
            height:120px;
            border-radius:6px;
            
        }
        
      </style>
     </head>
     <body>
       <div class="item_container">
         <div class="item_content">
           <ul>
            <li class="n1">
             <div class="item">
              <img src="images/youku.png" />
             </div>
            </li>
    
            <li>
             <div class="item">
              <img src="images/jd.png" />
             </div>
            </li>
    
            <li>
             <div class="item">
              <img src="images/taobao.png" />
             </div>
            </li>
    
            <li>
             <div class="item">
              <img src="images/fenghuan.png" />
             </div>
            </li>
    
    
            <li>
             <div class="item">
              <img src="images/souhu.png" />
             </div>
            </li>
    
    
            <li>
             <div class="item">
              <img src="images/wangyi.png" />
             </div>
            </li>
    
    
            <li>
             <div class="item">
              <img src="images/renren.png" />
             </div>
            </li>
    
            <li>
             <div class="item">
              <img src="images/360.png" />
             </div>
            </li>
    
            <li>
             <div class="item">
              <img src="images/360game.png" />
             </div>
            </li>
           </ul>
         </div>
       </div>
     <script>
      $(function(){
            function Pointer(x,y){//定义鼠标位置;
            this.x = x;
            this.y = y;
                //console.log(this);//-->Pointer
            }
            function Position(left,top){//定义拖拽位置;
            this.left = left;
            this.top = top;
               // console.log(this);//-->Position
            }
            $('.item_content .item').each(function(i){
                this.init = function(){
                    this.box = $(this).parent();
                    $(this).attr('index',i).css({
                        position:'absolute',
                        top:this.box.offset().top,
                        left:this.box.offset().left
                    }).appendTo('.item_content')
                        this.drag()
                }
                this.move = function(callback){
                    $(this).animate({
                        left:this.box.offset().left,
                        top:this.box.offset().top
                    },500,function(){
                        if(callback){
                            callback.call(this)//如果存在回调函数,则调用move方法
                        }
                    })
                }
                this.collisionCheck = function(){
                    var currentItem = this;
    
                    var direction = null;//用来存方向值
                    $(this).siblings('.item').each(function(){
                        if(currentItem.pointer.x>this.box.offset().left&&
                            currentItem.pointer.y>this.box.offset().top&&
                                (currentItem.pointer.x<this.box.offset().left+this.box.width() )&&
                                (currentItem.pointer.y<this.box.offset().top+this.box.height())
                        ){
                            if(currentItem.box.offset().top<this.box.offset().top){
                                direction  = 'down';
                                console.log(direction)
                            }else if(currentItem.box.offset().top>this.box.offset().top){
                                direction = 'up';
                                console.log(direction)
                            }else{
                                direction = 'normal';
                                console.log(direction)
                            }
                            this.swap(currentItem,direction);
                        }
                    })
                }
                this.swap = function(currentItem,direction){//传入拖拽div和方向值 做变换
    
                    var directions = {
                        normal :function(){
                            var saveBox = this.box;//接收框 =  当前框-->this-->碰撞到的兄弟div
    
                            this.box = currentItem.box;//定义中间变量,交换div
                            currentItem.box = saveBox;
                            this.move();
    
                            $(this).attr('index',this.box.index());
                            $(currentItem).attr('index',currentItem.box.index())
                        }
                    }
                   directions[direction].call(this);//调用当前对象对应的方法
                }
                this.drag  = function(){
                    var oldPosition = new Position();
                    var oldPointer  = new Pointer();
                    var isDrag = false;
                    var currentItem = null;
                    $(this).mousedown(function(e){
                        e.preventDefault();
                        oldPosition.left = $(this).position().left;
                        oldPosition.top = $(this).position().top;
                        oldPointer.x = e.clientX;
                        oldPointer.y = e.clientY;
                        isDrag = true;
                        currentItem = this;
                    })
                    $(document).mousemove(function(e){
                        var currentPointer = new Pointer(e.clientX, e.clientY);
                        if(!isDrag) return false;
                        $(currentItem).css({
                            'opacity':'0.8',
                            'z-index':'999'
                        })
                        var left = currentPointer.x - oldPointer.x + oldPosition.left;
                        var top  = currentPointer.y - oldPointer.y + oldPosition.top;
                        $(currentItem).css({
                            left:left,
                             top:top
                        })
                        currentItem.pointer = currentPointer ;//定义鼠标位置
                        //碰撞检测
                        currentItem.collisionCheck();//调用碰撞检测方法
    
                    })
                    $(document).mouseup(function(){
                        if(!isDrag) return false;
                        isDrag = false;
                        currentItem.move(function(){//这是传入的回调函数
                            $(this).css({
                                'opacity':'1',
                                'z-index':0
                            })
                        })
                    })
                }
                this.init();
    
    
            })
    
    
      })
     </script>
     </body>
    </html>

     

  • 相关阅读:
    软件版本 —— Alpha、Beta、RC版本的区别
    linux删除回收站提示权限错误
    Centos7系统备份和还原脚本
    搭建Docker私服
    在深度Deepin 15.11系统上安装Python 3.7.4版本的方法
    Dockerfile范例
    Remmina无法远程连接的解决方法
    再生龙教程——对于Centos7进行备份和还原
    共享Excel编辑的一些资源
    【转载】怎样编写概要设计
  • 原文地址:https://www.cnblogs.com/vali/p/5661718.html
Copyright © 2011-2022 走看看