心态好好
摆脱懒惰和拖延(๑>◡<๑)

前端实现背景随鼠标移动效果

前端开发中,给页面背景加鼠标跟随效果能大幅提升交互质感,不管是单张背景图的轻量跟随,还是行星、星空这类多元素的分层视差跟随,核心都是通过 JS 计算鼠标偏移量,配合 CSS 的 transform 实现元素位移,下面分两种实用方法讲解,适配不同开发场景。

方法一:基础单背景跟随

适合单张整屏背景、局部模块背景的简单跟随需求,效果轻盈,代码简洁,易上手。

核心原理:

  1. 先获取页面 / 容器的中心点坐标,作为鼠标偏移的参考原点;
  2. 监听鼠标移动事件,实时获取鼠标当前坐标,计算鼠标相对中心点的X/Y 轴偏移量
  3. 通过 CSS 的transform: translate()给背景元素设置位移,偏移量乘以缩放系数控制移动幅度,避免位移过于夸张;
  4. 背景元素需通过定位(fixed/absolute)脱离文档流,保证能自由位移且不影响其他元素。

完整代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>背景随鼠标移动(基础单元素版)</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    /* 页面容器,相对定位作为参考(局部背景用这个) */
    .page {
      width: 100vw;
      height: 100vh;
      position: relative;
      overflow: hidden;
      /* 遮挡背景元素的溢出部分,避免出现滚动条 */
    }
    /* 核心:背景元素样式 */
    .bg {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      /* 用渐变背景测试,可替换为背景图url() */
      background: linear-gradient(135deg, #1a2a6c, #b21f1f, #fdbb2d);
      /* 开启硬件加速,让位移更丝滑 */
      will-change: transform;
    }
    /* 前景文字,用于对比显示跟随效果 */
    .content {
      position: relative;
      z-index: 10;
      width: 100%;
      height: 100%;
      display: flex;
      justify-content: center;
      align-items: center;
      color: #fff;
      font-size: 32px;
      font-weight: bold;
      text-shadow: 0 0 10px rgba(0,0,0,0.5);
    }
  </style>
</head>
<body>
  <div class="page">
    <div class="bg"></div>
    <div class="content">鼠标移动看看背景变化 ✨</div>
  </div>

  <script>
    // 获取背景元素
    const bg = document.querySelector(".bg");
    // 获取页面中心点坐标(局部背景则取容器的宽高计算)
    const centerX = window.innerWidth / 2;
    const centerY = window.innerHeight / 2;

    // 监听鼠标移动事件
    window.addEventListener("mousemove", (e) => {
      // 获取鼠标当前坐标
      const mouseX = e.clientX;
      const mouseY = e.clientY;
      // 计算鼠标相对中心点的偏移量
      const offsetX = mouseX - centerX;
      const offsetY = mouseY - centerY;
      // 设置背景位移:缩放系数0.02控制移动幅度,可自行调整
      bg.style.transform = `translate(${offsetX * 0.02}px, ${offsetY * 0.02}px)`;
    });
  </script>
</body>
</html>

注意事项

  1. 缩放系数建议设为0.01~0.05,数值越大背景移动越明显,超过 0.1 会出现位移过于夸张的问题;
  2. 背景定位选择:整屏全局背景用position: fixed,局部模块内的背景用position: absolute(需给父容器加position: relative);
  3. 给背景元素加will-change: transform开启硬件加速,避免鼠标快速移动时出现动画卡顿;
  4. 父容器必须加overflow: hidden,防止背景元素位移后超出容器出现滚动条。

方法二:多元素视差跟随

适合行星、星空、多层星云这类分层背景的场景,不同层级的元素设置不同的移动幅度,形成远近错落的视差效果,还原真实的空间层次感。

核心原理:

  1. 基础逻辑和单背景一致,仍通过鼠标相对中心点的偏移量计算位移;
  2. 给不同层级的背景元素设置不同的缩放系数(移动倍率),离视觉越远的元素系数越小,移动越慢;离视觉越近的元素系数越大,移动越快,形成视差;
  3. 推荐通过 HTML 的data-*自定义属性给每个元素绑定专属倍率,JS 中动态获取,无需写死代码,扩展性更强;
  4. 遍历所有背景元素,根据各自的倍率计算位移并赋值,实现分层跟随。

完整代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>背景随鼠标移动(行星视差进阶版)</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    .sky {
      width: 100vw;
      height: 100vh;
      position: relative;
      overflow: hidden;
      background: #0a0e2a;
    }
    /* 星空:最远层,移动最慢 */
    .star {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background: url("https://picsum.photos/id/1022/1920/1080") no-repeat center;
      background-size: cover;
      opacity: 0.8;
      will-change: transform;
    }
    /* 星云:中间层,移动速度中等 */
    .nebula {
      position: absolute;
      top: 0;
      left: 0;
      width: 120%;
      height: 120%;
      top: -10%;
      left: -10%;
      background: linear-gradient(90deg, rgba(131,58,180,0.2), rgba(253,29,29,0.1), rgba(252,176,69,0.2));
      border-radius: 50%;
      will-change: transform;
    }
    /* 行星:近层,移动速度最快 */
    .planet {
      position: absolute;
      border-radius: 50%;
      will-change: transform;
    }
    /* 自定义行星样式,分散在页面中 */
    .planet1 {
      width: 80px;
      height: 80px;
      top: 20%;
      left: 20%;
      background: #409eff;
    }
    .planet2 {
      width: 120px;
      height: 120px;
      top: 60%;
      left: 70%;
      background: #67c23a;
    }
    .planet3 {
      width: 50px;
      height: 50px;
      top: 40%;
      left: 50%;
      background: #f56c6c;
    }
    /* 前景文字 */
    .title {
      position: relative;
      z-index: 10;
      width: 100%;
      height: 100%;
      display: flex;
      justify-content: center;
      align-items: center;
      color: #fff;
      font-size: 40px;
      text-shadow: 0 0 15px rgba(255,255,255,0.5);
    }
  </style>
</head>
<body>
  <div class="sky">
    <!-- 最远层:星空,倍率0.01 -->
    <div class="star" data-speed="0.01"></div>
    <!-- 中间层:星云,倍率0.03 -->
    <div class="nebula" data-speed="0.03"></div>
    <!-- 近层:行星,倍率0.06/0.08/0.1(不同行星也可不同倍率) -->
    <div class="planet planet1" data-speed="0.06"></div>
    <div class="planet planet2" data-speed="0.08"></div>
    <div class="planet planet3" data-speed="0.1"></div>
    <!-- 前景文字 -->
    <div class="title">行星视差鼠标跟随 🌌</div>
  </div>

  <script>
    // 获取所有需要跟随的背景元素(星空、星云、行星)
    const bgElements = document.querySelectorAll("[data-speed]");
    // 获取页面中心点坐标
    const centerX = window.innerWidth / 2;
    const centerY = window.innerHeight / 2;

    // 监听鼠标移动,实现分层跟随
    window.addEventListener("mousemove", (e) => {
      const mouseX = e.clientX;
      const mouseY = e.clientY;
      // 计算鼠标相对中心点的基础偏移量
      const baseOffsetX = mouseX - centerX;
      const baseOffsetY = mouseY - centerY;

      // 遍历所有元素,根据各自的data-speed计算位移
      bgElements.forEach(item => {
        // 获取自定义属性中的移动倍率,转为数字类型
        const speed = Number(item.dataset.speed);
        // 按倍率计算当前元素的位移量
        const moveX = baseOffsetX * speed;
        const moveY = baseOffsetY * speed;
        // 赋值给transform实现位移
        item.style.transform = `translate(${moveX}px, ${moveY}px)`;
      });
    });
  </script>
</body>
</html>

注意事项

  1. 视差倍率分层原则:远层小系数,近层大系数,建议远层 0.01~0.03,中间层 0.03~0.06,近层 0.06~0.1,避免层级位移混乱;
  2. 给大尺寸背景元素(如星云)设置略大于屏幕的宽高(如 120%),并偏移定位(top: -10%),防止位移后出现空白区域;
  3. 所有跟随元素都加will-change: transform,开启硬件加速,多元素场景下也能保证动画丝滑;
  4. 若需局部容器内的视差效果,只需将window.innerWidth/innerHeight替换为容器的宽高,并将容器设为position: relative + overflow: hidden即可;
  5. 超多多元素场景下,可给 mousemove 事件加节流函数(如 lodash 的_.throttle),减少 JS 执行次数,优化性能(新手可先忽略,基础场景无需节流)。

通用优化技巧

  1. 位移优先用transform: translate(),而非left/top:translate 不会触发页面重排,仅触发重绘,动画性能远高于 left/top;
  2. 背景图建议用background-size: cover/contain,适配不同屏幕尺寸,避免位移后出现空白;
  3. 可结合opacity/scale做复合效果,比如鼠标移动时背景轻微缩放,提升交互丰富度;
  4. 给移动幅度加正负值,比如部分元素translate(-moveX, -moveY),实现反向跟随,增强空间感。
赞(1) 打赏
未经允许不得转载:东东的小屋 » 前端实现背景随鼠标移动效果

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册