簡體   English   中英

在同一頁面上移動多個div

[英]Move multiple divs on the same page

我的問題是,當我在文檔上添加mousemove偵聽器時,所有div都在移動,但是當我在元素上添加mousemove偵聽器時,我必須緩慢移動光標。

這是我的代碼:

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中的appendChild元素添加一個onclick偵聽器。

拖放問題。

問題是您將多個mousemove偵聽器附加到文檔,並且每個偵聽器都具有不同的mainElement之一。

解決方案:

記住我們將要移動的元素

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

在外部作用域(foreach外部)上,創建一個唯一的mousemove事件偵聽器,並更新我們之前將其按下的元素

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事件處理程序上創建(和刪除)事件監聽器。 但我認為它效率較低,而且肯定更復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM