프론트 엔드/css
[CSS]React에서 스크롤시 화면 변화
삼삼고
2023. 1. 20. 09:11
❗필요!
React에서 scroll 했을 때 애니메이션 효과는 useState, useEffect으로 만들 수 있습니다.
import React, { useState, useEffect } from "react";
또한 CSS 라이브러를 사용하면 애니메이션을 더 편하게 사용할 수 있습니다.
npm install animate.css --save
import "animate.css/animate.min.css";
animate.css의 자세한 사용법은 다음 사이트를 참고해 주세요
Animate.css | A cross-browser library of CSS animations.
Animate.css is a library of ready-to-use, cross-browser animations for you to use in your projects. Great for emphasis, home pages, sliders, and attention-guiding hints.
animate.style
📍useEffect을 사용해서 handleScroll함수 만들기
Scroll시 스크롤 된 높이에 알맞는 함수를 실행시키는 함수를 만들기 위해 높이를 저장할 수 있는 변수를 useState를 이용해서 만들어 줍니다.
const [scrollPosition, setScrollPosition] = useState(0);
다음으로 useEffect을 사용해서 스크롤이 될때마다 높이를 저장하는 Hook을 만들어 줍니다.
useEffect(() => {
function handleScroll() {
setScrollPosition(window.pageYOffset);
}
window.addEventListener("scroll", handleScroll);
return () => {
window.removeEventListener("scroll", handleScroll);
};
}, []);
높이를 저장하는 Hook을 만들었다면 높이에 맞춰 애니메이션을 실행해 주는 useEffect을 하나 더 만들어 줍니다.
const [isMapVisible, setIsMapVisible] = useState(false);
const [isReqVisible, setIsReqVisible] = useState(false);
useEffect(() => {
if (scrollPosition > 1100) {//scrollPosition1100이상일때
setIsReqVisible(true);//Req를 보이게 하기
} else {
setIsReqVisible(false);/Req를 안 보이게 하기
}
if (scrollPosition > 400 && scrollPosition <= 1900) {//scrollPosition400이상이고 1900미만일때
setIsMapVisible(true);//Map를 보이게 하기
} else {
setIsMapVisible(false);//Map를 안 보이게 하기
}
}, [scrollPosition]);
🏹CSS에 애니메이션 추가하기
위에 만들었던 isReqVisible의 값에 따라 애니메이션을 실행시키기 위해 CSS로 state를 전달합니다.
<Reqdiv isReqVisible={isReqVisible}>
참 거짓에 따라 animate.css 라이브러리를 추가해줍니다.
👉저는 element가 보이는 높이가 되면 왼쪽에서 나타나고 안 보이는 구간쯤에서는 오른쪽으로 사라지도록 애니메이션을 넣어 주었습니다.
const Reqdiv = styled.div`
transi
animation: ${({ isReqVisible }) =>/*삼항 연산자로 애니메이션 설정*/
isReqVisible ? "fadeInLeft 2s" : "fadeOutRight 2s"};
/*fadeInLeft 2s 2초동안 왼쪽에서 나타나기*/
/*fadeInLeft 2s 2초동안 오른쪽으로 사라지기*/
`;
물론 직접 CSS를 작성해서 애니메이션 효과를 넣을 수도 있습니다.
<Mapdiv className={`${isMapVisible ? "fade-in" : "fade-out"}`}>
{/*조건식에 따라 CSS실행*/}
const Mapdiv = styled.div`
opacity: 0;//투명속성
visibility: hidden;//가시성
transition: all 2s;//초
&.fade-in {
opacity: 1;
visibility: visible;
}
/*아무것도 없는 것에서 fade-in이 실행되면 Mapdiv가 보이게 됩니다. */
728x90
반응형