jquery 拖拽,框选的一点积累

拖拽draggable,框选 selectable,按ctrl多选,临近辅助对齐,从工具栏拖工具  等,和jqueryui的selectable不同,是在一个父div里框选子div(类似框选文件),一些功能不是很细致,仅供参考。

<html>
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="jquery-2.1.1.js"></script>
    <style>
        #toolbox {
            height: 120px;
            display: block;
        }

        #room {
            height: 500px;
        }

        .table {
            background-color: cornflowerblue;
            position: absolute;
            cursor: move;
            -moz-user-select: none;
            -ms-user-select: none;
            -webkit-user-select: none;
            user-select: none;
        }

        .vertical {
            width: 100px;
            height: 50px;
        }

        .horizontal {
            width: 50px;
            height: 100px;
        }

        #toolbox, #room {
            position: relative;
            border: 1px solid black;
            -moz-user-select: none;
            -ms-user-select: none;
            -webkit-user-select: none;
            user-select: none;
        }

        .selectrect {
            border: 1px solid black;
            position: relative;
        }

        #room .table.selected {
            border: 1px solid #4e4e4e;
        }
    </style>
</head>
<body>
    <div>
        <a id="btntopalign">上边对齐</a>
        <a id="btnleftalign">左边对齐</a>
        <a id="btnbottomalign">下边对齐</a>
        <a id="btnrightalign">右边对齐</a>
    </div>
    <div style="margin:20px;">
        <div id="toolbox">

            <div class="table horizontal" style="top:10px;left:10px;">

            </div>

            <div class="table vertical" style="top:10px;left:220px;">

            </div>

        </div>
        <div id="room">


        </div>
    </div>
    <script>
        $(function () {
            var selectedTool = {};
            $("#toolbox .table").mousedown(function (e) {//工具栏选择图形
                var $toolbox = $("#toolbox");
                var $prototool = $(this);
                var $newtable = $prototool.clone();
                $newtable.css({
                    "top": "+=" + $toolbox.position().top,
                    "left": "+=" + $toolbox.position().left
                })
                selectedTool.$tool = $newtable;
                $("body").append($newtable);
                selectedTool.pageX = $newtable.position().left;
                selectedTool.pageY = $newtable.position().top;
                selectedTool.originPageX = e.pageX;//记录初始点,便于做靠近对齐
                selectedTool.originPageY = e.pageY;
            });

            $(document).mousemove(function (e) {//从工具栏拖出
                if (selectedTool.$tool) {
                    var deltaX = e.pageX - selectedTool.originPageX;
                    var deltaY = e.pageY - selectedTool.originPageY;
                    selectedTool.$tool.css({
                        "top": selectedTool.pageY + deltaY,
                        "left": selectedTool.pageX + deltaX
                    });

                    //todo 从工具栏拖的判断自动小范围对齐
                }
            })

            $(document).mouseup(function (e) {
                if (selectedTool.$tool) {
                    var $tool = selectedTool.$tool;
                    //todo 判断释放位置,做安全处理
                    var $room = $("#room");
                    $tool.detach();
                    $tool.appendTo($room);
                    $tool.css({
                        "top": "-=" + $room.position().top,
                        "left": "-=" + $room.position().left
                    });
                    setTimeout(function () {
                        $tool.Drag({ container: "#room", selector: ".table" });
                    })

                    selectedTool = {};
                }
            })

            $("#room").Selectable({ selector: ".table" });

            $("#btntopalign").click(function () {//对 选中的div 上边对齐
                var selecteds = $("#room").find(".selected");
                var maxtop = 100000;
                selecteds.each(function (index,item) {
                    var crttop = $(item).position().top;
                    maxtop = Math.min(maxtop, crttop);
                })
                selecteds.each(function (index, item) {
                    $(item).css("top", maxtop);
                })
            })

            $("#btnleftalign").click(function () {
                var selecteds = $("#room").find(".selected");
                var maxleft = 100000;
                selecteds.each(function (index, item) {
                    var crtleft = $(item).position().left;
                    maxleft = Math.min(maxleft, crtleft);
                })
                selecteds.each(function (index, item) {
                    $(item).css("left", maxleft);
                })
            })

            $("#btnrightalign").click(function () {
                var selecteds = $("#room").find(".selected");
                var maxleft = 0;
                selecteds.each(function (index, item) {
                    var crtleft = $(item).position().left + $(item).width();
                    maxleft = Math.max(maxleft, crtleft);
                })
                selecteds.each(function (index, item) {
                    $(item).css("left", maxleft - $(item).width());
                })
            })

            $("#btnbottomalign").click(function () {
                var selecteds = $("#room").find(".selected");
                var maxtop = 0;
                selecteds.each(function (index, item) {
                    var crttop = $(item).position().top + $(item).height();
                    maxtop = Math.max(maxtop, crttop);
                })
                selecteds.each(function (index, item) {
                    $(item).css("top", maxtop - $(item).height());
                })
            })

        })
    </script>

    <script>
        (function () {
            var defaults = {
                body: '#dragId',
                handle: '',
                selector: ".table",
                container: ""
            };

            var Constructor = function (item, options) {
                var opts = this.opts = $.extend({}, defaults, options);
                var a = opts.handle;
                var b = opts.body;
                if (a) {
                    if (b) {
                        opts.$body = $(b);
                    }
                    else {
                        opts.$body = $(item);
                    }
                    opts.$handle = $(a);
                }
                else {
                    opts.$body = $(item);
                    opts.$handle = $(item);
                }

                this.$body = opts.$body;
                this.$handle = opts.$handle;
                this.$container = $(this.opts.container);
                this.init();
            }

            Constructor.prototype = {
                init: function () {
                    this.dragments = {
                        draggable: false,
                        elementX: 0,
                        elementY: 0,
                        originX: 0,
                        originY: 0
                    };

                    this.$handle.mousedown($.proxy(this.mousedown, this));
                    $(document).mouseup($.proxy(this.mouseup, this));
                    $(document).mousemove($.proxy(this.mousemove, this));
                    this.$handle.css("cursor", "move");
                },
                mousedown: function (e) {
                    this.dragments.draggable = true;
                    this.dragments.originX = e.pageX;
                    this.dragments.originY = e.pageY;
                    this.dragments.elementX = this.$body.position().left;
                    this.dragments.elementY = this.$body.position().top;
                },
                mouseup: function () {
                    this.dragments.draggable = false;
                },
                mousemove: function (e) {
                    var self = this;
                    if (this.dragments.draggable) {
                        var deltaX = e.pageX - this.dragments.originX;
                        var deltaY = e.pageY - this.dragments.originY;

                        //region 简单辅助对齐
                        var nowY = this.dragments.elementY + deltaY;
                        var nowX = this.dragments.elementX + deltaX;
                        var tables = self.$container.find(self.opts.selector);

                        var finalX = nowX;
                        var finalY = nowY;
                        tables.each(function (index, item) {
                            if (item == self.$body[0]) {
                                return true;
                            }
                            var position = $(item).position();
                            if (Math.abs(position.top - nowY) < 5) {
                                finalY = position.top;
                            }
                            if (Math.abs(position.top + $(item).height() - nowY) < 5) {
                                finalY = position.top + $(item).height();
                            }
                            if (Math.abs(position.top - self.$body.height() - nowY) < 5) {
                                finalY = position.top - self.$body.height();
                            }
                            if (Math.abs(position.top + $(item).height() - self.$body.height() - nowY) < 5) {
                                finalY = position.top + $(item).height() - self.$body.height();
                            }

                            if (Math.abs(position.left - nowX) < 5) {
                                finalX = position.left;
                            }
                            if (Math.abs(position.left + $(item).width() - nowX) < 5) {
                                finalX = position.left + $(item).width();
                            }
                            if (Math.abs(position.left - self.$body.width() - nowX) < 5) {
                                finalX = position.left - self.$body.width();
                            }
                            if (Math.abs(position.left + $(item).width() - self.$body.width() - nowX) < 5) {
                                finalX = position.left + $(item).width() - self.$body.width();
                            }
                        })

                        //endregion

                        this.$body.css({
                            "top": finalY,
                            "left": finalX
                        });
                    }
                }
            };

            $.fn.Drag = function (opts) {
                $(this).each(function (index, item) {
                    return new Constructor(item, opts);
                })
            }
        })();


        (function () {
            var defaults = {
                selector: ".table"
            };

            function Plugin(item, options) {
                var self = this;
                var opts = this.opts = $.extend({}, defaults, options);
                self.$container = $(item);
                $(item).mousedown(function (e) {
                    if (e.target == e.currentTarget) {//非冒泡
                        self.isSelectState = true;
                    }
                })

                $(document).mousemove(function (e) {
                    if (self.isSelectState) {
                        self.mousemove(e);
                    }
                });

                $(document).mouseup(function (e) {
                    if (self.isSelectState) {
                        self.isSelectState = false;
                        self.pinRect = false;
                        self.isMouseMoving = false;
                        if (self.$selectRect) {
                            self.$selectRect.remove();
                            self.$selectRect = null;
                        }
                    }
                });

                $(item).click(function (e) {
                    if (e.target == e.currentTarget) {//非冒泡
                        self.removeAllSelected();
                    }
                })

                $(document).keydown(function (e) {
                    if (e.ctrlKey) {
                        self.ctrlKeyPressed = true;
                    }
                });
                $(document).keyup(function (e) {
                    if (!e.ctrlKey) {
                        self.ctrlKeyPressed = false;
                    }
                });

                self.$container.on("click", self.opts.selector, function () {
                    if (self.ctrlKeyPressed) {
                        $(this).addClass("selected");
                    }
                    else {
                        self.removeAllSelected();
                        $(this).addClass("selected");
                    }
                })
            }

            Plugin.prototype.mousemove = function (e) {
                var self = this;
                if (!self.$selectRect && !self.isMouseMoving) {
                    self.isMouseMoving = true;

                    self.rectY = e.pageY - self.$container.position().top;
                    self.rectX = e.pageX - self.$container.position().left;
                }

                if (self.isMouseMoving) {
                    var newY = e.pageY - self.$container.position().top;
                    var newX = e.pageX - self.$container.position().left;
                    if ((newY - self.rectY) > 5 && (newX - self.rectX) > 5) {
                        self.$selectRect = $("<div/>").addClass("selectrect");
                        self.$container.append(self.$selectRect);
                        var rect = self.$selectRect;
                        rect.css({
                            "top": self.rectY,
                            "left": self.rectX
                        });
                        self.pinRect = true;
                        self.isMouseMoving = false;
                    }
                }

                if (self.pinRect) {
                    var newY = e.pageY - self.$container.position().top;
                    var newX = e.pageX - self.$container.position().left;
                    var width = newX - self.rectX;
                    var height = newY - self.rectY;
                    self.$selectRect.css({
                        "width": width,
                        "height": height
                    })
                    //检查选中的
                    var tables = self.$container.find(self.opts.selector)
                    tables.each(function (index, table) {
                        var tableX = $(table).position().left + $(table).width() / 2;
                        var tableY = $(table).position().top + $(table).height() / 2;

                        if (tableX > self.rectX && tableY > self.rectY && tableX < newX && tableY < newY) {
                            $(table).addClass("selected");
                        }
                        else {
                            $(table).removeClass("selected");
                        }
                    })
                }

            }

            Plugin.prototype.removeAllSelected = function () {
                var self = this;
                var tables = self.$container.find(self.opts.selector)
                tables.each(function (index, table) {
                    $(table).removeClass("selected");
                })
            }

            Plugin.prototype.getSelected = function () {
                var self = this;
                var tables = self.$container.find(self.opts.selector)
                var selected = [];
                tables.each(function (index, table) {
                    selected.push($(table));
                })
            }

            $.fn.Selectable = function (opts) {
                $(this).each(function (index, item) {
                    return new Plugin(item, opts);
                })
            }
        })();

    </script>
</body>
</html>

  

转载注明出处:博客园 http://www.cnblogs.com/gxrsprite

posted @ 2015-05-13 17:08  咖喱gg  阅读(1495)  评论(0编辑  收藏  举报