如何设置可拖动的起始位置div?

How to set start position of draggable div?

我有一个可拖动的 div,只要我不通过 top, right, … CSS 改变它的位置,它就可以正常工作。我的目标是将 div 的预拖动位置设置为 window 的右上角,我用 top = 0, right = 0 完成;问题是,div 会固定在那个位置,而 stretches 会在拖动时固定。

dragElement(document.getElementById("myModal"));

function dragElement(elmnt) {
  var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
  if (document.getElementById(elmnt.id + "header")) {
  document.getElementById(elmnt.id + "header").onmousedown = dragMouseDown;} 
  else {elmnt.onmousedown = dragMouseDown;}

  function dragMouseDown(w) {
    w = w || window.event;
    w.preventDefault();
    pos3 = w.clientX;
    pos4 = w.clientY;
    document.onmouseup = closeDragElement;
    document.onmousemove = elementDrag;}
    
  function elementDrag(w) {
    w = w || window.event;
    w.preventDefault();
    pos1 = pos3 - w.clientX;
    pos2 = pos4 - w.clientY;
    pos3 = w.clientX;
    pos4 = w.clientY;
    elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
    elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";}

  function closeDragElement() {
    document.onmouseup = null;
    document.onmousemove = null;}}
#myModal {
    position: absolute;
    z-index: 9;
    background-color: #f1f1f1;
    text-align: center;
    border: 1px solid #d3d3d3;
    top: 0;
    right: 0;}
#myModalheader {
    padding: 10px;
    cursor: move;
    z-index: 10;
    background-color: #2196F3;
    color: #fff;}
<div id="myModal">
  <div id="myModalheader">Click here to move</div>
  <p>Move</p><p>this</p><p>DIV</p>
</div>

有什么解决方法吗?感谢帮助。

给元素一个宽度和高度,你应该很好。

dragElement(document.getElementById("myModal"));

function dragElement(elmnt) {
  var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
  if (document.getElementById(elmnt.id + "header")) {
  document.getElementById(elmnt.id + "header").onmousedown = dragMouseDown;} 
  else {elmnt.onmousedown = dragMouseDown;}

  function dragMouseDown(w) {
    w = w || window.event;
    w.preventDefault();
    pos3 = w.clientX;
    pos4 = w.clientY;
    document.onmouseup = closeDragElement;
    document.onmousemove = elementDrag;}
    
  function elementDrag(w) {
    w = w || window.event;
    w.preventDefault();
    pos1 = pos3 - w.clientX;
    pos2 = pos4 - w.clientY;
    pos3 = w.clientX;
    pos4 = w.clientY;
    elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
    elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";}

  function closeDragElement() {
    document.onmouseup = null;
    document.onmousemove = null;}}
#myModal {
    position: absolute;
    z-index: 9; height: 200px; width: 200px;
    background-color: #f1f1f1;
    text-align: center;
    border: 1px solid #d3d3d3;
    top: 0;
    right: 0;}
#myModalheader {
    padding: 10px;
    cursor: move;
    z-index: 10;
    background-color: #2196F3;
    color: #fff;}
<div id="myModal">
  <div id="myModalheader">Click here to move</div>
  <p>Move</p><p>this</p><p>DIV</p>
</div>

您也可以使用 flex box 将容器放在右边。

#parentContainer{
    display: flex; justify-content: flex-end
}

我还有两个选择:

  1. 根本不要使用 right:0; 并使用 left:100%; width:max-content; 后跟 transform: translateX(-100%); 所以它基于 child 而不是 parent 进行偏移: (仅对 css 文件进行了更改)

dragElement(document.getElementById("myModal"));

function dragElement(elmnt) {
  var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
  if (document.getElementById(elmnt.id + "header")) {
  document.getElementById(elmnt.id + "header").onmousedown = dragMouseDown;} 
  else {elmnt.onmousedown = dragMouseDown;}

  function dragMouseDown(w) {
    w = w || window.event;
    w.preventDefault();
    pos3 = w.clientX;
    pos4 = w.clientY;
    document.onmouseup = closeDragElement;
    document.onmousemove = elementDrag;}
    
  function elementDrag(w) {
    w = w || window.event;
    w.preventDefault();
    pos1 = pos3 - w.clientX;
    pos2 = pos4 - w.clientY;
    pos3 = w.clientX;
    pos4 = w.clientY;
    elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
    elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";}

  function closeDragElement() {
    document.onmouseup = null;
    document.onmousemove = null;}}
#myModal {
    position: absolute;
    z-index: 9;
    background-color: #f1f1f1;
    text-align: center;
    border: 1px solid #d3d3d3;
    top: 0;
    left: 100%;                   /**Important*/
    transform: translateX(-100%); /**Important: offsets based on the element's width and not its parent*/
    width:max-content;            /**Important: prevents element from shrinking*/
    top:0;
}
    
#myModalheader {
    padding: 10px;
    cursor: move;
    z-index: 10;
    background-color: #2196F3;
    color: #fff;
}
<div id="myModal">
  <div id="myModalheader">Click here to move</div>
  <p>Move</p><p>this</p><p>DIV</p>
</div>

  1. 第二个选项是在第一次拖动时计算元素右侧的偏移量,并在完成拖动后将 right:0; 设置为 right:auto; (仅对 javascript 文件进行了更改)

dragElement(document.getElementById("myModal"));

function dragElement(elmnt) {
  var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
  if (document.getElementById(elmnt.id + "header")) {
  document.getElementById(elmnt.id + "header").onmousedown = dragMouseDown;} 
  else {elmnt.onmousedown = dragMouseDown;}

  function dragMouseDown(w) {
    w = w || window.event;
    w.preventDefault();
    pos3 = w.clientX;
    pos4 = w.clientY;
    document.onmouseup = closeDragElement;
    document.onmousemove = elementDrag;}
    
  function elementDrag(w) {
    w = w || window.event;
    w.preventDefault();
    pos1 = pos3 - w.clientX;
    pos2 = pos4 - w.clientY;
    pos3 = w.clientX;
    pos4 = w.clientY;
    //Check if a right offset exists (will only be true
    //during the first time you drag it)
    if(elmnt.style.right != null && elmnt.style.right != "auto"){
      //calculate right offset
      var offsetright = window.innerWidth-elmnt.offsetLeft-elmnt.offsetWidth;
      //add the offset to the right of the element
      elmnt.style.right = (offsetright +pos1) + "px";
    }
    //end of change
    
    elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
    elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";}

  function closeDragElement() {
    document.onmouseup = null;
    document.onmousemove = null;
    elmnt.style.right = "auto";
  }}
#myModal {
    position: absolute;
    z-index: 9;
    background-color: #f1f1f1;
    text-align: center;
    border: 1px solid #d3d3d3;
    top: 0;
    right: 0;}
#myModalheader {
    padding: 10px;
    cursor: move;
    z-index: 10;
    background-color: #2196F3;
    color: #fff;}
<div id="myModal">
  <div id="myModalheader">Click here to move</div>
  <p>Move</p><p>this</p><p>DIV</p>
</div>