Jquery 多行拖拽图片排序 jq优化

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jQuery图片拖动排序代码</title>

<style type="text/css">

.item_container{position:relative;height:auto;overflow:hidden;}
.item_content ul{list-style:none;padding:0;margin:0;}
.item_content ul li{width:200px;height:160px;float:left;margin:10px }
.item_content{width:50%;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="img/500x500-1.png" width="150" height="150"> 
                 </div>
            </li>
            <li>
                <div class="item"> <img src="img/500x500-2.png" width="150" height="150"> 
                 </div>
            </li>
            <li>
                <div class="item"> <img src="img/500x500-3.png" width="150" height="150"> 
                 </div>
            </li>
            <li>
                <div class="item"> <img src="img/500x500-4.png" width="150" height="150"> 
                 </div>
            </li>
            <li>
                <div class="item"> <img src="img/500x500-5.png" width="150" height="150"> 
                 </div>
            </li>
            <li>
                <div class="item"> <img src="img/500x500-6.png" width="150" height="150"> 
                 </div>
            </li>
            <li>
                <div class="item"> <img src="img/500x500-7.png" width="150" height="150"> 
                 </div>
            </li>
        </ul>
    </div>
</div>
<script src="js/jquery-1.8.3.min.js"></script>
<script>
$(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) {  
        this.init = function () { // 初始化
            this.box = $(this).parent();
            $(this).attr("index", i).css({
                position: "absolute",
                left: this.box.position().left,
                top: this.box.position().top,
                cursor: "move"
            }).appendTo(".item_container");
            this.drag();
        },
            this.move = function (callback) {  // 移动
                $(this).stop(true).animate({
                    left: this.box.position().left,//相对父级的距离
                    top: this.box.position().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.position().top < this.box.position().top) {
                            direction = "down";
                        } else if (currentItem.box.position().top > this.box.position().top) {
                            direction = "up";
                        } else {
                            direction = "normal";
                        }
                        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>

</body>
</html>

猜你喜欢

转载自www.cnblogs.com/yi-miao/p/9269776.html