javascript - 拖动后保存 div 的位置

标签 javascript jquery html

我有以下脚本,当拖动灰色处理程序(左上角)div 重新调整大小时,但在释放鼠标时 div 被放置在错误的位置(左边距)。

我需要修复它,就像右下角处理程序一样。

可能是什么问题?它似乎与 event.clientX 设置为 0 有关。

注意:单击 div 激活处理程序。

http://jsfiddle.net/cx41otxp/

  <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <style>
            #target {
                background-color: lightgreen;
            }

            .selected {
                border: 1px dashed red;
            }

            .handler {
                position: absolute;
                width: 10px;
                height: 10px;
                background-color: gray;
            }
        </style>
        <script>
            window.App = {
                config: {
                    elm: 'target',
                    elmInnerContent: 'inner-content',
                    x: null,
                    y: null,
                    w: null,
                    h: null,
                    handlerSize: 10
                },
                start: function () {
                    this.addEventListeners();
                },
                addEventListeners: function () {
                    var elm = document.getElementById(this.config.elm);
                    elm.addEventListener('click', function () {
                        if (!elm.classList.contains('selected')) {
                            elm.classList.add('selected');
                            this.getDimensions();
                            this.createHandlers();
                            this.setPositionHandlers();
                            this.addEventListenersHandlers();
                        } else {
                            elm.classList.remove('selected');
                            this.removeHandlers();
                        }
                    }.bind(this));
                },
                removeHandlers: function () {
                    var elm = document.getElementById('handler-wrapper');
                    elm.parentElement.removeChild(elm);
                },
                getDimensions: function () {
                    var elm = document.getElementById(this.config.elm);
                    this.config.x = elm.offsetLeft;
                    this.config.y = elm.offsetTop;
                    this.config.w = elm.clientWidth;
                    this.config.h = elm.clientHeight;
                },
                createHandlers: function () {
                    var wrpHandlers = document.createElement('div'),
                        htmlHandlers = '<div id="tl" class="tl handler" draggable="true">&nbsp;</div>';
                    htmlHandlers += '<div id="tr" class="tr handler" draggable="true">&nbsp;</div>';
                    htmlHandlers += '<div id="bl" class="bl handler" draggable="true">&nbsp;</div>';
                    htmlHandlers += '<div id="br" class="br handler" draggable="true">&nbsp;</div>';
                    wrpHandlers.id = "handler-wrapper";
                    wrpHandlers.innerHTML = htmlHandlers;
                    var elm = document.getElementById(this.config.elm);
                    elm.appendChild(wrpHandlers);
                },
                setPositionHandlers: function () {
                    this.getDimensions();
                    var elmTl = document.getElementById('tl'),
                        elmTr = document.getElementById('tr'),
                        elmBl = document.getElementById('bl'),
                        elmBr = document.getElementById('br');
                    elmTl.style.top = this.config.handlerSize * -1 + 'px';
                    elmTl.style.left = this.config.handlerSize * -1 + 'px';
                    elmTr.style.top = this.config.handlerSize * -1 + 'px';
                    elmTr.style.left = this.config.w + 'px';
                    elmBl.style.top = this.config.h + 'px';
                    elmBl.style.left = this.config.handlerSize * -1 + 'px';
                    elmBr.style.top = this.config.h + 'px';
                    elmBr.style.left = this.config.w + 'px';
                },
                addEventListenersHandlers: function () {
                    var elmTl = document.getElementById('tl'),
                    elmTr = document.getElementById('tr'),
                    elmBl = document.getElementById('bl'),
                    elmBr = document.getElementById('br');

                    elmTl.addEventListener('drag', function (event) {
                        this.resize('tl', event);
                    }.bind(this));
                    elmTr.addEventListener('drag', function (event) {
                        this.resize('tr', event);
                    }.bind(this));
                    elmBl.addEventListener('drag', function (event) {
                        this.resize('bl', event);
                    }.bind(this));
                    elmBr.addEventListener('drag', function (event) {
                        this.resize('br', event);
                    }.bind(this));
                },
                resize: function (handler, event) {
                    var elm = document.getElementById(this.config.elm);
                    switch (handler) {
                        case 'tl':
                            var marginR = elm.offsetLeft + elm.clientWidth,
                                newW = marginR - event.clientX,
                                xPos = event.clientX;

                            elm.style.left = xPos + 'px';
                            elm.style.width = newW + 'px';
                            this.setPositionHandlers();
                            break;
                        case 'tr':
                            break;
                        case 'bl':
                            break;
                        case 'br':
                            var newW = event.clientX - this.config.x,
                                newH = event.clientY - this.config.y;
                            elm.style.width = newW + 'px';
                            elm.style.height = newH + 'px';
                            this.setPositionHandlers();
                            break;
                    }
                },
            };


        </script>
        <title></title>
    </head>
    <body onload="window.App.start();">
        <div id="target" style="position: absolute; top: 100px; left: 100px; width: 100px; height: 100px;">
            <div id="inner-content">
                Some text here
            </div>
        </div>
    </body>
    </html>

最佳答案

resize函数中,case 'tl':您必须对顶部和高度执行相同的操作,与对左侧和宽度执行的操作相同。

marginT = elm.offsetTop + elm.clientHeight,
newH = marginT - event.clientY,
yPos = event.clientY;

elm.style.top = yPos + 'px';
elm.style.height = newH + 'px';

编辑:抱歉,我想第一次读错了一些东西。 仅供引用:您的代码在 Safari 中运行良好,但在 Chrome 中,我看到了您的问题。

Edit2:我不知道是什么原因造成的。但如果你只检查 xPos >= 0,你就可以解决这个问题。我知道这是一个丑陋的黑客,但这是我拥有的最好的黑客。 Fiddle已更新。

关于javascript - 拖动后保存 div 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27151643/

相关文章:

javascript - 谷歌云端硬盘 API : How to create a file in appDataFolder?

jQuery .each 循环与简单的数学不给出单独的结果

javascript - 将值推送到复选框或单选更改上的数组的功能

javascript - 从特殊字符之前和之后的字符串中获取值 - Jquery

javascript - JS将数组转换为json链表?

javascript - 为什么这个 map 不显示?

javascript - 将 HTML 变量传递给 Javascript

javascript - 视频/图像 slider 调整大小以适合屏幕(宽度和高度)

c# - ScriptManager.RegisterClientScriptIninclude 之后的 Javascript 对象 "is not defined"错误

javascript - 更改 jQuery 中链接数组的文本