You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 13 App目录下鼠标跟随元素卡顿问题求助

Next.js 13 App目录下Framer Motion鼠标跟随卡顿的解决方法

问题出在Next.js 13 App目录的默认组件类型上——App目录的组件默认是服务器组件,而鼠标监听、Framer Motion动画这类依赖浏览器环境的操作,必须放在客户端组件里执行,否则就会因为缺少浏览器运行时上下文导致卡顿。

解决步骤很简单:

  • 给包含鼠标跟随逻辑的组件加上'use client'指令,这是App目录里标记客户端组件的关键,只有带这个指令的组件才能访问浏览器API、处理DOM事件和运行动画。
  • 把鼠标坐标状态、监听事件、动画元素都封装在这个客户端组件里,不要在服务器组件里直接写这些逻辑。

举个实际实现例子:

首先创建客户端组件MouseFollower.tsx:

'use client';

import { useState, useEffect } from 'react';
import { motion } from 'framer-motion';

export default function MouseFollower() {
  const [mousePos, setMousePos] = useState({ x: 0, y: 0 });

  useEffect(() => {
    const handleMouseMove = (e: MouseEvent) => {
      setMousePos({ x: e.clientX, y: e.clientY });
    };

    window.addEventListener('mousemove', handleMouseMove);
    return () => window.removeEventListener('mousemove', handleMouseMove);
  }, []);

  return (
    <motion.div
      className="fixed w-8 h-8 rounded-full bg-blue-500 pointer-events-none z-50"
      animate={{
        x: mousePos.x - 16,
        y: mousePos.y - 16,
      }}
      transition={{ type: 'spring', stiffness: 300, damping: 30 }}
    />
  );
}

然后在app/page.tsx里导入使用这个组件:

import MouseFollower from './MouseFollower';

export default function Home() {
  return (
    <main className="min-h-screen flex items-center justify-center">
      <h1 className="text-2xl font-bold">测试鼠标跟随</h1>
      <MouseFollower />
    </main>
  );
}

这样调整后,鼠标跟随动画就能在App目录下流畅运行了——本质是把依赖浏览器的逻辑隔离到客户端组件中,符合Next.js 13 App目录的组件模型要求。

内容的提问来源于stack exchange,提问作者Joel Udd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:15:14