GatsbyJSでブログを作っており、SPAでページ遷移が爆速なのがとても良いが、読み込みがないことで、逆にフィードバックがなくてページが変わったことに気づけないので、ページ遷移時にアニメーションを付けたかった。
適当にページ遷移するとファンってなるのを体験できる。
下記 react-transition-group
と gatsby-plugin-layout
を使う方法でページ遷移時にアニメーションを付いたのだが、モバイル端末でスタイル崩れが発生したので、ページ遷移時のアニメーションは外した。
※ さらに追記で、CSSで実現する方法が良さそうだったので、記事にした。
続・GatsbyJSで作っているブログでページ遷移時にアニメーションが付くようにした
gatsby-plugin-transition-link
を使う方法gatsby-plugin-page-transitions
を使う方法<PageTransition>
で囲むとTransitionが適用されて、インタフェースとしては直感的で良かったgatsby-v2-plugin-page-transitions
を使う方法gatsby-plugin-page-transitions
のもののままになっていて、Installコマンドが gatsby-plugin-page-transitions
向けのものになっていて、誤りがあったりと、保守されていない感が否めず、今後Breaking Changeが入ったタイミングで運用が厳しくなりそうだったgatsby-plugin-xxx
という命名規則に従わず、間に v2
を入れてきている命名が少し気に食わなかったreact-transition-group
と gatsby-plugin-layout
を使う方法gatsby-plugin-page-transitions
のREADMEにリンクが示されていたGatsby公式のサンプルが示している方法になるreact-transition-group
と gatsby-plugin-layout
をインストール$ npm i -S react-transition-group gatsby-plugin-layout
gatsby-plugin-layout
を入れざるを得ないgatsby-config.js
に gatsby-plugin-layout
を追加module.exports = {
...
plugins: [
...
"gatsby-plugin-layout",
import React from "react"
import {
TransitionGroup,
Transition as ReactTransition,
} from "react-transition-group"
const timeout = 250
const getTransitionStyles = {
entering: {
position: `absolute`,
opacity: 0,
},
entered: {
transition: `opacity ${timeout}ms ease-in-out`,
opacity: 1,
},
exiting: {
transition: `opacity ${timeout}ms ease-in-out`,
opacity: 0,
},
}
class Transition extends React.PureComponent {
render() {
const { children, location } = this.props
return (
<TransitionGroup>
<ReactTransition
key={location.pathname}
timeout={{
enter: timeout,
exit: timeout,
}}
>
{status => (
<div
style={{
...getTransitionStyles[status],
}}
>
{children}
</div>
)}
</ReactTransition>
</TransitionGroup>
)
}
}
export default Transition
gatsby-plugin-layout
の方で、 src/layouts/index.js
のファイルを見にいくようになっているので、そちらの命名に従ってファイルを追加したconst Layout = ({ children, location }) => (
<>
<Header />
<Transition location={location}>
{children}
</Transition>
</>
)
export default Layout
gatsby-browser.js
にスクロールをトップに戻す処理を遅延させる処理を追加したconst transitionDelay = 250
export function shouldUpdateScroll({
routerProps: { location },
getSavedScrollPosition,
}) {
if (location.action === "PUSH") {
window.setTimeout(() => window.scrollTo(0, 0), transitionDelay)
} else {
const savedPosition = getSavedScrollPosition(location)
window.setTimeout(
() => window.scrollTo(...(savedPosition || [0, 0])),
transitionDelay
)
}
return false
}
上記 react-transition-group
と gatsby-plugin-layout
を使う方法でページ遷移時にアニメーションを付いたのだが、モバイル端末でスタイル崩れが発生したので、ページ遷移時のアニメーションは外した。
※ さらに追記で、CSSで実現する方法が良さそうだったので、記事にした。
続・GatsbyJSで作っているブログでページ遷移時にアニメーションが付くようにした