你的网页还不会"看人"?3分钟让它拥有会追踪的眼睛

前言

你有没有见过那种超有意思的网页,上面的眼睛会跟着你的鼠标转?就像真的有人在盯着你看一样!看到实际的效果,我就跃跃欲试,看看这个是如何实现的。

话不多说,我们先看一下效果:

1. 核心思路

如果要实现这个效果,核心思路在于:当鼠标移动时,需要计算鼠标位置和每个眼球中心之间的角度,根据计算的角度,对眼球进行旋转。

2. 具体实现

具体实现步骤如下:

2.1 创建眼球结构

首先,我们需要创建基本的HTML结构,包括两个眼睛:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Eye Ball Move on Mousemove</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            background: radial-gradient(#f2761e, #ef4921);
        }
        .box {
            display: flex;
        }
        .box .eye {
            position: relative;
            width: 120px;
            height: 120px;
            display: block;
            background: #fff;
            margin: 0 20px;
            border-radius: 50%;
            box-shadow: 0 5px 45px rgba(0,0,0,0.2),
            inset 0 0 15px #f2761e,
            inset 0 0 25px #f2761e;
        }
        .box .eye::before {
            content: '';
            position: absolute;
            top: 50%;
            left: 35%;
            transform: translate(-50%,-50%);
            width: 45px;
            height: 45px;
            border-radius: 50%;
            background: #000000;
            border: 10px solid #2196f3;
            box-sizing: border-box;
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="eye"></div>
        <div class="eye"></div>
    </div>
</body>
</html>

html结构主要创建眼球,使用::before伪元素创建眼球中的瞳孔,瞳孔初始位置设置在眼球的左侧(left: 35%)。

2.2 监听鼠标事件,计算角度,眼球旋转

当鼠标移动时,需要计算鼠标位置与每个眼球中心之间的角度(使用Math.atan2()函数计算鼠标位置与眼球中心形成的角度)。

根据计算出的角度,使用CSS的transform属性对眼球进行旋转,使瞳孔"看向"鼠标位置。

javascript 复制代码
document.querySelector('body').addEventListener('mousemove', eyeball);
function eyeball(e) {
    const eye = document.querySelectorAll('.eye');
    eye.forEach(function (eye) {
        // 计算眼球中心点坐标
        let x = (eye.getBoundingClientRect().left) + (eye.clientWidth/2);
        let y = (eye.getBoundingClientRect().top) + (eye.clientHeight/2);

        // 计算鼠标位置与眼球中心的角度
        let radian = Math.atan2(e.pageX-x, e.pageY-y);
        // 将弧度转换为角度,并调整方向和偏移
        let rotation = (radian*(180/Math.PI)*-1) + 270;
        // 应用旋转变换
        eye.style.transform = "rotate(" + rotation + "deg)";
    });
}

其中最核心的代码就是

  1. 计算眼球中心坐标
    • getBoundingClientRect().left获取眼球元素左边缘相对于视口的位置
    • clientWidth/2计算眼球的水平中心点
    • 同理计算垂直方向的中心点
  2. 计算角度
    • Math.atan2(e.pageX-x, e.pageY-y)计算鼠标位置与眼球中心之间的角度(弧度)
    • radian*(180/Math.PI)将弧度转换为角度
    • *-1反转角度方向
    • +270调整初始角度偏移
  3. 眼球旋转 :使用CSS的transform: rotate()属性将计算出的角度应用到眼球元素上。

3. 总结

最后总结一下:效果很酷炫,实现很巧妙,实际上就是运用 Math.atan2()算出鼠标在哪个方向眼球应该旋转的角度,旋转眼球的角度即可。

相关推荐
小羊Yveesss4 分钟前
2026年前端开发新趋势:智能协同、工具革新与场景深耕
前端·ai
Dxy123931021613 分钟前
HTML中的Canvas可以干哪些事情
前端·html
悟乙己17 分钟前
解析 Agent 时代的 HTML PPT SKILLS: html-ppt-skill
前端·html·powerpoint
ZC跨境爬虫18 分钟前
跟着 MDN 学 HTML day_2:(表单分组与高级输入控件实战)
前端·javascript·css·ui·html
ppandss11 小时前
JavaWeb从0到1-DAY4-AJAX
前端·ajax·okhttp
涵涵(互关)1 小时前
语法大全-only-writer-two
前端·vue.js·typescript
huangql5201 小时前
浏览器 Location API、History API、路由记录与支付跳转完全指南
前端
木斯佳1 小时前
前端八股文面经大全:腾讯前端实习一面(2026-04-27)·面经深度解析
前端·八股·面经
sayamber1 小时前
Kubernetes 生产环境避坑指南:10 个真实故障案例与解决方案
前端
清寒_2 小时前
分层理解AI架构,降低对AI复杂度的恐惧
前端·人工智能·ai编程