개발일지

react에서 top버튼 만들기 본문

TIL

react에서 top버튼 만들기

박수미/ 2024. 6. 4. 21:22

이용하는 홈페이지의 메인화면에서 스크롤을 많이 내렸을 때 한 번에 올라갈 수 있는 기능을 하는 버튼을 오른쪽 하단에서 본 적이 있을 것입니다. 이 기능을 사용하면 홈페이지를 이용하는데 편리함을 더해 줄 수 있겠죠?

 

그래서 오늘은 브라우저를 300만큼 내렸을 때 top버튼이 나오면서 맨위로 올라가는 기능을 하는 버튼을 만들어보겠습니다!

import { useEffect, useState } from 'react';
import { StUpIcon } from './UpButton.styled';

function UpButton() {
  const [upButton, setUpButton] = useState(false);

  useEffect(() => {
    const handleShowButton = () => {
      if (window.scrollY > 300) {
        setUpButton(true);
      } else {
        setUpButton(false);
      }
    };

    window.addEventListener('scroll', handleShowButton);
    return () => {
      window.removeEventListener('scroll', handleShowButton);
    };
  }, []);
  • window.scrollY - 원점으로부터 문서를 수직방향으로 스크롤한 픽셀의 수를 나타냅니다.
 const scrollToTop = () => {
    window.scroll({
      top: 0,
      behavior: 'smooth'
    });
  };
  • behavior은 auto와 smooth 두가지 옵션이 있습니다.

auto -위치로 바로 데려다주기

somooth - 부드럽게 끌어올리기

 

styled컴포넌트와 react-icon을 사용하여 css 완성하기

import { HiArrowUpCircle } from 'react-icons/hi2';
import styled from 'styled-components';

export const StUpIcon = styled(HiArrowUpCircle)`
  width: 50px;
  height: 50px;
  font-size: 1rem;
  cursor: pointer;
  opacity: 0;
  transition: 0.3s;
  visibility: hidden;
  display: block;
  position: fixed;
  bottom: 95px;
  right: 70px;
  visibility: visible;
  opacity: 1;
  border-radius: 50px;
  color: var(--button-color);
  &:hover {
    color: var(--point-color);
  }
`;

 

마지막으로 return부분을 작성해 줍니다.

 return <div className="scroll__container">{upButton && <StUpIcon onClick={scrollToTop} />}</div>;
}

export default UpButton;

&&을 넣어주어 upButton이 true일 때 <StUpIcon onClick={scrollToTop}이 실행되도록 구현하였습니다!

 

javascript로만 top버튼을 만들어봐서 마지막 return부분에 css를 제어하여 상태가 변경되도록 만들었는데 handleShowButton함수를  만들어 if문을 넣어 주었고 논리연산자 &&을 사용하여 좀 더 깔끔하게 다시 리팩토링 해보았습니다 ㅎㅎ 

'TIL' 카테고리의 다른 글

json-server란 무엇일까?  (1) 2024.06.11
동기 처리와 비동기 처리  (0) 2024.06.10
간단한 todolist만들기로 useState 연습하기  (0) 2024.05.29
Context API 사용방법  (0) 2024.05.27
다양한 배열 메소드  (1) 2024.05.20