首页 > 代码库 > jquery 拖拽变换位置

jquery 拖拽变换位置

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试</title>
<style>
.item_content ul { list-style: none; }
.item_content ul li { width: 200px; height: 160px; float: left; margin: 10px }
.item_content { width: 740px; height: auto; border: 1px solid #ccc; float: left; }
.item_content .item { width: 200px; height: 120px; line-height: 120px; text-align: center; cursor: pointer; background: #ccc; }
.item_content .item img { width: 200px; height: 120px; border-radius: 6px; }
.close { display: block; width: 20px; height: 20px; top: 0; right: 0; z-index: 9999; position: absolute; text-align: center; font-size: 16px; cursor: pointer; color: aliceblue }
</style>
</head>
<body>
<div class="item_container">
  <div class="item_content" id="imageChange">
    <ul>
      <li>
        <div class="item"> <img src="http://www.jq22.com/img/cs/500x500-1.png" width="150" height="150">
        <span onclick="removePicture(this)" class="rmPicture close">×</span> </div>
      </li>
      <li>
        <div class="item"> <img src="http://www.jq22.com/img/cs/500x500-2.png" width="150" height="150">
        <span onclick="removePicture(this)" class="rmPicture close">×</span> </div>
      </li>
      <li>
        <div class="item"> <img src="http://www.jq22.com/img/cs/500x500-3.png" width="150" height="150">
        <span onclick="removePicture(this)" class="rmPicture close">×</span> </div>
      </li>
      <li>
        <div class="item"> <img src="http://www.jq22.com/img/cs/500x500-4.png" width="150" height="150">
        <span onclick="removePicture(this)" class="rmPicture close">×</span> </div>
      </li>
      <li>
        <div class="item"> <img src="http://www.jq22.com/img/cs/500x500-5.png" width="150" height="150">
        <span onclick="removePicture(this)" class="rmPicture close">×</span> </div>
      </li>
      <li>
        <div class="item"> <img src="http://www.jq22.com/img/cs/500x500-6.png" width="150" height="150">
        <span onclick="removePicture(this)" class="rmPicture close">×</span> </div>
      </li>
      <li>
        <div class="item"> <img src="http://www.jq22.com/img/cs/500x500-7.png" width="150" height="150">
        <span onclick="removePicture(this)" class="rmPicture close">×</span> </div>
      </li>
      <li>
        <div class="item"> <img src="http://www.jq22.com/img/cs/500x500-8.png" width="150" height="150">
        <span onclick="removePicture(this)" class="rmPicture close">×</span> </div>
      </li>
      <li>
        <div class="item"> <img src="http://www.jq22.com/img/cs/500x500-9.png" width="150" height="150">
        <span onclick="removePicture(this)" class="rmPicture close">×</span> </div>
      </li>
    </ul>
  </div>
</div>
</body>
</html>
<script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script>
<script>
/*
    作者: 谢泽龙
    联系QQ: 454675335 (灬丿Spam丶)
    时间: 2014-9-24
    www.jq22.com
*/

    $(function() {
        function Pointer(x, y) {
            this.x = x ;
            this.y = y ;
        }
        function Position(left, top) {
            this.left = left ;
            this.top = top ;
        }
        $(".item_container .item").each(function(i) {
            //$(".item_content .item").each(function(i) {   
            this.init = function() { // 初始化
                this.box = $(this).parent() ;
                $(this).attr("index", i).css({
                    position : "absolute",
                    left : this.box.offset().left,
                    top : this.box.offset().top
                }).appendTo(".item_container") ;
                this.drag() ;
            },
            this.move = function(callback) {  // 移动
                $(this).stop(true).animate({
                    left : this.box.offset().left,
                    top : this.box.offset().top
                }, 500, function() {
                    if(callback) {
                        callback.call(this) ;
                    }
                }) ;
            },
            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" ;
                        } else if(currentItem.box.offset().top > this.box.offset().top) {
                            direction = "up" ;
                        } else {
                            direction = "normal" ;
                        }
                                   console.log(direction+"---");
                        this.swap(currentItem, direction) ;
                    }
                }) ;
            },
            this.swap = function(currentItem, direction) { // 交换位置
                if(this.moveing) return false ;
                var directions = {
                    normal : function() {
                        var saveBox = this.box ;
                        this.box = currentItem.box ;
                        currentItem.box = saveBox ;
                        this.move() ;
                        $(this).attr("index", this.box.index()) ;
                        $(currentItem).attr("index", currentItem.box.index()) ;
                    },
                    down : function() {
                        // 移到上方
                        var box = this.box ;
                        var node = this ;
                        var startIndex = currentItem.box.index() ;
                        var endIndex = node.box.index(); ;
                        for(var i = endIndex; i > startIndex ; i--) {
                            var prevNode = $(".item_container .item[index="+ (i - 1) +"]")[0] ;
                            node.box = prevNode.box ;
                            $(node).attr("index", node.box.index()) ;
                            node.move() ;
                            node = prevNode ;
                        }
                        currentItem.box = box ;
                        $(currentItem).attr("index", box.index()) ;
                    },
                    up : function() {
                        // 移到上方
                        var box = this.box ;
                        var node = this ;
                        var startIndex = node.box.index() ;
                        var endIndex = currentItem.box.index(); ;
                        for(var i = startIndex; i < endIndex; i++) {
                            var nextNode = $(".item_container .item[index="+ (i + 1) +"]")[0] ;
                            node.box = nextNode.box ;
                            $(node).attr("index", node.box.index()) ;
                            node.move() ;
                            node = nextNode ;
                        }
                        currentItem.box = box ;
                        $(currentItem).attr("index", 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>

jquery 拖拽变换位置