【问题标题】:make a draggable div in another div在另一个 div 中创建一个可拖动的 div
【发布时间】:2021-09-27 12:57:57
【问题描述】:

我有一个由下面的代码设计的可拖动 div。现在我想把这个 div 放在另一个 div 中。我希望我的第一个 div 移动到第二个 div 内,而不是整个网页。我将<div> </div> 放在我的代码的任何位置,但没有看到我想要的。

代码是:

//Make the DIV element draggagle:
dragElement(document.getElementById("mydiv"));

function dragElement(elmnt) {
  var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
  if (document.getElementById(elmnt.id + "header")) {
    /* if present, the header is where you move the DIV from:*/
    document.getElementById(elmnt.id + "header").onmousedown = dragMouseDown;
  } else {
    /* otherwise, move the DIV from anywhere inside the DIV:*/
    elmnt.onmousedown = dragMouseDown;
  }

  function dragMouseDown(e) {
    e = e || window.event;
    e.preventDefault();
    // get the mouse cursor position at startup:
    pos3 = e.clientX;
    pos4 = e.clientY;
    document.onmouseup = closeDragElement;
    // call a function whenever the cursor moves:
    document.onmousemove = elementDrag;
  }

  function elementDrag(e) {
    e = e || window.event;
    e.preventDefault();
    // calculate the new cursor position:
    pos1 = pos3 - e.clientX;
    pos2 = pos4 - e.clientY;
    pos3 = e.clientX;
    pos4 = e.clientY;
    // set the element's new position:
    elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
    elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";
  }

  function closeDragElement() {
    /* stop moving when mouse button is released:*/
    document.onmouseup = null;
    document.onmousemove = null;
  }
}
#mydiv {
  position: absolute;
  z-index: 9;
  
  text-align: center;
  border: 1px solid #d3d3d3;
}

#mydivheader {
  padding: 10px;
  cursor: move;
  z-index: 10; 
}

@media print {
    body{
        width: 21cm;
        height: 29.7cm;
        margin: 0 0mm 0mm 0mm; 
        /* change the margins as you want them to be. */
   } 
}
<div id="mydiv">
  <div id="mydivheader">my text</div>
</div>

谁能帮帮我? ;-)

