반응형
코드 |
import React, { useState, useEffect } from "react";
import * as S from "./styles";
function ScrollTracker() {
const pageHeight = document.body.scrollHeight - document.body.clientHeight;
const [scrollY, setScrollY] = useState(0);
useEffect(() => {
const onScroll = () => {
const s = window.pageYOffset;
setScrollY(s);
};
window.addEventListener("scroll", onScroll, true);
onScroll();
return () => window.removeEventListener("scroll", onScroll);
}, []);
return <S.ScrollTracker ratio={100 - (scrollY / pageHeight) * 100} />;
}
function Header() {
return (
<>
<S.Header>
<S.ScrollBackground>
<ScrollTracker />
</S.ScrollBackground>
<S.HeaderContents>Contents</S.HeaderContents>
</S.Header>
</>
);
}
export default Header;
pageHeight에는 페이지의 전체 높이를 미리 저장해둔다.
useEffect를 이용해 최초 렌더링될 때 스크롤 이벤트 리스너를 달아주고, 콜백 함수 onScroll을 넣어준다. 이 때 onScroll에는 setState를 이용해 scrollY값을 따로 저장해준다.
ScrollTracker funtion을 따로 분리한 이유는, 스크롤이 변할 때마다 헤더 전체가 재렌더링되는 것을 방지하기 위해서이다.
ScrollTracker의 props에는 100에서 뺀 비율이 들어가는데, ScrollBackground에 그라데이션을 넣고 Tracker는 반대로 하얀 배경으로 넣어서 트래커가 줄어들수록 배경이 보이는 구조로 만들어서 그렇다. (아래 CodeSandbox 코드 참조)
결과물 |
반응형
'Web > Frontend' 카테고리의 다른 글
[Figma] 좌충우돌 Figma i18n 플러그인 제작기 (3) | 2021.05.04 |
---|---|
[Next JS] Next JS 시작하기 (4) | 2021.02.06 |
[리액트] 토스트 메세지 만들기 (1) | 2020.10.26 |
[리액트] 이미지 업로더 - 서버에 이미지 Post로 보내기 (2) | 2020.07.20 |
[리액트] 드래그 앤 드롭, 리사이징 리스트 만들기 (2) | 2020.06.02 |
댓글