我决定制作这样的效果(“现场”示例):
目标:我有三个元素,我希望这个事件(如上所示)在每个元素上触发。尝试了一个循环,但都是徒劳的。
var el = document.querySelector('.magnetic-button');
var options = {
ease: 0.1,
magneticForce: 0.6
};
var mouse = {
x: 0,
y: 0
};
var pos = {
cx: 0,
cy: 0,
tx: 0,
ty: 0,
x: 0,
y: 0
};
var sizes = el.getBoundingClientRect();
observe();
update();
function observe() {
window.addEventListener('resize', resizeHandler, false);
el.addEventListener('mousemove', mouseMoveHandler, false);
el.addEventListener('mouseleave', mouseLeaveHandler, false);
}
function resizeHandler() {
sizes = el.getBoundingClientRect();
}
function mouseMoveHandler(e) {
//sizes
mouse.x = e.pageX;
mouse.y = e.pageY;
// center
pos.cx = sizes.left + sizes.width / 2;
pos.cy = sizes.top + sizes.height / 2;
// dist
var distX = mouse.x - sizes.left - sizes.width / 2;
var distY = mouse.y - sizes.top - sizes.height / 2;
pos.tx = distX - distX * (1 - options.magneticForce);
pos.ty = distY - distY * (1 - options.magneticForce);
}
function mouseLeaveHandler(e) {
pos.tx = 0;
pos.ty = 0;
}
function render() {
pos.x += (pos.tx - pos.x) * options.ease;
pos.y += (pos.ty - pos.y) * options.ease;
var transform2 = 'translateX(' + pos.x + 'px) translateY(' + pos.y + 'px)';
el.style.webkitTransform = transform2;
el.style.MozTransform = transform2;
el.style.msTransform = transform2;
el.style.OTransform = transform2;
el.style.transform = transform2;
}
function update() {
render();
window.requestAnimationFrame(update);
}
.social-nets {
display: flex;
}
.magnetic-button {
margin-left: 1rem;
position: relative;
width: 3.3333333333rem;
height: 3.3333333333rem;
background-color: #b3b3b3;
color: rgba(0, 0, 0, 0.8);
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
}
.magnetic-button::before,
.magnetic-button:after {
content: "";
position: absolute;
width: 100%;
height: 100%;
border-radius: 50%;
transition: transform 800ms cubic-bezier(0.19, 1, 0.22, 1) 0ms;
will-change: transform;
z-index: -1;
}
.magnetic-button::before {
background-color: red;
}
.magnetic-button:hover::before {
transform: scale(0.95);
}
.magnetic-button:hover::after {
transform: scale(0.85);
}
<div class="social-nets">
<div class="magnetic-button"></div>
<div class="magnetic-button"></div>
<div class="magnetic-button"></div>
</div>

鼠标是一个,每个人的选项也是一样的。但每个都有自己的大小和位置。