TransitionGroup, CSSTransition 활용하여 2개 Layout이 움직이는 것처럼 효과를 주는 것이 가능합니다.
적용 순서
1. TransitionGroup
<TransitionGroup className={`transitions-wrapper-right`}>
...
</TransitionGroup>
2. CSSTransition
const location = useLocation();
...
<TransitionGroup className={`transitions-wrapper-right`}>
<CSSTransition
key={location.pathname}
classNames="right"
timeout={300}
>
<Routes>...</Routes>
</CSSTransition>
</TransitionGroup>
3. index.css 정의 : Route 및 Transition Class
.container {
position: absolute;
...
}
.right-enter {
transform: translateX(100%);
}
.right-enter-active {
z-index: 1;
transform: translateX(0%);
transition: transform 300ms ease-out;
}
.right-exit{
transform: translateX(0%);
}
.transitions-wrapper-left >.right-exit-active,
.transitions-wrapper-left >.left-exit-active {
transform: translateX(100%);
transition: transform 300ms ease-out;
}
4. router back 감지 : back 이벤트를 감지해서 transition class명을 변경
window.onpopstate = () => {
isBack = true;
};
...
const transitionName = isBack ? 'left' : 'right';
...
<TransitionGroup className={`transitions-wrapper-${transitionName}`}>
<CSSTransition
key={location.pathname}
classNames={transitionName}
timeout={300}
onExited={() => {
isBack = false;
}}
>
...
최종 Code
Router.jsx
const Router = () => {
window.onpopstate = () => {
isBack = true;
};
const location = useLocation();
const transitionName = isBack ? 'left' : 'right';
return (
<TransitionGroup className={`transitions-wrapper-${transitionName}`}>
<CSSTransition
key={location.pathname}
classNames={transitionName}
timeout={300}
onExited={() => {
isBack = false;
}}
>
{/* route정의는 js에서 배열로 관리 */}
<Routes location={location}>{getRoutes(routes)}</Routes>
</CSSTransition>
</TransitionGroup>
);
};
index.css
.container {
position: absolute;
background-color: #fff;
top: 0;
width: 100%;
height:100%;
}
.transitions-wrapper-left,
.transitions-wrapper-right {
overflow: hidden;
height: calc(var(--vh, 1vh) * 100);
width: 100vw;
}
.right-enter {
transform: translateX(100%);
}
.right-enter-active {
z-index: 1;
transform: translateX(0%);
transition: transform 300ms ease-out;
}
.right-exit{
transform: translateX(0%);
}
.transitions-wrapper-left >.right-exit-active,
.transitions-wrapper-left >.left-exit-active {
transform: translateX(100%);
transition: transform 300ms ease-out;
}
React Routes, Route 사용시 배열로 관리하기 (0) | 2023.01.20 |
---|---|
Data API를 지원하지 않는 Router Components (0) | 2023.01.20 |
React Router - Data API를 사용하는 Router (0) | 2023.01.20 |
React Router (0) | 2023.01.20 |
댓글 영역