• 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 {
                 100px;
                height: 50px;
            }
    
            .horizontal {
                 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

  • 相关阅读:
    打印九九乘法三角形的各种思路
    7-14 倒数第N个字符串
    7-13 求阶乘序列前N项和
    7-12统计学生成绩
    Discrete Mathematics and Its Applications | 1 CHAPTER The Foundations: Logic and Proofs | 1.3 Propositional Equivalences
    Discrete Mathematics and Its Applications | 1 CHAPTER The Foundations: Logic and Proofs | 1.2 Applications of Propositional Logic
    Discrete Mathematics and Its Applications | 1 CHAPTER The Foundations: Logic and Proofs | 1.1 Propositional Logic
    [Mac Terminal] ___切换到其他路径和目录
    [Mac Terminal] ___MAC终端清屏快捷键
    部署flask到linux服务器
  • 原文地址:https://www.cnblogs.com/gxrsprite/p/4501003.html
Copyright © 2020-2023  润新知