javascript - 在每次移动鼠标时,可拖动元素的定位都会重置为零

标签 javascript css mouseevent draggable

我正在开发一个组件,它可以在容器中四处移动零件图。现在,第一次移动鼠标时一切正常,但第二次移动时,定位样式将重置为零。

我在 Vue 之外重新编写了代码,还制作了一个代码笔供您查看。

代码笔:https://codepen.io/paytonburd/pen/WKqEjo

代码:

let diagram = document.getElementById('diagram')
let diagramImg = document.getElementById('diagram-image')
let startX;
let startY;
let walkX;
let walkY;
let dragging = false;

diagram.addEventListener('mousedown', (e) => {
  dragging = true;
  startX = e.pageX - diagram.offsetLeft;
  startY = e.pageY - diagram.offsetTop;
})

diagram.addEventListener('mousemove', (e) => {
  if (!dragging) return;
  e.preventDefault();
  let x = e.pageX - diagram.offsetLeft;
  let y = e.pageY - diagram.offsetTop;

  walkX = x - startX
  walkY = y - startY
  console.log(walkX, walkY)

  diagramImg.style.top = walkY + 'px'
  diagramImg.style.left = walkX + 'px'
})

diagram.addEventListener('mouseleave', () => {
  dragging = false;
})

diagram.addEventListener('mouseup', () => {
  dragging = false;
})

最佳答案

当您按下鼠标时,您总是将 startXstartY 设置为相对于 diagram 的位置,它始终为 0, 0 并且从不移动。

我想你想要的是将它们设置为相对于图表图像的当前位置:

let diagram = document.getElementById('diagram')
let diagramImg = document.getElementById('diagram-image')
let startX;
let startY;
let walkX;
let walkY;
let dragging = false;

diagram.addEventListener('mousedown', (e) => {
  dragging = true;
  //This is where it went wrong
  startX = e.pageX - diagramImg.offsetLeft; 
  startY = e.pageY - diagramImg.offsetTop; 
})

diagram.addEventListener('mousemove', (e) => {
  if (!dragging) return;
  e.preventDefault();
  let x = e.pageX - diagram.offsetLeft;
  let y = e.pageY - diagram.offsetTop;

  walkX = x - startX
  walkY = y - startY
  console.log(walkX, walkY)

  diagramImg.style.top = walkY + 'px'
  diagramImg.style.left = walkX + 'px'
})

diagram.addEventListener('mouseleave', () => {
  dragging = false;
})

diagram.addEventListener('mouseup', () => {
  dragging = false;
})

https://codepen.io/anon/pen/yqdzyq?editors=1111

关于javascript - 在每次移动鼠标时,可拖动元素的定位都会重置为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51877390/

相关文章:

javascript - 在值更新时更新而不是在按下键时更新

javascript - 为什么 ngStyle 不起作用

javascript - 如何使用 javascript 访问文本区域的值?

javascript - 如果复选框被选中,获取下一个输入[文本]

canvas - Java Fx setOnMouseDragged 变慢

javascript - 为什么 mouseleave 一直在触发?

javascript - 从 iOS/Android 上的网络应用程序调用 native 日期选择器

javascript - 在 .mousemove 函数中循环

css - 内联 block 有时有效

javascript - 如何在javascript中检测鼠标右键释放事件?