javascript - HTML 和 SVG 如何用鼠标单击只移动一条线的一个端点?

标签 javascript css html

我一直在试图找出一种方法来只移动一条线的一端,但它不断改变容器,从而重新绘制整条线并移动它。

这是一个 js fiddle :https://jsfiddle.net/h2nwygu8/1/

<html>

  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="chrome=1">
    <title>Review Race</title>
  </head>

  <body>
    <div class="wrapper">
      <section>
        <h1>Line Test</h1>
        <div id="canvas" style="width: 960px; height:410px; border: 4px solid lime;">
          <svg id="svgContainer" xmlns="http://www.w3.org/2000/svg" version="1.1" style="position: absolute; top:95px; width:960px; height:410px;">
                    <line id="start_line" x1="10" y1="0" x2="10" y2="960" style="stroke:rgb(255,0,0);stroke-width:3;" />
                    </svg>
        </div>
      </section>
    </div>
  </body>

</html>

和javascript:

function placeLine(e) {
  var d = document.getElementById('start_line');

  posY = e.clientY;
  posX = e.clientX;
  d.setAttribute("y1", posY)
  d.setAttribute("x1", posX)
}

document.addEventListener("click", placeLine);

我想做的是让红线的顶部在绿色框上方移动到鼠标 x,y 位置。线的底部不应移动。然而,每次点击容器都会改变并移动整条线。您还可以看到鼠标 x、y 和直线的偏移量存在一些问题。唯一的限制是该线需要能够叠加在具有绿色边界的容器顶部。

执行此操作的最佳方法是什么?谢谢。

最佳答案

关于 x2 和 y2 属性,您混淆了高度和宽度。如果您将 y2 更改为等于您的高度 (410px),它应该开始更像您预期的那样工作。

参见:https://jsfiddle.net/zukrtpyg/ .

HTML:

<div id="canvas" style="width: 960px; height:410px; border: 4px solid lime;">
   <svg id="svgContainer" xmlns="http://www.w3.org/2000/svg" version="1.1" style="width:960px; height:410px;">
       <line id="start_line" x1="0" y1="0" x2="0" y2="410" style="stroke:rgb(255,0,0);stroke-width:3;" />
   </svg>
</div>

Javascript:

function placeLine(e) {
  var d = document.getElementById('start_line');

  posY = e.offsetY;
  posX = e.offsetX;
  d.setAttribute("y1", posY)
  d.setAttribute("x1", posX)
}

document.getElementById('canvas').addEventListener("click", placeLine);

我还删除了 Canvas 元素上的顶部和位置声明,这些声明导致线条延伸超过底部的绿色边框。

最后,我将点击监听器更改为在 Canvas 元素上,这样您就可以使用事件的 offsetX 和 offsetY 来定位与 Canvas 元素相关的线,这就是路径坐标映射到的位置首先。

使用 clientX 和 clientY 位置尝试将其放置在与页面相关的位置,这与您希望它在 Canvas 上的位置不一致。

实际上您仍然可以使用 clientX 和 clientY 位置,您只需补偿 Canvas 元素相对于页面的 x 和 y 位置。您可以使用 Element.getBoundingClientRect() 找到这些.参见 https://jsfiddle.net/th0aLcx0/举个例子。

关于javascript - HTML 和 SVG 如何用鼠标单击只移动一条线的一个端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50205021/

相关文章:

javascript - 动态添加时 onclick 事件不起作用

javascript - 类型错误 : Cannot read property 'setZoomLevelLimits' of undefined

javascript - 如何显示图像并在 5 秒后隐藏它?

jquery - 单击一个时如何关闭其他 Accordion ,以及如何在隐藏父级时隐藏描述?

html - 清除两个在 css 中的第一个 child 的高度

javascript - 打印按钮无法在 javascript 上打印页面内容

JavaScript 函数浏览器兼容性

javascript - 如何创建链接以预选表单选项

javascript - 单击外部 div 以关闭 div

html - 发送到另一个容器时删除属性元素