При mousemove
вы сбрасываете атрибуты cx
и cy
круга.Я надеюсь, что это то, что вы спрашивали.
//on `mousemove` you reset the `cx` and `cy` attributes of the circle
svg.addEventListener("mousemove",(e)=>{
let m = oMousePosSVG(e)
c.setAttributeNS(null,"cx",m.x)
c.setAttributeNS(null,"cy",m.y)
})
// a function to get the position of the mouse over the svg canvas
function oMousePosSVG(e) {
var p = svg.createSVGPoint();
p.x = e.clientX;
p.y = e.clientY;
var ctm = svg.getScreenCTM().inverse();
var p = p.matrixTransform(ctm);
return p;
}
svg{background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/222579/darwin300.jpg); background-size:cover}
<svg id="svg" viewBox="0 0 300 300">
<defs>
<mask id="hole">
<rect width="100%" height="100%" fill="#fff"/>
<g id="my_mask">
<circle id="c" r="50" cx="100" cy="100" fill="#000"/>
</g>
</mask>
</defs>
<rect fill="#00f" width="100%" height="100%" mask="url(#hole)" />
</svg>
ОБНОВЛЕНИЕ
Вы не можете прикрепить событие к маске, однако вы можете использовать круг внутри маски и прикрепить событие киспользование, как я делаю в следующем примере:
В этом примере я использую событие mousedown
, но вы вместо этого используете mouseover
.
let m,dx,dy;
let dragging = false;
theUse.addEventListener("mousedown",(e)=>{
m = oMousePosSVG(e);
dx = Number(c.getAttribute("cx")) - m.x;
dy = Number(c.getAttribute("cy")) - m.y;
dragging = true;
})
svg.addEventListener("mouseup",(e)=>{
dragging = false;
})
svg.addEventListener("mousemove",(e)=>{
if(dragging){
m = oMousePosSVG(e)
c.setAttributeNS(null,"cx",m.x + dx)
c.setAttributeNS(null,"cy",m.y + dy)
}
})
function oMousePosSVG(e) {
var p = svg.createSVGPoint();
p.x = e.clientX;
p.y = e.clientY;
var ctm = svg.getScreenCTM().inverse();
var p = p.matrixTransform(ctm);
return p;
}
svg{background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/222579/darwin300.jpg); background-size:cover}
<svg id="svg" viewBox="0 0 300 300">
<defs>
<mask id="hole">
<rect width="100%" height="100%" fill="#fff"/>
<g id="my_mask">
<circle id="c" r="50" cx="100" cy="100" />
</g>
</mask>
</defs>
<rect fill="#00f" width="100%" height="100%" mask="url(#hole)" />
<use id="theUse" xlink:href="#c" fill="none" pointer-events="all" />
</svg>