Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript如何通过单击和拖动动态移动Div_Javascript_Html_Onmousedown - Fatal编程技术网

JavaScript如何通过单击和拖动动态移动Div

JavaScript如何通过单击和拖动动态移动Div,javascript,html,onmousedown,Javascript,Html,Onmousedown,好吧,看起来应该很简单。我需要采取一个已经存在的div,并根据鼠标在窗口中的位置移动它。我到处都在搜索,这让我找到了做同样事情的过于复杂的方法,包括使用j-query。我需要严格使用javascript来完成我的工作 方法: var mousePosition; var div; (function createDiv(){ div = document.createElement("div"); div.style.position = "absolute"; di

好吧,看起来应该很简单。我需要采取一个已经存在的div,并根据鼠标在窗口中的位置移动它。我到处都在搜索,这让我找到了做同样事情的过于复杂的方法,包括使用j-query。我需要严格使用javascript来完成我的工作

方法:

var mousePosition;
var div;

(function createDiv(){

    div = document.createElement("div");
    div.style.position = "absolute";
    div.style.left = "0px";
    div.style.top = "0px";
    div.style.width = "100px";
    div.style.height = "100px";
    div.style.background = "red";
    div.style.color = "blue";

    div.addEventListener('mousedown', handleKeyPressed, true);

    document.body.appendChild(div);


})();

function handleKeyPressed(event) {

    event.preventDefault();

    mousePosition = {

        x : event.clientX,
        y : event.clientY

    };

    div.style.left = mousePosition.x;
    div.style.top = mousePosition.y;

    //alert("whoa!");

}

我想你在找更像这样的东西

var mousePosition;
var offset = [0,0];
var div;
var isDown = false;

div = document.createElement("div");
div.style.position = "absolute";
div.style.left = "0px";
div.style.top = "0px";
div.style.width = "100px";
div.style.height = "100px";
div.style.background = "red";
div.style.color = "blue";

document.body.appendChild(div);

div.addEventListener('mousedown', function(e) {
    isDown = true;
    offset = [
        div.offsetLeft - e.clientX,
        div.offsetTop - e.clientY
    ];
}, true);

document.addEventListener('mouseup', function() {
    isDown = false;
}, true);

document.addEventListener('mousemove', function(event) {
    event.preventDefault();
    if (isDown) {
        mousePosition = {

            x : event.clientX,
            y : event.clientY

        };
        div.style.left = (mousePosition.x + offset[0]) + 'px';
        div.style.top  = (mousePosition.y + offset[1]) + 'px';
    }
}, true);

检查这是否比adeneo更平滑:


jquery更易于部署。我很惊讶你说你不想学

您可以将jquery文件保存在本地计算机中,这样就不需要internet 使用jquery功能

就我而言,我已将其保存在tools文件夹中。所以我不需要上网

对于上面回答的所有js多行js代码,您只需要一小行

 <script src="/common/tools/jquery-1.10.2.js"></script>
 <script src="/common/tools/jquery-ui.js"></script>

 <script>
   $(function() {
   $( "#mydiv_to_make_draggable" ).draggable();
   });
</script>

$(函数(){
$(“#mydiv_to_make_draggable”).draggable();
});

我刚刚对@adeneo的答案做了一个小小的修改,效果非常好。 如果所有内容都包含在函数中,并且每个事件都附加到div,则可以将其用作库的一部分

调用以下传递id的函数。如果div不存在,则创建该div

function drag_div(div_id){
var div;

div = document.getElementById(div_id);

if(div == null){
   div = document.createElement("div");
   div.id = div_id;
   div.style.position = "absolute";
   div.style.left = "0px";
   div.style.top = "0px";
   div.style.width = "100px";
   div.style.height = "100px";
   div.style.background = "red";
   div.style.color = "blue";
   document.body.appendChild(div);
}

div.addEventListener('mousedown', function(e) {
    div.isDown = true;
    div.offset = [
        div.offsetLeft - e.clientX,
        div.offsetTop - e.clientY
    ];
}, true);

div.addEventListener('mouseup', function() {
    div.isDown = false;
}, true);

div.addEventListener('mousemove', function(event) {
    event.preventDefault();
    if (div.isDown) {
        div.mousePosition = {

            x : event.clientX,
            y : event.clientY

        };
        div.style.left = (div.mousePosition.x + div.offset[0]) + 'px';
        div.style.top  = (div.mousePosition.y + div.offset[1]) + 'px';
    }
}, true);
}

你可以把这个用作图书馆。工作完美。我在github上找到了它,但它有时会被卡住,因为共享者在元素上放了“mouseup”。我把它改成文件,它解决了这个问题。这是固定版本

'use strict';

/**
 * Makes an element draggable.
 *
 * @param {HTMLElement} element - The element.
 */
function draggable(element) {
    var isMouseDown = false;

    // initial mouse X and Y for `mousedown`
    var mouseX;
    var mouseY;

    // element X and Y before and after move
    var elementX = 0;
    var elementY = 0;

    // mouse button down over the element
    element.addEventListener('mousedown', onMouseDown);

    /**
     * Listens to `mousedown` event.
     *
     * @param {Object} event - The event.
     */
    function onMouseDown(event) {
        mouseX = event.clientX;
        mouseY = event.clientY;
        isMouseDown = true;
    }

    // mouse button released
    document.addEventListener('mouseup', onMouseUp);

    /**
     * Listens to `mouseup` event.
     *
     * @param {Object} event - The event.
     */
    function onMouseUp(event) {
        isMouseDown = false;
        elementX = parseInt(element.style.left) || 0;
        elementY = parseInt(element.style.top) || 0;
    }

    // need to attach to the entire document
    // in order to take full width and height
    // this ensures the element keeps up with the mouse
    document.addEventListener('mousemove', onMouseMove);

    /**
     * Listens to `mousemove` event.
     *
     * @param {Object} event - The event.
     */
    function onMouseMove(event) {
        if (!isMouseDown) return;
        var deltaX = event.clientX - mouseX;
        var deltaY = event.clientY - mouseY;
        element.style.left = elementX + deltaX + 'px';
        element.style.top = elementY + deltaY + 'px';
    }
}
支持触摸输入 所有其他答案(包括已接受的答案)不适用于触摸输入触摸输入的事件与鼠标输入的事件不同。请参见MDN上的

下面的代码片段甚至可以用于触摸输入。我已经突出显示了所有需要添加以支持触摸设备的代码行。
这里的基本思想是类列表中包含
draggable
的每个元素都应该是draggable
。当需要拖动大量元素时,此概念更容易遵循

请参阅故障页面和下面的演示

const d=document.getElementsByClassName(“可拖动”);
for(设i=0;i//请注意,这个jQuery可以做到这一点,它对所有事情都很有用。添加jQuery UI,您就可以直接使用了。@adeneo jQuery是一个javascript库,我想学习javascript而不是jQuery,虽然我知道使用它是传统的,但我现在对学习它不感兴趣。只是研究纯javascript。不过有点紧张。这是bec因为它总是在鼠标指针的左上角,所以您必须计算元素相对于单击位置的偏移量,但这本身几乎是一个问题。@adeneo谢谢。:)虽然您可以简单地称我为白痴,因为我忘记将px添加到div.style.left=e.clientX;的末尾。但这对我帮助更大非常感谢。@StoneAgeCoder-是的,需要简单的JS单位。让我们看看我们是否能在一秒钟内修复抖动。这是迄今为止我见过的最好的解决方案。脚本很小,易于理解,结果比我在各种浏览器上看到的任何东西都好。我不得不发表评论和投票,如果只是为了再次找到它的话在将来,JQuery很容易使用,但是,任何人都可以使用。我也是一名程序员,喜欢从头开始编写代码。如果在代码中包含JQuery库,并且只使用其中的一个或两个函数,则会浪费大量空间。+1-现在有太多人跳到JQuery,而他们没有(1)首先理解或认识jQuery存在的原因,(2)评估当前环境对如此庞大的代码库的需求。更多的时候——使用纯ES6和ES5转换将导致未来验证的代码,更少的膨胀,更好地理解编程及其工作方式。而不是“仅仅让它工作”。我没有发现这比接受的答案更平滑。实际上有点紧张。我做错了什么吗?是的。接受的答案现在比我的更平滑。请使用接受的答案。感谢库的想法。但是当你快速移动鼠标时,div会结巴。mousemove事件应该添加到文档中。
'use strict';

/**
 * Makes an element draggable.
 *
 * @param {HTMLElement} element - The element.
 */
function draggable(element) {
    var isMouseDown = false;

    // initial mouse X and Y for `mousedown`
    var mouseX;
    var mouseY;

    // element X and Y before and after move
    var elementX = 0;
    var elementY = 0;

    // mouse button down over the element
    element.addEventListener('mousedown', onMouseDown);

    /**
     * Listens to `mousedown` event.
     *
     * @param {Object} event - The event.
     */
    function onMouseDown(event) {
        mouseX = event.clientX;
        mouseY = event.clientY;
        isMouseDown = true;
    }

    // mouse button released
    document.addEventListener('mouseup', onMouseUp);

    /**
     * Listens to `mouseup` event.
     *
     * @param {Object} event - The event.
     */
    function onMouseUp(event) {
        isMouseDown = false;
        elementX = parseInt(element.style.left) || 0;
        elementY = parseInt(element.style.top) || 0;
    }

    // need to attach to the entire document
    // in order to take full width and height
    // this ensures the element keeps up with the mouse
    document.addEventListener('mousemove', onMouseMove);

    /**
     * Listens to `mousemove` event.
     *
     * @param {Object} event - The event.
     */
    function onMouseMove(event) {
        if (!isMouseDown) return;
        var deltaX = event.clientX - mouseX;
        var deltaY = event.clientY - mouseY;
        element.style.left = elementX + deltaX + 'px';
        element.style.top = elementY + deltaY + 'px';
    }
}