如何根据鼠标位置操作svg



我有一个SVG眼睛图像。我想让虹膜和瞳孔根据鼠标的位置在眼球周围移动。我已经有了这个:

html:中的SVG

const leftPupil = document.getElementById("left-pupil");
document.addEventListener("mousemove", function(e){
let x = e.clientX;
let y = e.clientY;
leftPupil.setAttribute('transform', `translate(-${x},-${y})`);
});
<svg id="face" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1152.31 1075.95">
<defs><style>.cls-1,.cls-10,.cls-2,.cls-9{fill:none;stroke:#fff;}.cls-1,.cls-10,.cls-11,.cls-2,.cls-9{stroke-miterlimit:10;}.cls-1,.cls-11,.cls-12,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7,.cls-8,.cls-9{fill-rule:evenodd;}.cls-3{fill:#1a52db;}.cls-4{fill:#223992;}.cls-5{fill:#fff;}.cls-6{fill:#fd5219;}.cls-8{fill:#d63319;}.cls-10,.cls-9{stroke-width:2px;}.cls-11{fill:#feae00;stroke:#feae00;}.cls-12{fill:#f15a24;}
</style></defs>
<g id="left-eye">
<path id="left-white" class="cls-5" d="M626,288.2a4.6,4.6,0,0,0,1.4,3c5.73,6.09,26.18,28.7,46.41,34.32a228.21,228.21,0,0,0,48.8,8.12s32.21-2.36,49.31-8.5,34.19-12.28,39.36-15.45.4-13.29.4-13.29S788.13,270,765.4,261.78c-15.06-5.44-25-10.73-53.78-11.59-15-.45-38.06,4.59-56.21,13.28-11.35,5.44-20,13.24-25.94,19.18C626.71,285.4,626.08,286.72,626,288.2Z" transform="translate(-415.19 -6.14)"/>
<path id="left-iris" class="cls-3" d="M676.54,281.74s7.91-29.74,39.16-37.39,47.08,28.14,47.08,28.14,1.62,18.56-2.78,27.65S747.38,322.89,738.26,325c-3.87.89-16.62,2.76-27.28-.82-14.45-4.86-27.27-16.13-29.63-19.59C677.14,298.4,676,287.94,676.54,281.74Z" transform="translate(-415.19 -6.14)"/>
<path id="left-pupil" class="cls-7" d="M710.77,295.47c-3.51-5.52-5.1-13.7-3.19-16.35s7.64-9.7,13.15-9.54,17.26,3.21,18.82,14.89a2.11,2.11,0,0,1,0,.26c.1,1.13,1.14,9.85-2.22,12.44-5.64,4.35-13,3.22-13,3.22S713.2,299.3,710.77,295.47Z" transform="translate(-415.19 -6.14)"/>
</g>
</svg>

瞳孔在移动,但我不知道如何让它只在特定的区域(眼球(上移动。

  1. 您已经在初始放置的路径上使用了变换。建议将其封装在g中,并将变换移动到那里
  2. 可以使用atan2确定指针到眼球的角度,然后使用单位圆设置右侧变换

const leftPupil = document.getElementById("left-pupil");
document.addEventListener("mousemove", function(e){
let x = e.clientX;
let y = e.clientY;
const pupilRect = leftPupil.getBoundingClientRect();
const radius = 8;
const angle = Math.atan2(y-pupilRect.top,x-pupilRect.left)+Math.PI;
leftPupil.setAttribute('transform', `translate(${-radius*Math.cos(angle)},${-radius*Math.sin(angle)})`);
});
<svg viewBox="0 0 500 500" width="200" height="200">
<g id="left-eye">
<path id="left-white" class="cls-5" fill="white" stroke="black" stroke-width="3" d="M626,288.2a4.6,4.6,0,0,0,1.4,3c5.73,6.09,26.18,28.7,46.41,34.32a228.21,228.21,0,0,0,48.8,8.12s32.21-2.36,49.31-8.5,34.19-12.28,39.36-15.45.4-13.29.4-13.29S788.13,270,765.4,261.78c-15.06-5.44-25-10.73-53.78-11.59-15-.45-38.06,4.59-56.21,13.28-11.35,5.44-20,13.24-25.94,19.18C626.71,285.4,626.08,286.72,626,288.2Z" transform="translate(-415.19 -6.14)"/>
<path id="left-iris" class="cls-3" d="M676.54,281.74s7.91-29.74,39.16-37.39,47.08,28.14,47.08,28.14,1.62,18.56-2.78,27.65S747.38,322.89,738.26,325c-3.87.89-16.62,2.76-27.28-.82-14.45-4.86-27.27-16.13-29.63-19.59C677.14,298.4,676,287.94,676.54,281.74Z"
fill="brown" stroke="black" stroke-width="3" 
transform="translate(-415.19 -6.14)"/>
<g transform="translate(-415.19 -6.14)">
<path id="left-pupil" class="cls-7" d="M710.77,295.47c-3.51-5.52-5.1-13.7-3.19-16.35s7.64-9.7,13.15-9.54,17.26,3.21,18.82,14.89a2.11,2.11,0,0,1,0,.26c.1,1.13,1.14,9.85-2.22,12.44-5.64,4.35-13,3.22-13,3.22S713.2,299.3,710.77,295.47Z" />
</g>
</g>
</svg>

您需要从中心偏移https://codepen.io/NourimoS/pen/ZEBgXOY看看这支钢笔

const Pupil = document.getElementById("pupil");
const Pupil2 = document.getElementById("pupil2");
const svg = document.querySelector("svg");
const { x, y, width, height } = svg.getBBox();
const cx = width / 2,
cy = height / 2;
document.addEventListener("mousemove", function ({ clientX: x, clientY: y }) {
const tx = ((cx - x) / cx) * 200,
ty = ((cy - y) / cy) * 100;
pupil.setAttribute("transform", `translate(${tx},${ty})`);
pupil2.setAttribute("transform", `translate(${tx * 0.8},${ty * 0.8})`);
});

最新更新