没有出现 React framer-motion 中的退出动画
Exit animations in react framer-motion not appearing
我正在创建一个 space 查看器应用程序并使用 Framer 动画制作动画。我的目标是称为 loading
的起始组件在被单击时将有一个退出动画。但是目前我所有的组件都没有退出动画。它们只是导致其他组件,就好像我只使用 react-router 一样。
我的 app.js 看起来像这样
<AnimatePresence /* I have tried to put exitBeforeEnter here, it does nothing*/ >
<Route exact path="/" key="loading" component={Loading} />
<Route path="/sol" key="menu" component={Menu} />
我的 loading
组件看起来像这样
const loading = {
start: {
scale: 2,
},
out: {
scale: .1,
},
};
const pagetransition = {
duration: 2,
};
return(
<motion.div initial="start"
animate="in"
exit="out"
variants={loading}
transition={pagetransition} className="loadingScreen"
>
<NavLink to="/sol"><button ><p >Enter System</p></button></NavLink>
</motion.div>
目前,我的 none 个页面有退出动画,但它们确实有进入动画,所以我知道我做的事情并没有完全错误。
我有一个 codesandbox,我的所有代码都可以在这里看到:here
预先感谢您的帮助。
我对代码沙箱进行了一些更改。使用 Framer-Motion 进行路由转换非常简单,但有点复杂。首先,您必须在 <Switch> ... </Switch>
之外使用 AnimatePresence
。然后你需要在 Switch
中输入一些键,以便 Framer-motion 跟踪路线。
我们使用 location
作为键,为了在 App.js 中使用 useLocation()
钩子,我们需要在 index.js
中包围 <App />
Router
。这就是我所做的。
这是我到目前为止所解释的更改。
在index.js
import { BrowserRouter as Router } from "react-router-dom";
ReactDOM.render(
<React.StrictMode>
<Router>
<App />
</Router>
</React.StrictMode>,
document.getElementById("root")
);
在App.js
import { Switch, Route, useLocation } from "react-router-dom";
import { AnimatePresence, motion } from "framer-motion";
function App() {
const location = useLocation();
return (
<AnimatePresence>
<Switch location={location} key={location.pathname}>
// all the routes here
</Switch>
</AnimatePresence>
);
}
然后在 loading.js 中,用 motion.div
包围整个内容。这个 motion.div
是动画。我做了一个简单的从左到右的进入,从右到左的退出。
在 loading.js
中所做的更改
const routeTransition = {
hide: {
x: "100vw"
},
animate: {
x: 0,
transition: {
delay: 0.75,
duration: 0.75,
when: "beforeChildren",
staggerChildren: 0.5
}
},
exit: {
x: "-100vw",
transition: {
duration: 0.75
}
}
};
return (
<motion.div // this is the div that will animate the entire route
variants={routeTransition}
initial="hide"
animate="animate"
exit="exit"
>
<motion.div // this div will only animate the button
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={pagetransition}
className="loadingScreen"
>
<NavLink to="/sol">
<button>
<p>Enter System</p>
</button>
</NavLink>
</motion.div>
</motion.div>
);
我正在创建一个 space 查看器应用程序并使用 Framer 动画制作动画。我的目标是称为 loading
的起始组件在被单击时将有一个退出动画。但是目前我所有的组件都没有退出动画。它们只是导致其他组件,就好像我只使用 react-router 一样。
我的 app.js 看起来像这样
<AnimatePresence /* I have tried to put exitBeforeEnter here, it does nothing*/ >
<Route exact path="/" key="loading" component={Loading} />
<Route path="/sol" key="menu" component={Menu} />
我的 loading
组件看起来像这样
const loading = {
start: {
scale: 2,
},
out: {
scale: .1,
},
};
const pagetransition = {
duration: 2,
};
return(
<motion.div initial="start"
animate="in"
exit="out"
variants={loading}
transition={pagetransition} className="loadingScreen"
>
<NavLink to="/sol"><button ><p >Enter System</p></button></NavLink>
</motion.div>
目前,我的 none 个页面有退出动画,但它们确实有进入动画,所以我知道我做的事情并没有完全错误。
我有一个 codesandbox,我的所有代码都可以在这里看到:here
预先感谢您的帮助。
我对代码沙箱进行了一些更改。使用 Framer-Motion 进行路由转换非常简单,但有点复杂。首先,您必须在 <Switch> ... </Switch>
之外使用 AnimatePresence
。然后你需要在 Switch
中输入一些键,以便 Framer-motion 跟踪路线。
我们使用 location
作为键,为了在 App.js 中使用 useLocation()
钩子,我们需要在 index.js
中包围 <App />
Router
。这就是我所做的。
这是我到目前为止所解释的更改。
在index.js
import { BrowserRouter as Router } from "react-router-dom";
ReactDOM.render(
<React.StrictMode>
<Router>
<App />
</Router>
</React.StrictMode>,
document.getElementById("root")
);
在App.js
import { Switch, Route, useLocation } from "react-router-dom";
import { AnimatePresence, motion } from "framer-motion";
function App() {
const location = useLocation();
return (
<AnimatePresence>
<Switch location={location} key={location.pathname}>
// all the routes here
</Switch>
</AnimatePresence>
);
}
然后在 loading.js 中,用 motion.div
包围整个内容。这个 motion.div
是动画。我做了一个简单的从左到右的进入,从右到左的退出。
在 loading.js
中所做的更改 const routeTransition = {
hide: {
x: "100vw"
},
animate: {
x: 0,
transition: {
delay: 0.75,
duration: 0.75,
when: "beforeChildren",
staggerChildren: 0.5
}
},
exit: {
x: "-100vw",
transition: {
duration: 0.75
}
}
};
return (
<motion.div // this is the div that will animate the entire route
variants={routeTransition}
initial="hide"
animate="animate"
exit="exit"
>
<motion.div // this div will only animate the button
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={pagetransition}
className="loadingScreen"
>
<NavLink to="/sol">
<button>
<p>Enter System</p>
</button>
</NavLink>
</motion.div>
</motion.div>
);