탑 버튼을 만들기 전에 구글링으로 검색하여 여러 방법들을 봤었는데 내가 생각했던 javascript 코드와는 살짝 달랐었다.
어떤 사람은 hook을 만들었고 또 어떤 사람은 내가 생각했던 javascript 방식과 비슷했다.
무엇보다 코드를 작성하기 이전에 나는 React를 사용하고 있다는 것을 잊고 있었다.(진짜...에휴😩)
그리하여 useState와 useEffect 활용의 중요성을 다시금 알게됐다.
const scrollToTop = () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
})
// 3가지문법
//window.scrollTo(x좌표, y좌표)
//window.scrollTo({top, left, behavior})
//window.scroll( top, left, behavior );
mdn에서 알려주는 scrollTo의 문법은 (x,y)를 알려주고 있고,
위에 작성한 코드는 scroll의 options문법을 활용한 코드이다.
behavior
= auto , smooth
behavior는 두가지로 나뉘는데 auto = 위치로 바로 대려다 주고 smooth는 부드럽게 끌어올린다.
<div className="scroll__container">
<button id="top" onClick={scrollToTop} type="button" > Top</button>
</div>
버튼을 감싸주는 div와 button 태그를 만들어주고 위에 작성한 클릭하였을 때 스크롤 해줄 onClick
함수를 넣어주자.
.scroll__container{
position: fixed;
right: 5%;
bottom: 5%;
z-index: 1;
}
#top{
font-weight: bold;
font-size: 15px;
padding :15px 10px;
background-color: #000;
color:#fff;
border: 1px solid rgb(210, 204, 193);
border-radius: 50%;
outline: none;
cursor: pointer;
}
#top:hover{
color :rgb(142, 26, 26);
}
귀요운 동그라미를 만들었다.
원래 생각한 대로라면 useState를 사용하지 않고 if문을 통해 스크롤 위치를 비교하여 classList.add()
를 사용했을 것이다.
찾아보다가 알게된 것은 React에서 DOM에 접근하려고 한다면 useRef를 사용해야 된다는 것
useRef의 특징
저장공간(변수관리), DOM에 요소에 접근
자세한건 useRef사용법에서 확인해 보자.
const [showButton, setShowButton] = useState(false);
버튼을 on & off 해주기 위한 useState 기본값은 숨겨두기 위해 false로 둬주자.
useEffect(() => {
const handleShowButton = () => {
if (window.scrollY > 500) {
setShowButton(true)
} else {
setShowButton(false)
}
}
window.addEventListener("scroll", handleShowButton)
return () => {
window.removeEventListener("scroll", handleShowButton)
}
}, [])
스크롤을 500만큼 내렸을 때 true
로 변경하여
TOP버튼을 나타나게 해준다.
얼만큼 스크롤 되었는지 알기 위하여 EventListener를 추가해주고 언마운트 시에 remove 될수 있게 Clean-up
함수를 추가
구글링 하다보면 window.scrollY
이 아닌 window.pageYOffset
코드를 볼 수 있다.
window.pageYOffset
코드는 scrollY의 다른 이름이다.
Deprecated인 것을 알고 넘어가자.
window.scrollY
===window.pageYOffset
이제 버튼이 true & false 될때 나타나고 사라지게 하기위해 논리연산자 && 을을 사용해보자.
return showButton && (
<div className="scroll__container">
<button id="top" onClick={scrollToTop} type="button" > Top</button>
</div>
)
만약 showButton이 true라면 && 다음에 오는 조건을 실행하고 false이면 무시(실행x)한다. codepen 예시
function TopButton() {
const [showButton, setShowButton] = useState(false);
const scrollToTop = () => {
window.scroll({
top: 0,
behavior: 'smooth'
})
}
useEffect(() => {
const handleShowButton = () => {
if (window.scrollY > 500) {
setShowButton(true)
} else {
setShowButton(false)
}
}
console.log(window.scrollY)
window.addEventListener("scroll", handleShowButton)
return () => {
window.removeEventListener("scroll", handleShowButton)
}
}, [])
return showButton && (
<div className="scroll__container">
<button id="top" onClick={scrollToTop} type="button" > Top</button>
</div>
)
}