如何使用offsetX和offsetY在Firefox浏览器中的svg中移动圆?

时间:2019-07-09 13:56:40

标签: javascript firefox cross-browser

我已经用JavaScript编写了一些代码,该代码允许用户操纵svg中的圆圈。

我在下面提供了一些代码。在这里您可以移动一个圆圈。在Chrome以及Egde上均可完美运行。在Firefox上不起作用。当我移动圆时,它几乎每隔一个像素就会传送到左上角。我的版本是67.0.4。

以下代码是从HTML文件内部使用ID为“ svg”的svg。

Codepen Example

const svg = document.getElementById('svg');
const circle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
circle.setAttribute("cx", "100px");
circle.setAttribute("cy", "100px");
circle.setAttribute("r", "50px");
circle.setAttribute("fill", "blue");
svg.appendChild(circle);

let pressed = false;

svg.addEventListener("mousedown", (e) => {
  pressed = true;
});

svg.addEventListener("mousemove", (e) => {
  if (pressed) {
    circle.setAttribute("cx", e.offsetX);
    circle.setAttribute("cy", e.offsetY);
  }
});

svg.addEventListener("mouseup", (e) => {
  pressed = false;
});

1 个答案:

答案 0 :(得分:1)

使用clientXclientY。我认为offsetXoffsetY在Firefox中已弃用

const svg = document.getElementById('svg');
const circle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
circle.setAttribute("cx", "100px");
circle.setAttribute("cy", "100px");
circle.setAttribute("r", "50px");
circle.setAttribute("fill", "blue");
svg.appendChild(circle);

let pressed = false;

svg.addEventListener("mousedown", (e) => {
  pressed = true;
});

svg.addEventListener("mousemove", (e) => {
  if (pressed) {
    circle.setAttribute("cx", e.clientX);
    circle.setAttribute("cy", e.clientY);
  }
});

svg.addEventListener("mouseup", (e) => {
  pressed = false;
});
svg {
  background: grey;
}
<svg id="svg" width="300" height="200"><svg>