Вы перепутали высоту и ширину в отношении свойств 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);
Я также удалил объявления top и position в элементе canvas, из-за которых линия проходила за зеленую границу снизу.
Наконец, я изменил прослушиватель кликов на элементе canvas, чтобы вы могли использовать offsetX и offsetY событий, чтобы расположить линию по отношению к элементу canvas, которому и сопоставлены координаты пути. на первом месте.
Использование позиций clientX и clientY пытается разместить ее относительно страницы, которая не соответствует той позиции, на которой вы хотите, чтобы она находилась на холсте.
На самом деле вы все еще можете использовать позиции clientX и clientY, вам просто нужно компенсировать их положением x и y элемента canvas по отношению к странице. Вы можете узнать их, используя Element.getBoundingClientRect () . См. https://jsfiddle.net/th0aLcx0/ для примера.