英文:
Is there a way to draw a line between two points on a HTML page without Canvas?
问题
I'm designing a web interface for a robotic arm, and I need a way to draw lines between points in an HTML div
element, given a start (x, y)
and an end (x, y)
. I'd rather not use a canvas because I need the lines to be elements themselves (They should have onclick
events and CSS styles). Maybe something with SVG? Note that this is different from questions like this, as that question was trying to connect elements, whereas I'm trying to connect points inside an element.
<div id="somediv">
<!--This div is 100px * 100px, I need to draw a line 4px thick from (23, 24) to (87, 96)-->
</div>
It would actually be preferable if I could create the line based on a single point and angle, but the math to convert that to two points is easy.
英文:
I'm designing a web interface for a robotic arm, and I need a way to draw lines between points in a HTML div
element, given a start (x, y)
and a end (x, y)
. I'd rather not use a canvas, because I need the lines to be elements themselves (They should have onclick
events and CSS styles). Maybe something with SVG? Note that this is different from questions like this, as that question was trying to connect elements, whereas I'm trying to connect points inside an element.
<div id="somediv">
<!--This div is 100px * 100px, I need to draw a line 4px thick from (23, 24) to (87, 96)-->
</div>
It would actually be preferable if I could create the line based on a single point and angle, but the math to convert that to two points is easy.
答案1
得分: 3
以下是翻译好的内容:
基本思想是将SVG放在DIV元素上方,将DIV的位置设为相对,SVG的位置设为绝对。然后,您可以将SVG绘制到任何您喜欢的x/y点。
而且如预期的那样,像点击这样的事件可以与SVG一起工作,尝试点击线条,双击黄色框。
示例:
<div id="somediv">
<!-- 这个div是100x100像素,我需要从(23, 24)到(87, 96)绘制一条4像素宽的线条 -->
<svg id="svg" width="100" height="100">
<line
style="cursor:pointer"
id="theline"
x1="23" y1="24" x2="87" y2="96" stroke="black" stroke-width="4"/>
</svg>
</div>
英文:
The basic idea here is to place the SVG on top of the DIV element, make the DIV position relative, and the SVG absolute to do this. And then you can draw the SVG to any x/y point you like.
And as expected, events like click work with SVG, try clicking the line, and double clicking the yellow box.
example ->
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
document.querySelector('#theline').
addEventListener('click',
() => alert("line clicked"));
document.querySelector('#somediv').
addEventListener('dblclick',
() => alert('box double clicked'));
<!-- language: lang-css -->
#somediv {
width: 100px;
height: 100px;
background-color: yellow;
position: relative;
}
#svg {
position: absolute;
top: 0px;
left: 0px;
}
<!-- language: lang-html -->
<div id="somediv">
<!--This div is 100px * 100px, I need to draw a line 4px thick from (23, 24) to (87, 96)-->
<svg id="svg" width="100" height="100">
<line
style="cursor:pointer"
id="theline"
x1="23" y1="24" x2="87" y2="96" stroke="black" stroke-width="4"/>
</svg>
</div>
<!-- end snippet -->
答案2
得分: 0
I modified @Keith's answer, making it into a function that draws a line between given points in an element:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
function drawLine(x1, y1, x2, y2, line_class, element=document.documentElement) {
element.innerHTML += `<svg><line class=${line_class} x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}"/></svg>`
}
drawLine(20, 25, 89, 78, "line", document.getElementById("adiv"))
<!-- language: lang-css -->
.line {
stroke-width: 5px;
stroke: black;
}
#adiv {
height: 100px;
width: 100px;
background-color: blue;
}
<!-- language: lang-html -->
<div id="adiv">
</div>
<!-- end snippet -->
英文:
I modified @Keith's answer, making it into a function that draws a line between given points in a element:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
function drawLine(x1, y1, x2, y2, line_class, element=document.documentElement) {
element.innerHTML += `<svg><line class=${line_class} x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}"/></svg>`
}
drawLine(20, 25, 89, 78, "line", document.getElementById("adiv"))
<!-- language: lang-css -->
.line {
stroke-width: 5px;
stroke: black;
}
#adiv {
height: 100px;
width: 100px;
background-color: blue;
}
<!-- language: lang-html -->
<div id="adiv">
</div>
<!-- end snippet -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论