【问题讨论】:

    标签: javascript html css draggable


    【解决方案1】:

    为可拖动div添加父div并将其position设置为relative并为其设置overflow:hidden并将可拖动div的position设置为absolute。还将dragElement 目标设置为mydivheader

    <html>
    <style>
    #mydiv {
      position: absolute;
      z-index: 9;
      
      text-align: center;
      border: 1px solid #d3d3d3;
    }
    
    #mydivheader {
      padding: 10px;
      cursor: move;
      z-index: 10; 
      position: absolute;
    }
      
      #dragParent {
        width: 300px;
        margin: auto;
        overflow: hidden;
        height: 200px;
        position: relative;
        border: 1px solid #e5e5e5;
      }
    
    @media print {
        body{
            width: 21cm;
            height: 29.7cm;
            margin: 0 0mm 0mm 0mm; 
            /* change the margins as you want them to be. */
       } 
    }
    </style>
    <body>
    
    <div id="mydiv">
      <div id="dragParent">
      <div id="mydivheader">my text</div>
      </div>
    </div>
    
    <script>
    //Make the DIV element draggagle:
    dragElement(document.getElementById("mydivheader"));
    
    function dragElement(elmnt) {
      var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
      if (document.getElementById(elmnt.id + "header")) {
        /* if present, the header is where you move the DIV from:*/
        document.getElementById(elmnt.id + "header").onmousedown = dragMouseDown;
      } else {
        /* otherwise, move the DIV from anywhere inside the DIV:*/
        elmnt.onmousedown = dragMouseDown;
      }
    
      function dragMouseDown(e) {
        e = e || window.event;
        e.preventDefault();
        // get the mouse cursor position at startup:
        pos3 = e.clientX;
        pos4 = e.clientY;
        document.onmouseup = closeDragElement;
        // call a function whenever the cursor moves:
        document.onmousemove = elementDrag;
      }
    
      function elementDrag(e) {
        e = e || window.event;
        e.preventDefault();
        // calculate the new cursor position:
        pos1 = pos3 - e.clientX;
        pos2 = pos4 - e.clientY;
        pos3 = e.clientX;
        pos4 = e.clientY;
        // set the element's new position:
        elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
        elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";
      }
    
      function closeDragElement() {
        /* stop moving when mouse button is released:*/
        document.onmouseup = null;
        document.onmousemove = null;
      }
    }
    </script>
    
    </body>
    </html>

    【讨论】:

    • 谢谢 Viira,它有效。但我有两个问题。 1-如何防止可拖动的退出拖动父级?我的意思是 owerflow :隐藏它出去和后面,但我希望它停止进入边界。 2- 我怎样才能只打印 dragparent 及其内容而不是其他任何内容?
    • 为可拖动的 div 设置包含。 stackoverflow.com/questions/11781346/… 参考这里
    • 非常感谢 Viira
    【解决方案2】:

    我们可以限制可拖动元素在父元素的维度内的移动。 这就是在下面的代码行中所做的:

    <!DOCTYPE html>
    <html>
    <style>
    #wrapper {
        width: 200px;
        height: 200px;
        background-color: grey;
        position: relative;
    }
    #mydiv {
      position: absolute;
      z-index: 9;
      
      text-align: center;
      border: 1px solid #d3d3d3;
    }
    
    #mydivheader {
      padding: 10px;
      cursor: move;
      z-index: 10; 
    }
    
    @media print {
        body{
            width: 21cm;
            height: 29.7cm;
            margin: 0 0mm 0mm 0mm; 
            /* change the margins as you want them to be. */
       } 
    }
    </style>
    <body>
    <div id="wrapper">
    <div id="mydiv">
      <div id="mydivheader">my text</div>
    </div>
    </div>
    
    <script>
    //Make the DIV element draggagle:
    dragElement(document.getElementById("mydiv"));
    
    function dragElement(elmnt) {
      var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
      if (document.getElementById(elmnt.id + "header")) {
        /* if present, the header is where you move the DIV from:*/
        document.getElementById(elmnt.id + "header").onmousedown = dragMouseDown;
      } else {
        /* otherwise, move the DIV from anywhere inside the DIV:*/
        elmnt.onmousedown = dragMouseDown;
      }
    
      function dragMouseDown(e) {
        e = e || window.event;
        e.preventDefault();
        // get the mouse cursor position at startup:
        pos3 = e.clientX;
        pos4 = e.clientY;
        document.onmouseup = closeDragElement;
        // call a function whenever the cursor moves:
        document.onmousemove = elementDrag;
      }
    
      function elementDrag(e) {
        e = e || window.event;
        e.preventDefault();
        // calculate the new cursor position:
        pos1 = pos3 - e.clientX;
        pos2 = pos4 - e.clientY;
        pos3 = e.clientX;
        pos4 = e.clientY;
        
        let parentElement = elmnt.parentElement;
        if(elmnt.offsetTop < 0){elmnt.style.top = "0px"; return;}
        if(elmnt.offsetTop > (parentElement.offsetHeight - elmnt.offsetHeight))     {
            elmnt.style.top = (parentElement.offsetHeight - elmnt.offsetHeight) + "px"; 
            return;
          }
        if(elmnt.offsetLeft < 0){elmnt.style.left = "0px";return}
        if(elmnt.offsetLeft > (parentElement.offsetWidth - elmnt.offsetWidth)){
            elmnt.style.left = (parentElement.offsetWidth - elmnt.offsetWidth) + "px";
            return;
        }
        
        // set the element's new position:
        elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
        elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";
      }
    
      function closeDragElement() {
        /* stop moving when mouse button is released:*/
        document.onmouseup = null;
        document.onmousemove = null;
      }
    }
    </script>
    
    </body>
    </html>
    

    添加的附加js代码为:

        let parentElement = elmnt.parentElement;
        if(elmnt.offsetTop < 0){elmnt.style.top = "0px"; return;}
        if(elmnt.offsetTop > (parentElement.offsetHeight - elmnt.offsetHeight))     {
            elmnt.style.top = (parentElement.offsetHeight - elmnt.offsetHeight) + "px"; 
            return;
          }
        if(elmnt.offsetLeft < 0){elmnt.style.left = "0px";return}
        if(elmnt.offsetLeft > (parentElement.offsetWidth - elmnt.offsetWidth)){
            elmnt.style.left = (parentElement.offsetWidth - elmnt.offsetWidth) + "px";
            return;
        }
    

    这些只是一些检查,如果元素超出父元素的尺寸,则不改变元素的位置。

    【讨论】:

    • 谢谢西瓦拉姆。这很好用。实际上我无法正确地将“包含”添加到我的代码中。但这解决了问题。
    • 亲爱的 sivaram 是否可以将这个可拖动的 div 覆盖在现有的 pdf 上并制作新的 pdf?
    • @SaeedEisakhani 我不太明白你的问题,你能为此创建一个新帖子吗?此外,如果此答案对您有用,请接受此答案。
    • 我之前在一个新问题中问过这个问题。只需点击链接stackoverflow.com/questions/69371785/…
    • @SaeedEisakhani 可以在另一个问题中添加屏幕截图或代码 sn-ps 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 2013-12-03
    • 2012-10-20
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多