Sunday, June 2, 2024
 Popular · Latest · Hot · Upcoming
145
rated 0 times [  147] [ 2]  / answers: 1 / hits: 34473  / 9 Years ago, wed, march 25, 2015, 12:00:00

I haven't been able to calculate the click coordinates (x and y) relative to the element triggering the event. I have not found an easy example online.



I have a simple svg (with 100px left margin) in an HTML page. It contains a group (translated 30px 30px) which has an onclick listener attached. And inside that group I have a rect with 50px width and height.



After I click any part of the group element, I get an event object with coordinates relative to the HTML page (evt.clientX and evt.clientY).



What I need to know is where exactly the user clicked inside the group element (the element holding the onclick listener).



How do I convert clientX and clientY coordinates to the group element coordinates. So say, if I click the top leftmost part of the rect it should give me x=0 and y=0.



Here is currently what I have:





<!DOCTYPE html>
<html>
<head>
<style>
body{
background:black;
}
svg{
fill:white;
background:white;
position: absolute;
top:100px;
left:100px;
}

</style>
<script>
function clicked(evt){
alert(x: +evt.clientX+ y:+evt.clientY);
}
</script>
</head>
<body>
<div>
<svg xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink width=200 height=200>
<g transform=translate(30 30) onclick=clicked(evt)>
<rect x=0 y=0 width=50 height=50 fill=red/>
</g>
</svg>
</div>
</body>
</html>




More From » html

 Answers
136

Try to use getBoundingClientRect(): http://jsfiddle.net/fLo4uatw/



function clicked(evt){
var e = evt.target;
var dim = e.getBoundingClientRect();
var x = evt.clientX - dim.left;
var y = evt.clientY - dim.top;
alert(x: +x+ y:+y);
}

[#67315] Monday, March 23, 2015, 9 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
hailey

Total Points: 355
Total Questions: 91
Total Answers: 91

Location: India
Member since Wed, Aug 4, 2021
3 Years ago
;