小眼睛跟随鼠标移动

效果图:

小眼睛跟随鼠标移动

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        /* 对所有元素进行样式重置 */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        /* 设置 body 的样式 */
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            background: radial-gradient(#33bbff, #1144ff);
        }
        /* 对类名为 main 的元素进行样式设置 */
      .main {
            display: flex;
            gap: 7vmin;
        }
        /* 对类名为 main_eye 的元素进行样式设置 */
      .main_eye {
            width: 25vmin;
            height: 25vmin;
            background-color: #fff;
            border-radius: 50%;
            box-shadow: 0 0 4vmin rgba(0, 0, 0,.2),
                        inset 0 0 2vmin #33bbff,
                        inset 0 0 4vmin #33bbff;
            position: relative;
        }
        /* 为类名为 main_eye 的元素添加伪元素,并设置其样式 */
      .main_eye:before {
            content: '';
            width: 40%;
            height: 40%;
            background-color: #333;
            border-radius: 50%;
            border: 1vmin solid #33bbff;
            box-sizing: border-box;
            position: absolute;
            top: 50%;
            left: 30%;
            transform: translate(-50%, -50%);
        }
    </style>
</head>
<body>
    <div class="main">
        <div class="main_eye"></div>
        <div class="main_eye"></div>
    </div>
    <script>
        // 选择所有类名为 main_eye 的元素
        let eyes = document.querySelectorAll('.main_eye');

        // 为 body 元素添加鼠标移动事件监听器
        document.querySelector('body').addEventListener('mousemove', (e) => {
            // 遍历每个 main_eye 元素
            eyes.forEach(eye => {
                // 获取元素相对于视口的位置信息
                let rect = eye.getBoundingClientRect();
                // 计算元素中心的 x 坐标
                let x = rect.left + rect.width / 2;
                // 计算元素中心的 y 坐标
                let y = rect.top + rect.height / 2;
                // 计算鼠标相对于元素中心的角度
                let deg = Math.atan2(e.clientY - y, e.clientX - x) * 180 / Math.PI+180;
                // 根据计算的角度旋转元素
                eye.style.transform = `rotate(${deg}deg)`; 
            });
        });
    </script>
</body>
</html>
  • HTML 部分
    • 定义文档基本结构,涵盖文档类型、语言、元信息、标题、样式及脚本。
    • 包含一个 div 容器 .main,其中有两个 .main_eye 元素,用于表示眼睛。
  • CSS 部分
    • * {...}:将所有元素的 marginpadding 设为 0 并采用 border - box 盒模型,便于布局计算。
    • body {...}:将页面主体设为 Flex 布局,使内容居中并设置背景渐变。
    • .main {...}:为 .main 容器设置 Flex 布局与元素间距。
    • .main_eye {...}:定义眼睛元素的形状、大小、颜色、阴影及定位。
    • .main_eye:before {...}:为眼睛元素添加伪元素表示瞳孔,设置其大小、颜色、位置及定位。
  • JavaScript 部分
    • let eyes = document.querySelectorAll('.main_eye'):选择所有类名为 main_eye 的元素。
    • document.querySelector('body').addEventListener('mousemove', (e) => {...}):为 body 元素添加鼠标移动事件监听器。
    • let rect = eye.getBoundingClientRect():获取元素的位置和尺寸信息。
    • let x = rect.left + rect.width / 2 和 let y = rect.top + rect.height / 2:计算元素中心坐标。
    • let deg = Math.atan2(e.clientY - y, e.clientX - x) * 180 / Math.PI + 180:计算鼠标相对于元素中心的角度并转换为度。

eye.style.transform = rotate(${deg}deg):将元素旋转相应角度,实现眼睛跟随鼠标移动效果。同时使用 requestAnimationFrame` 优化动画性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值