首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一个页面上移动多个div

在同一个页面上移动多个div
EN

Stack Overflow用户
提问于 2018-06-13 08:37:46
回答 1查看 143关注 0票数 0

我的问题是当我在文档中添加一个mousemove监听器时,所有的div都在移动,但是当我在元素上添加一个mousemove侦听器时,我必须缓慢地移动光标。

这是我的代码:

代码语言:javascript
复制
let componentsItems = document.getElementsByClassName("componentItem");
[].forEach.call(componentsItems, function (componentItem) {
    componentItem.addEventListener("click", function (event) {
        let selectedComponent = getComponentToDisplay(event.target.getAttribute("data-exchange"));

        let mapContainer = document.getElementById("mapContainer");
        let mainElement = document.createElement("div");
        mainElement.innerHTML = "test";

        mainElement.style.position = "absolute";
        mapContainer.appendChild(mainElement);

        mainElement.addEventListener("mouseup", function (e) {
            isDown = false;
        });

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

        document.addEventListener("mousemove", function (e) {
            e.preventDefault();
            mousePosition = {
                x: e.clientX,
                y: e.clientY
            };

            let left = (mousePosition.x + offset[0]);
            let top = (mousePosition.y + offset[1]);
            if(isDown){
                if(mapContainer.offsetTop < top && mapContainer.offsetWidth > left){
                    mainElement.style.left =  left + 'px';
                    mainElement.style.top = top + 'px';
                }
            }
        });
    });
});

对于我菜单中的每个组件,我在"MapContainer“div中向MapContainer元素添加了一个onclick侦听器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-13 09:51:19

拖放问题。

问题是您将多个mousemove侦听器附加到文档中,每个侦听器都带有不同的mainElements。

解决办法:

记住,我们要移动的是哪个元素

代码语言:javascript
复制
mainElement.addEventListener("mousedown", function (e) {
  isDown = true;
  element = mainElement;
  offset = [
    mainElement.offsetLeft - e.clientX,
    mainElement.offsetTop - e.clientY
  ];
});

在外部作用域(Element)上,创建一个惟一的mousemove事件侦听器,并更新我们前面所述的元素

代码语言:javascript
复制
document.addEventListener("mousemove", function (e) {
  e.preventDefault();
  mousePosition = {
    x: e.clientX,
    y: e.clientY
  };

  let left = (mousePosition.x + offset[0]);
  let top = (mousePosition.y + offset[1]);
  if(isDown){
    if(mapContainer.offsetTop < top && mapContainer.offsetWidth > left){
      element.style.left =  left + 'px';
      element.style.top = top + 'px';
    }
  }
});

解决此问题的其他方法是分别在mousedown和mouseup事件处理程序上创建(和删除)事件侦听器。但我认为它效率较低,而且肯定更复杂。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50832675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档