Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- foreach
- JSON
- useParams
- redux toolkit
- react redux
- useEffect
- 인라인블럭
- first-child
- 콜백함수
- React onClick
- useSearchParams
- line-through
- 블럭요소
- toString
- redux 사용방법
- Redux store
- 6주포트폴리오
- react
- 카우치코딩
- 자바스크립트
- javascript코딩테스트
- db.json
- javascript React
- 협업프로젝트
- React state
- sort
- Redux
- JavaScript
- 자바스크립트배포
- couchcoding
Archives
- Today
- Total
개발하는 루루언니
react : 화면 scroll event 구현하기 본문
728x90
반응형
home.js
import React, { useEffect, useRef, useState } from 'react'
import './Home.css';
import Dots from './Dots';
const DIVIDER_HEIGHT = 5;
export default function Home() {
const outerDivRef = useRef();
const [scrollIndex, setScrollIndex] = useState(1);
useEffect(() => {
const wheelHandler = (e) => {
e.preventDefault();
const { deltaY } = e;
const { scrollTop } = outerDivRef.current; // 스크롤 위쪽 끝부분 위치
const pageHeight = window.innerHeight; // 화면 세로길이, 100vh와 같습니다.
if (deltaY > 0) {
// 스크롤 내릴 때
if (scrollTop >= 0 && scrollTop < pageHeight) {
//현재 1페이지
console.log("현재 1페이지, down");
outerDivRef.current.scrollTo({
top: pageHeight + DIVIDER_HEIGHT,
left: 0,
behavior: "smooth",
});
setScrollIndex(2);
} else if (scrollTop >= pageHeight && scrollTop < pageHeight * 2) {
//현재 2페이지
console.log("현재 2페이지, down");
outerDivRef.current.scrollTo({
top: pageHeight * 2 + DIVIDER_HEIGHT * 2,
left: 0,
behavior: "smooth",
});
setScrollIndex(3);
} else {
// 현재 3페이지
console.log("현재 3페이지, down");
outerDivRef.current.scrollTo({
top: pageHeight * 2 + DIVIDER_HEIGHT * 2,
left: 0,
behavior: "smooth",
});
setScrollIndex(3);
}
} else {
// 스크롤 올릴 때
if (scrollTop >= 0 && scrollTop < pageHeight) {
//현재 1페이지
console.log("현재 1페이지, up");
outerDivRef.current.scrollTo({
top: 0,
left: 0,
behavior: "smooth",
});
setScrollIndex(1);
} else if (scrollTop >= pageHeight && scrollTop < pageHeight * 2) {
//현재 2페이지
console.log("현재 2페이지, up");
outerDivRef.current.scrollTo({
top: 0,
left: 0,
behavior: "smooth",
});
setScrollIndex(1);
} else {
// 현재 3페이지
console.log("현재 3페이지, up");
outerDivRef.current.scrollTo({
top: pageHeight + DIVIDER_HEIGHT,
left: 0,
behavior: "smooth",
});
setScrollIndex(2);
}
}
};
const outerDivRefCurrent = outerDivRef.current;
outerDivRefCurrent.addEventListener("wheel", wheelHandler);
return () => {
outerDivRefCurrent.removeEventListener("wheel", wheelHandler);
};
}, []);
return (
<>
<div ref={outerDivRef} className="outer">
<Dots scrollIndex={scrollIndex} />
<div className="inner bg-yellow">1</div>
<div className="divider"></div>
<div className="inner bg-blue">2</div>
<div className="divider"></div>
<div className="inner bg-pink">3</div>
</div>
</>
)
}
Dots.js
import './Home.css';
const Dot = ({ num, scrollIndex }) => {
return (
<div
style={{
width: 10,
height: 10,
border: "1px solid black",
borderRadius: 999,
backgroundColor: scrollIndex === num ? "black" : "transparent",
transitionDuration: 1000,
transition: "background-color 0.5s",
}}
></div>
);
};
const Dots = ({ scrollIndex }) => {
return (
<div style={{ position: "fixed", top: "50%", right: 100 }}>
<div
style={{
display: "flex",
flexDirection: "column",
justifyContent: "space-between",
alignItems: "center",
width: 20,
height: 100,
}}
>
<Dot num={1} scrollIndex={scrollIndex}></Dot>
<Dot num={2} scrollIndex={scrollIndex}></Dot>
<Dot num={3} scrollIndex={scrollIndex}></Dot>
</div>
</div>
);
};
export default Dots;
Home.css
body {
margin: 0;
overflow-y: hidden;
}
.outer {
height: 100vh;
overflow-y: auto;
}
/* 화면에서 스크롤바 안보이게 */
.outer::-webkit-scrollbar {
display: none;
}
.inner {
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
font-size: 100px;
}
.bg-yellow {
background-color: #f7f6cf;
}
.bg-blue {
background-color: #b6d8f2;
}
.bg-pink {
background-color: #f4cfdf;
}
.divider {
width: 100%;
height: 5px;
background-color: gray;
}
728x90
'컴퓨터 정보 > 리액트' 카테고리의 다른 글
react : useRef 사용법 (0) | 2023.06.26 |
---|---|
react : 탭 기능 구현 하기 (0) | 2023.06.22 |
react : 스크롤 감지 이벤트 (0) | 2023.06.20 |
React 폴더구조 (0) | 2023.06.02 |
timeago.js 라이브러리를 이용해 몇시간전.. 구현하기 (0) | 2023.04.10 |