Reputation: 333
I have a set of svg
elements that I animate on mousemove
event. Everything works fine if the svg
element is original size,i.e., same as the viewBox
.
HTML:
<svg...viewBox="0 0 550 550">...</svg>
CSS:
svg {
width: 550px;
height: 550px;
}
Code Snippet:
var svg = document.querySelector('#svg-logo'),
ticks = document.querySelectorAll('.tick'),
marker = document.querySelector('#marker'),
defPos = [0, -5, -20, -50, -20, -5, 0],
precentage = [0, 10, 40, 100, 40, 10, 0],
snapTheta = [0, 9, 18, 27, 18, 9, 0],
calcPos = new Array(),
range = 27,
currRange = new Array(),
frag = 360 / ticks.length,
offset = 55,
i = 0,
r = 220,
center = 275,
posX,
posY,
mouseX,
mouseY,
logoX = svg.getBoundingClientRect().left,
logoY = svg.getBoundingClientRect().top,
relTheta,
absTheta,
quad;
function defaultPosition() {
resetPosition();
for (var i = 1; i < 6; i++) {
ticks[i].setAttribute('transform', ticks[i].getAttribute('transform') + ' translate(0, ' + defPos[i-1] + ')');
}
}
function resetPosition() {
ticks.forEach(function(el, _) {
var v = el.getAttribute('transform');
var reg = /\stranslate\(0\,\s?\-\d+\.?\d*\)/g;
el.setAttribute('transform', el.getAttribute('transform').replace(reg, ''))
});
}
function findQuadrant(x, y) {
quad = (x > center && y <= center) ? 1 : (x >= center && y > center) ? 2 : (x < center && y >= center) ? 3 : 4;
}
function calculateRange() {
var n,
positions = new Array();
currRange.push((absTheta < range) ? 360 + (absTheta - range) : (absTheta - range));
currRange.push((absTheta > (360 - range)) ? range - (360 - absTheta) : absTheta + range);
}
function calculatePosition(a) {
var tickTheta, pos, diff = new Array(), difference;
calcPos = [];
difference = -(absTheta - (frag * a[3]));
difference = (difference == -360) ? 0 : (difference < -333) ? -(360 + difference) : -difference;
for (var i = 0; i < a.length; i++) {
calcPos[i] = (i == 0 || i == a.length - 1) ? 0 : ((snapTheta[i] - Math.abs(difference)) * defPos[i]) / snapTheta[i]
}
}
function applyTransform() {
var prev1, next1, prev2, next2, prev3, next3, currTickIndexes;
calculateRange();
n = Math.round(absTheta / frag);
n = (n == 40) ? 0 : n
ticks.forEach(function(el, _) {
el.setAttribute('fill', '#000')
});
prev1 = (n == 0) ? ticks.length - 1 : n - 1;
next1 = (n == ticks.length - 1) ? 0 : n + 1;
prev2 = (n == 0) ? ticks.length - 2 : (n == 1) ? ticks.length - 1 : n - 2;
next2 = (n == ticks.length - 2) ? 0 : (n == ticks.length - 1) ? next1 + 1 : n + 2;
prev3 = (n == 0) ? ticks.length - 3 : (n == 1) ? ticks.length - 2 : (n == 2) ? ticks.length - 1 : n - 3;
next3 = (n == ticks.length - 2) ? 1 : (n == ticks.length - 1) ? next2 + 1 : (n == ticks.length - 2) ? next2 + 1 : n + 3;
currTickIndexes = [prev3, prev2, prev1, n, next1, next2, next3]
calculatePosition(currTickIndexes);
resetPosition();
ticks[n].setAttribute('transform', ticks[n].getAttribute('transform') + ' translate(0, ' + Math.min(...calcPos) + ')');
ticks[prev1].setAttribute('transform', ticks[prev1].getAttribute('transform') + ' translate(0, ' + calcPos[2] + ')');
ticks[next1].setAttribute('transform', ticks[next1].getAttribute('transform') + ' translate(0, ' + calcPos[4] + ')');
ticks[prev2].setAttribute('transform', ticks[prev2].getAttribute('transform') + ' translate(0, ' + calcPos[1] + ')');
ticks[next2].setAttribute('transform', ticks[next2].getAttribute('transform') + ' translate(0, ' + calcPos[5] + ')');
ticks[prev3].setAttribute('transform', ticks[prev3].getAttribute('transform') + ' translate(0, ' + calcPos[0] + ')');
ticks[next3].setAttribute('transform', ticks[next3].getAttribute('transform') + ' translate(0, ' + calcPos[6] + ')');
}
svg.addEventListener('mousemove', function(e) {
resetPosition();
mouseX = e.clientX - logoX;
mouseY = e.clientY - logoY;
findQuadrant(mouseX, mouseY);
posX = (mouseX > center) ? mouseX - center : (mouseX == center) ? mouseX - offset - r : -(mouseX - offset - r);
posY = (mouseY > center) ? mouseY - center : -(mouseY - offset - r);
relTheta = Math.atan(posY/posX) * (180/Math.PI);
absTheta = (quad == 1) ? 90 - relTheta : (quad == 2) ? 90 + relTheta : (quad == 3) ? 180 + (90 - relTheta) : 270 + relTheta;
applyTransform();
});
svg.addEventListener('mouseleave', function() {
defaultPosition();
});
body {
margin: 0;
}
svg {
width: 550px;
height: 550px;
background: #f00;
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg id="svg-logo" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 550 550">
<defs>
<path id="tick" d="M275,105 h-6 l-1.5,-50 h15 l-1.5,50" transform="rotate(0, 275, 275)" />
</defs>
<circle cx="275" cy="275" r="170" opacity=".5" />
<use xlink:href="#tick" class="tick" id="tick-0" transform="rotate(0, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-1" transform="rotate(9, 275, 275) translate(0, -5)" />
<use xlink:href="#tick" class="tick" id="tick-2" transform="rotate(18, 275, 275) translate(0, -20)" />
<use xlink:href="#tick" class="tick" id="tick-3" transform="rotate(27, 275, 275) translate(0, -50)" />
<use xlink:href="#tick" class="tick" id="tick-4" transform="rotate(36, 275, 275) translate(0, -20)" />
<use xlink:href="#tick" class="tick" id="tick-5" transform="rotate(45, 275, 275) translate(0, -5)" />
<use xlink:href="#tick" class="tick" id="tick-6" transform="rotate(54, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-7" transform="rotate(63, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-8" transform="rotate(72, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-9" transform="rotate(81, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-10" transform="rotate(90, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-11" transform="rotate(99, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-12" transform="rotate(108, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-13" transform="rotate(117, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-14" transform="rotate(126, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-15" transform="rotate(135, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-16" transform="rotate(144, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-17" transform="rotate(153, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-18" transform="rotate(162, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-19" transform="rotate(171, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-20" transform="rotate(180, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-21" transform="rotate(189, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-22" transform="rotate(197, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-23" transform="rotate(206, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-24" transform="rotate(215, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-25" transform="rotate(224, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-26" transform="rotate(233, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-27" transform="rotate(242, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-28" transform="rotate(251, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-29" transform="rotate(260, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-30" transform="rotate(269, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-31" transform="rotate(278, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-32" transform="rotate(287, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-33" transform="rotate(296, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-34" transform="rotate(305, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-35" transform="rotate(314, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-36" transform="rotate(323, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-37" transform="rotate(332, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-38" transform="rotate(341, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-39" transform="rotate(350, 275, 275)" />
</svg>
However, when I resize the svg
, the mouse event is out of place.
CSS:
svg {
width: 450px;
height: 450px;
}
Code Snippet:
var svg = document.querySelector('#svg-logo'),
ticks = document.querySelectorAll('.tick'),
marker = document.querySelector('#marker'),
defPos = [0, -5, -20, -50, -20, -5, 0],
precentage = [0, 10, 40, 100, 40, 10, 0],
snapTheta = [0, 9, 18, 27, 18, 9, 0],
calcPos = new Array(),
range = 27,
currRange = new Array(),
frag = 360 / ticks.length,
offset = 55,
i = 0,
r = 220,
center = 275,
posX,
posY,
mouseX,
mouseY,
logoX = svg.getBoundingClientRect().left,
logoY = svg.getBoundingClientRect().top,
relTheta,
absTheta,
quad;
function defaultPosition() {
resetPosition();
for (var i = 1; i < 6; i++) {
ticks[i].setAttribute('transform', ticks[i].getAttribute('transform') + ' translate(0, ' + defPos[i-1] + ')');
}
}
function resetPosition() {
ticks.forEach(function(el, _) {
var v = el.getAttribute('transform');
var reg = /\stranslate\(0\,\s?\-\d+\.?\d*\)/g;
el.setAttribute('transform', el.getAttribute('transform').replace(reg, ''))
});
}
function findQuadrant(x, y) {
quad = (x > center && y <= center) ? 1 : (x >= center && y > center) ? 2 : (x < center && y >= center) ? 3 : 4;
}
function calculateRange() {
var n,
positions = new Array();
currRange.push((absTheta < range) ? 360 + (absTheta - range) : (absTheta - range));
currRange.push((absTheta > (360 - range)) ? range - (360 - absTheta) : absTheta + range);
}
function calculatePosition(a) {
var tickTheta, pos, diff = new Array(), difference;
calcPos = [];
difference = -(absTheta - (frag * a[3]));
difference = (difference == -360) ? 0 : (difference < -333) ? -(360 + difference) : -difference;
for (var i = 0; i < a.length; i++) {
calcPos[i] = (i == 0 || i == a.length - 1) ? 0 : ((snapTheta[i] - Math.abs(difference)) * defPos[i]) / snapTheta[i]
}
}
function applyTransform() {
var prev1, next1, prev2, next2, prev3, next3, currTickIndexes;
calculateRange();
n = Math.round(absTheta / frag);
n = (n == 40) ? 0 : n
ticks.forEach(function(el, _) {
el.setAttribute('fill', '#000')
});
prev1 = (n == 0) ? ticks.length - 1 : n - 1;
next1 = (n == ticks.length - 1) ? 0 : n + 1;
prev2 = (n == 0) ? ticks.length - 2 : (n == 1) ? ticks.length - 1 : n - 2;
next2 = (n == ticks.length - 2) ? 0 : (n == ticks.length - 1) ? next1 + 1 : n + 2;
prev3 = (n == 0) ? ticks.length - 3 : (n == 1) ? ticks.length - 2 : (n == 2) ? ticks.length - 1 : n - 3;
next3 = (n == ticks.length - 2) ? 1 : (n == ticks.length - 1) ? next2 + 1 : (n == ticks.length - 2) ? next2 + 1 : n + 3;
currTickIndexes = [prev3, prev2, prev1, n, next1, next2, next3]
calculatePosition(currTickIndexes);
resetPosition();
ticks[n].setAttribute('transform', ticks[n].getAttribute('transform') + ' translate(0, ' + Math.min(...calcPos) + ')');
ticks[prev1].setAttribute('transform', ticks[prev1].getAttribute('transform') + ' translate(0, ' + calcPos[2] + ')');
ticks[next1].setAttribute('transform', ticks[next1].getAttribute('transform') + ' translate(0, ' + calcPos[4] + ')');
ticks[prev2].setAttribute('transform', ticks[prev2].getAttribute('transform') + ' translate(0, ' + calcPos[1] + ')');
ticks[next2].setAttribute('transform', ticks[next2].getAttribute('transform') + ' translate(0, ' + calcPos[5] + ')');
ticks[prev3].setAttribute('transform', ticks[prev3].getAttribute('transform') + ' translate(0, ' + calcPos[0] + ')');
ticks[next3].setAttribute('transform', ticks[next3].getAttribute('transform') + ' translate(0, ' + calcPos[6] + ')');
}
svg.addEventListener('mousemove', function(e) {
resetPosition();
mouseX = e.clientX - logoX;
mouseY = e.clientY - logoY;
findQuadrant(mouseX, mouseY);
posX = (mouseX > center) ? mouseX - center : (mouseX == center) ? mouseX - offset - r : -(mouseX - offset - r);
posY = (mouseY > center) ? mouseY - center : -(mouseY - offset - r);
relTheta = Math.atan(posY/posX) * (180/Math.PI);
absTheta = (quad == 1) ? 90 - relTheta : (quad == 2) ? 90 + relTheta : (quad == 3) ? 180 + (90 - relTheta) : 270 + relTheta;
applyTransform();
});
svg.addEventListener('mouseleave', function() {
defaultPosition();
});
body {
margin: 0;
}
svg {
width: 450px;
height: 450px;
background: #f00;
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg id="svg-logo" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 550 550">
<defs>
<path id="tick" d="M275,105 h-6 l-1.5,-50 h15 l-1.5,50" transform="rotate(0, 275, 275)" />
</defs>
<circle cx="275" cy="275" r="170" opacity=".5" />
<use xlink:href="#tick" class="tick" id="tick-0" transform="rotate(0, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-1" transform="rotate(9, 275, 275) translate(0, -5)" />
<use xlink:href="#tick" class="tick" id="tick-2" transform="rotate(18, 275, 275) translate(0, -20)" />
<use xlink:href="#tick" class="tick" id="tick-3" transform="rotate(27, 275, 275) translate(0, -50)" />
<use xlink:href="#tick" class="tick" id="tick-4" transform="rotate(36, 275, 275) translate(0, -20)" />
<use xlink:href="#tick" class="tick" id="tick-5" transform="rotate(45, 275, 275) translate(0, -5)" />
<use xlink:href="#tick" class="tick" id="tick-6" transform="rotate(54, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-7" transform="rotate(63, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-8" transform="rotate(72, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-9" transform="rotate(81, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-10" transform="rotate(90, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-11" transform="rotate(99, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-12" transform="rotate(108, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-13" transform="rotate(117, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-14" transform="rotate(126, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-15" transform="rotate(135, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-16" transform="rotate(144, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-17" transform="rotate(153, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-18" transform="rotate(162, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-19" transform="rotate(171, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-20" transform="rotate(180, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-21" transform="rotate(189, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-22" transform="rotate(197, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-23" transform="rotate(206, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-24" transform="rotate(215, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-25" transform="rotate(224, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-26" transform="rotate(233, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-27" transform="rotate(242, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-28" transform="rotate(251, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-29" transform="rotate(260, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-30" transform="rotate(269, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-31" transform="rotate(278, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-32" transform="rotate(287, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-33" transform="rotate(296, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-34" transform="rotate(305, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-35" transform="rotate(314, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-36" transform="rotate(323, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-37" transform="rotate(332, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-38" transform="rotate(341, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-39" transform="rotate(350, 275, 275)" />
</svg>
I understand this is caused by the mismatch from resizing. I tried scaling the mouse position according to the new width and height.
mouseX = (e.clientX - logoX) * (newW / origW);
mouseY = (e.clientY - logoY) * (newH / origH);
But it does not seem to work. How could I fix this issue? Any help would be appreciated.
Upvotes: 1
Views: 164
Reputation: 33034
I see you are using Math.atan
instead of Math.atan2
and this is forcing you to find the quadrant and is complicating your code.
Next comes your code where I've added a function to detect the mouse position on a resized SVG canvas. I hope this is what you need.
var svg = document.querySelector('#svg-logo'),
ticks = document.querySelectorAll('.tick'),
marker = document.querySelector('#marker'),
defPos = [0, -5, -20, -50, -20, -5, 0],
precentage = [0, 10, 40, 100, 40, 10, 0],
snapTheta = [0, 9, 18, 27, 18, 9, 0],
calcPos = new Array(),
range = 27,
currRange = new Array(),
frag = 360 / ticks.length,
offset = 55,
i = 0,
r = 220,
center = 275,
posX,
posY,
mouseX,
mouseY,
logoX = svg.getBoundingClientRect().left,
logoY = svg.getBoundingClientRect().top,
relTheta,
absTheta,
quad;
function defaultPosition() {
resetPosition();
for (var i = 1; i < 6; i++) {
ticks[i].setAttribute('transform', ticks[i].getAttribute('transform') + ' translate(0, ' + defPos[i-1] + ')');
}
}
function resetPosition() {
ticks.forEach(function(el, _) {
var v = el.getAttribute('transform');
var reg = /\stranslate\(0\,\s?\-\d+\.?\d*\)/g;
el.setAttribute('transform', el.getAttribute('transform').replace(reg, ''))
});
}
function findQuadrant(x, y) {
quad = (x > center && y <= center) ? 1 : (x >= center && y > center) ? 2 : (x < center && y >= center) ? 3 : 4;
}
function calculateRange() {
var n,
positions = new Array();
currRange.push((absTheta < range) ? 360 + (absTheta - range) : (absTheta - range));
currRange.push((absTheta > (360 - range)) ? range - (360 - absTheta) : absTheta + range);
}
function calculatePosition(a) {
var tickTheta, pos, diff = new Array(), difference;
calcPos = [];
difference = -(absTheta - (frag * a[3]));
difference = (difference == -360) ? 0 : (difference < -333) ? -(360 + difference) : -difference;
for (var i = 0; i < a.length; i++) {
calcPos[i] = (i == 0 || i == a.length - 1) ? 0 : ((snapTheta[i] - Math.abs(difference)) * defPos[i]) / snapTheta[i]
}
}
function applyTransform() {
var prev1, next1, prev2, next2, prev3, next3, currTickIndexes;
calculateRange();
n = Math.round(absTheta / frag);
n = (n == 40) ? 0 : n
ticks.forEach(function(el, _) {
el.setAttribute('fill', '#000')
});
prev1 = (n == 0) ? ticks.length - 1 : n - 1;
next1 = (n == ticks.length - 1) ? 0 : n + 1;
prev2 = (n == 0) ? ticks.length - 2 : (n == 1) ? ticks.length - 1 : n - 2;
next2 = (n == ticks.length - 2) ? 0 : (n == ticks.length - 1) ? next1 + 1 : n + 2;
prev3 = (n == 0) ? ticks.length - 3 : (n == 1) ? ticks.length - 2 : (n == 2) ? ticks.length - 1 : n - 3;
next3 = (n == ticks.length - 2) ? 1 : (n == ticks.length - 1) ? next2 + 1 : (n == ticks.length - 2) ? next2 + 1 : n + 3;
currTickIndexes = [prev3, prev2, prev1, n, next1, next2, next3]
calculatePosition(currTickIndexes);
resetPosition();
ticks[n].setAttribute('transform', ticks[n].getAttribute('transform') + ' translate(0, ' + Math.min(...calcPos) + ')');
ticks[prev1].setAttribute('transform', ticks[prev1].getAttribute('transform') + ' translate(0, ' + calcPos[2] + ')');
ticks[next1].setAttribute('transform', ticks[next1].getAttribute('transform') + ' translate(0, ' + calcPos[4] + ')');
ticks[prev2].setAttribute('transform', ticks[prev2].getAttribute('transform') + ' translate(0, ' + calcPos[1] + ')');
ticks[next2].setAttribute('transform', ticks[next2].getAttribute('transform') + ' translate(0, ' + calcPos[5] + ')');
ticks[prev3].setAttribute('transform', ticks[prev3].getAttribute('transform') + ' translate(0, ' + calcPos[0] + ')');
//ticks[next3].setAttribute('transform', ticks[next3].getAttribute('transform') + ' translate(0, ' + calcPos[6] + ')');
}
svg.addEventListener('mousemove', function(e) {
resetPosition();
let _m = oMousePosSVG(svg, e);
mouseX = _m.x;
mouseY = _m.y;
findQuadrant(mouseX, mouseY);
posX = (mouseX > center) ? mouseX - center : (mouseX == center) ? mouseX - offset - r : -(mouseX - offset - r);
posY = (mouseY > center) ? mouseY - center : -(mouseY - offset - r);
relTheta = Math.atan(posY/posX) * (180/Math.PI);
absTheta = (quad == 1) ? 90 - relTheta : (quad == 2) ? 90 + relTheta : (quad == 3) ? 180 + (90 - relTheta) : 270 + relTheta;
applyTransform();
});
svg.addEventListener('mouseleave', function() {
defaultPosition();
});
function oMousePosSVG(svg,evento) {
var p = svg.createSVGPoint();
p.x = evento.clientX;
p.y = evento.clientY;
var ctm = svg.getScreenCTM().inverse();
var p = p.matrixTransform(ctm);
return p;
}
body {
margin: 0;
}
svg {
width: 450px;
height: 450px;
background: #f00;
}
<svg id="svg-logo" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 550 550">
<defs>
<path id="tick" d="M275,105 h-6 l-1.5,-50 h15 l-1.5,50" transform="rotate(0, 275, 275)" />
</defs>
<circle cx="275" cy="275" r="170" opacity=".5" />
<use xlink:href="#tick" class="tick" id="tick-0" transform="rotate(0, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-1" transform="rotate(9, 275, 275) translate(0, -5)" />
<use xlink:href="#tick" class="tick" id="tick-2" transform="rotate(18, 275, 275) translate(0, -20)" />
<use xlink:href="#tick" class="tick" id="tick-3" transform="rotate(27, 275, 275) translate(0, -50)" />
<use xlink:href="#tick" class="tick" id="tick-4" transform="rotate(36, 275, 275) translate(0, -20)" />
<use xlink:href="#tick" class="tick" id="tick-5" transform="rotate(45, 275, 275) translate(0, -5)" />
<use xlink:href="#tick" class="tick" id="tick-6" transform="rotate(54, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-7" transform="rotate(63, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-8" transform="rotate(72, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-9" transform="rotate(81, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-10" transform="rotate(90, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-11" transform="rotate(99, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-12" transform="rotate(108, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-13" transform="rotate(117, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-14" transform="rotate(126, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-15" transform="rotate(135, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-16" transform="rotate(144, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-17" transform="rotate(153, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-18" transform="rotate(162, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-19" transform="rotate(171, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-20" transform="rotate(180, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-21" transform="rotate(189, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-22" transform="rotate(197, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-23" transform="rotate(206, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-24" transform="rotate(215, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-25" transform="rotate(224, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-26" transform="rotate(233, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-27" transform="rotate(242, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-28" transform="rotate(251, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-29" transform="rotate(260, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-30" transform="rotate(269, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-31" transform="rotate(278, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-32" transform="rotate(287, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-33" transform="rotate(296, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-34" transform="rotate(305, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-35" transform="rotate(314, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-36" transform="rotate(323, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-37" transform="rotate(332, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-38" transform="rotate(341, 275, 275)" />
<use xlink:href="#tick" class="tick" id="tick-39" transform="rotate(350, 275, 275)" />
</svg>
Upvotes: 2