본문 바로가기

리액트

리액트 일지 005 | 스크롤 따라다니는 하단 플로팅 바 구현하기 | 리액트 특정 위치에서 스크롤 고정하기 | 리액트 스티키 플로팅 바 | 스크롤 고정 메뉴바 | 리액트 sticky components

에러로그 

아래와 같은 사이트 메인 페이지 내 하단에 위치하는 메뉴바를 구현하고자했다. 처음에는 윈도우 화면의 스크롤을 조작해서 설정해야할 줄 알았는데 position: sticky; 라는 속성을 사용하면 css 코드 몇 줄로 간단하게 구현할 수 있는 기능 같았다. 이에 조금 더 찾아보니 플로팅 버튼이나 스티키 헤더같은 경우로 종종 사용되는 경우 같았다. sticky 속성 설정과 위치값만 설정하면 간단하게 해결할 수 있는 부분일 줄 알았는데 생각보다 시간이 좀 걸렸다.. 응애 나 코린이... 플로팅 헤더로는 자료가 많지만 하단에 고정하는 예시는 많이 없는 것 같기에 간단하게 구현했던 방법을 기록해보려한다. 내가 시도했던 다양한 방법들을 기록해놓은 관계로 하단에 3줄요약도 적어놨다.

 

우선 구현하는 기능의 레퍼런스자료였던 '위드비컨' 사이트

나의 멋진 해결

/* 스크롤 메뉴바 컴포넌트의 CSS(scroll/style.ts) */
import styled from 'styled-components';

export const Container = styled.div`
  background-color: #fff;
  border-top: 1px solid #0d6717;
  width: 100%;
  height: 80px;
  display: flex;
  align-items: center;
  z-index: 10;
  !position: sticky;
  !bottom: 0;
`;

 

사실 느낌표로 앞부분에 표시해준 이 설정만 해주면 끝이다. position: sticky; 속성을 추가해준 뒤 고정하려하는 부분의 위치를 top, right, left, bottom 의 속성으로 위치값 설정을 추가해주면 끝. 헤더가 유동적으로 움직이다 고정되는 스티키 헤더의 경우는 top:0 속성을 주지만 나는 하단 부분에 고정하고 싶었던거라 bottom: 0; 설정을 주어서 하단 부분에 고정했다. 

 

내가 구현한 하단 플로팅바의 모습. 메인 컨텐츠 하단과 푸터위 부분 사이에 고정이 착 잘 되는 모습

내가 한 삽질

사실 이런 기능을 처음 붙여보는거라 당연하게도 삽질을 좀 했는데 삽질을 생각보다 좀 오랜 시간 해버렸다. 기존에 알고 있던 헤더들이랑 위치가 정 반대이기도 하고 컴포넌트화 한 하단 메뉴바에 css 설정을 어디에 해야하는지 감이 잘 안와서 이것저것 다 해봤다. 우선은 임포트해오는 페이지가 아닌 컴포넌트에 position: sticky; 속성을 적용해주어야한다. 임포트 해오는 페이지에서 속성을 설정해주는 경우에는 아래와 같이 원하는 느낌이 안나오고 깨진다. 

 

컴포넌트를 상단에 위치하게해서 잘 안되는 건가 싶어 메인페이지 기준으로 화면의 끝 부분(전체 코드에서는 중간 지점)에 컴포넌트를 위치시키고 임포트 해온 메인페이지에서 스티키 속성을 부여해봤다. 두근두근 결과는 

 

ㅎㅎ 이번엔 디자인이 깨짐 ㅎㅎ

이에 낙담하지않고 이번에는 임포트 해오는 페이지가 아닌 하단 메뉴바 컴포넌트 내에서 스티키 속성을 부여했다. 하단에 고정되어야하니 bottom: 0; 까지 설정해주고 확인해봤다. 두구두구 

 

근데 이번엔 스크롤이 중간에서 끊김 ㅠㅠ

이때 sticky 속성은 컴포넌트 내에서 부여해야하고 최종적으로 고정시키고 싶은 위치를 임포트한 페이지에서 설정해야되는걸 알게됐고 메인페이지에서 임포트해온 컴포넌트 태그를 하단에 작성한 결과 아래와 같이 아주 이쁘게 성공할 수 있었다. 

 

고정이 잘 된 모습

하단 플로팅 메뉴바 적용 3줄요약

  1. position: sticky; top, right, left, bottom(고정시키고싶은 위치): number; -> 컴포넌트 내에 작성(위치 속성도 필수로 부여야해야함)
  2. import 해온 컴포넌트 태그의 위치 -> 최종적으로 고정하고 싶은 위치에 작성
  3. 부모요소의 height 설정 -> 필수!! 단, height: 100%; 의 경우는 해당사항없음, % 대신 다른 태그를 사용하도록 하자