↑のLPサイトにに以下みたいなアニメーションを追加してみたので実装方法を紹介
Pull Request
LPサイトにアニメーション追加 by wheatandcat · Pull Request #8 · wheatandcat/PeperomiaWebSite · GitHub
実装
まず、1つのコンポーネントで書いていたので、以下の画像のとおりにコンポーネントを分解
世の中的にはReactでアニメーションさせるにはreact-springを使用するのですが、自分的には難易度が高く挫折してので、
アニメーションはreact-inview-monitorとcssを使って実装しました。
react-inview-monitorを使えばwindowにスクロールインしたタイミングをハンドリングできるので、それに合わせて実装する (といっても以下の記事をまるっとコピペしただけどが)
■ src/components/organisms/Animation.jsx
import React from 'react'; import styled from 'styled-components'; import InViewMonitor from 'react-inview-monitor'; export const Up = ({ children, delay, margin = '-20%' }) => ( <InViewMonitor childPropsInView={{ isActive: true }} intoViewMargin={margin}> <FadeInUp isActive={false} delay={delay}> {children} </FadeInUp> </InViewMonitor> ); export const Down = ({ children, delay, margin = '-20%' }) => ( <InViewMonitor childPropsInView={{ isActive: true }} intoViewMargin={margin}> <FadeInDown isActive={false} delay={delay}> {children} </FadeInDown> </InViewMonitor> ); export const Left = ({ children, delay, margin = '-20%' }) => ( <InViewMonitor childPropsInView={{ isActive: true }} intoViewMargin={margin}> <FadeInLeft isActive={false} delay={delay}> {children} </FadeInLeft> </InViewMonitor> ); export const Right = ({ children, delay, margin = '-20%' }) => ( <InViewMonitor childPropsInView={{ isActive: true }} intoViewMargin={margin}> <FadeInRight isActive={false} delay={delay}> {children} </FadeInRight> </InViewMonitor> ); const FadeIn = styled.div` opacity: 0; transition: opacity 1s ease, transform 1s ease; ${({ isActive }) => isActive && `opacity: 1;`} ${({ delay }) => delay && `transition-delay: ${delay}ms;`} `; const FadeInUp = styled(FadeIn)` transform: translateY(30px); ${({ isActive }) => isActive && `transform: translateY(0px);`} `; const FadeInDown = styled(FadeIn)` transform: translateY(-30px); ${({ isActive }) => isActive && `transform: translateY(0px);`} `; const FadeInLeft = styled(FadeIn)` transform: translateX(-30px); ${({ isActive }) => isActive && `transform: translateX(0px);`} `; const FadeInRight = styled(FadeIn)` transform: translateX(30px); ${({ isActive }) => isActive && `transform: translateX(0px);`} `;
上記のコンポーネントでアニメーションしたいところをラップしていけばOKです
■ src/components/pages/Top.jsx
import React from 'react'; import Doujinshi from '../organisms/Doujinshi'; import AppTitle from '../organisms/AppTitle'; import AppInfo1 from '../organisms/AppInfo1'; import AppInfo2 from '../organisms/AppInfo2'; import GitHub from '../organisms/GitHub'; import Blog from '../organisms/Blog'; import AppFooter from '../organisms/AppFooter'; import { Up, Right, Left } from '../organisms/Animation'; // 上記の画像で分割したコンポーネントをAnimationのコンポーネントでラップ export default () => { return ( <div> <AppTitle /> <Up> <Doujinshi /> </Up> <Right> <AppInfo1 /> </Right> <AppInfo2 /> <Right> <GitHub /> </Right> <Left> <Blog /> </Left> <AppFooter /> </div> ); };
これで実装するれば以下みたいな感じにアニメーションします
割りかしLPサイトっぽくなったので満足