【问题标题】:Element after translation goes back to origin place?翻译后的元素回到原点?
【发布时间】:2021-03-09 20:18:25
【问题描述】:

我之前发布过,但我更改了很多代码,但问题是一样的。我试图在鼠标移动后翻译一个元素。这是代码:

<svg id="m" width="40" height="40">
        <circle cx="20" cy="20" r="20" fill="red" stroke="red" stroke-width="1"/>
    </svg>
    
    <script>
let m = document.getElementById("m");
 
let start = function(e) {
  var speedX = Math.abs(e.movementX);
  var speedY = Math.abs(e.movementY);
  
  m.style.transform = `translate(${speedX}px, ${speedY}px)`;
};
 
document.addEventListener("mousemove", e => start(e));
    </script> 

我也想知道如何添加方向,但只有在解决了这个问题之后。非常感谢

【问题讨论】:

  • 您的实际问题是什么?您的代码完全按照您的要求执行...您的意思是说圆圈总是跳回原来的位置吗?
  • 它不翻译,它停留在它的位置“你的意思是说圆圈总是跳回原来的位置吗?” -> 是的
  • 嗯,很奇怪,当我尝试它时,它会很快从原来的位置移动到我的鼠标方向,然后又返回。你用的是哪个浏览器?
  • mozilla firefox
  • 您是否尝试过使用e.offsetX 而不是e.movementX? (Y轴相同)

标签: javascript html css animation svg


【解决方案1】:

您正在平衡当前运动的位置。

您想要的是添加运动(不是绝对值)到当前位置。

记住:position = position + velocity。

您还可以通过在单击时移动它来改善行为,以避免它离开屏幕并做出不希望的动作。

例如:

let m = document.getElementById("m");
let posX = 0;
let posY = 0;

let update = function(e) {
  posX += e.movementX;
  posY += e.movementY;

  m.style.transform = `translate(${posX}px, ${posY}px)`;
};

// Listen to movement when mousedown.
document.addEventListener("mousedown", () => {
  document.addEventListener("mousemove", update);
});

// Remove movement when mouseup.
document.addEventListener("mouseup", () => {
  document.removeEventListener("mousemove", update);
});
<svg id="m" width="40" height="40">
  <circle cx="20" cy="20" r="20" fill="red" stroke="red" stroke-width="1"/>
</svg>

【讨论】:

  • 非常感谢,但为什么不添加 posX 和 Y 就无法工作?
  • 这就像现实生活中一样,如果你以每小时 1 公里的速度移动,并使用该速度作为你的位置,你将始终处于 1 公里的位置。相反,你有一个位置,它会被速度“修改”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2014-01-09
  • 2020-05-07
  • 2019-12-30
  • 2016-07-31
相关资源
最近更新 更多