본문 바로가기

HTML, CSS

[HTML, CSS] 내용 부분 스타일 지정만으로 푸터 하단 고정하는 방법

반응형

 

 

안녕하세요 주갬입니다.

 

 

오늘은 사이드 프로젝트를 하면서 푸터가 중간에 떠있는 현상을 해결한 방법에 대해 설명 드리려고 합니다.

 

 

 

구글링을 해보시면 푸터를 하단에 고정하기 위한 다양한 방법들이 존재합니다.

하지만 그 대부분의 방법이 저의 상황에서는 적용하기엔 무리가 있는 방법들이였습니다.

 

 

그 방법들을 간략히 정리하면 이렇습니다.

 

 

1. position: fixed

    - 푸터가 하단에 계속 고정되어 있어 스크롤을 내려도 항상 같은 위치에 푸터가 존재해 어색하다.

 

 

2. position: absolute

    - 푸터를 본문 밑에 고정시킨다면 본문 길이가 짧을 때 하단 고정이 안된다.

    - 본문 길이가 길 때도 스크롤은 absolute로 지정된 영역을 잡아주지 않아 어색하다.

 

 

3. 본문에 height: 100% 나 100vh 처리등을 해줘서 본문을 꽉 채워주는 방법

    - 위 두 방법의 해결책으로 많이 나오는 방법이다.

    - 하지만 vh는 모바일에서 상하단의 바 영역을 반영하지 못하기 때문에 스크롤이 어색하게 나오게 된다. 

    - height: 100%를 주는 방법은 %가 부모 영역의 크기를 반영한다는 특성 상 리액트에서는 부모를 타고타고 들어가 #root의 height를         지정해줘야 하는 상황이 생긴다. 하자면 하겠지만,, #root부터 시작해서 모든 부모요소에 height: 100%를 주기엔 무리인 상황이                많을 것이라 생각한다.

 

 

4. Flexbox, Grid 사용

 

Flexbox)

body {
  display: flex;
  flex-direction: column;
  min-height: 100vh; /* 최소 높이를 100% 화면 높이로 설정 */
}

main {
  flex: 1; /* 메인 콘텐츠가 화면의 남은 공간을 차지하도록 설정 */
}

 

 

Grid)

body {
  display: grid;
  grid-template-rows: auto 1fr auto; /* 헤더, 메인 콘텐츠, 푸터를 각각의 행으로 설정 */
  min-height: 100vh;
}

 

 

 - 지피티씨가 알려준 방법으로 적용해보니 잘 되긴 했지만... 역시나 body부분의 스타일부터 건드려야한다.

 

 

 

요구 사항 ) 

 

저는 사이드프로젝트 중간에 합류한 입장이라 제가 body부분의 스타일을 건들면 다른 분들이 이미 잡아둔 스타일들이 모두 깨질까 걱정이 되었기 때문에 내용의 스타일만을 수정해서 푸터를 하단에 고정하는 방법을 찾아야했습니다.

 

 

그 결과 제가 맡은 내용 부분만을 수정해서 푸터를 예쁘게 하단에 고정하는 방법을 알아내었고 이 글에서 소개드리고자 합니다.

 

 

 


 

 

 

문제 상황)

 

중간에 합류해서 처음 코드를 받았을 때는 이런 상황이였습니다.

 

 

 

내용이 짧아서 푸터가 저 위로 올라가 있는 모습 보이시나요? 내용이 길 때는 푸터가 자리를 잘 잡고 있지만 내용이 짧을 때의 스타일은 제대로 잡지 못하는 상황이였습니다.

 

 

 

트러블 슈팅 )

 

1. 처음에는 내용의 margin을 calc(10vh - 헤더 높이 - 내용 높이 - 푸터 높이) 로 잡아서 적용했었습니다. 

    - 하지만 이렇게 하니 스크롤을 내릴 때 margin이 무시되고 푸터가 위로 올라오는 현상이 발생했습니다. 

    - 이는 calc 연산의 결과값이 height가 바뀌면 계속 재계산되기 때문인 것으로 추측 중입니다.

 

 

2. 고민 끝에 저는 내용 제일 끝 부분에 div를 추가하고 필요한 만큼 height를 주면 되지 않을까 라는 생각이 들었습니다.

html을 블럭쌓기라고 표현하는데, 내용과 푸터 사이에 빈 블럭을 하나 추가하면 어떨까 하는 아이디어 였습니다.

 

 

 

 


 

 

 

 

해결 방법 )

 

우선 margin을 이용해 내용 영역을 적당히 예쁘게 잡아줍니다. 화면 크기가 아주 작을 때 꼭 필요한 여백만을 지정해준다는 느낌으로 잡아주시면 됩니다.

 

 

이렇게 margin을 적당히 잡아주시면

 

 

이렇게 화면이 작아져도 내용이 가운데에 예쁘게 위치하게 됩니다.

 

 

 

 

 

그 다음은 제일 밑에 div를(블록요소) 생성하고 calc연산을 이용해 적당한 height를 주는 것입니다.

 

    <Page>
      <Wrap>
           내용
      </Wrap>
      <div style={{ height: "calc(100vh - 128px - 300px - 214px - 360px)" }}></div>
    </Page>

 

저는 다음과 같이 스타일을 줬습니다. 

 

 

calc연산은 다음과 같이 계산했습니다.

 

 

 

 

 

이렇게 하면 내용의 시작점은 화면 크기가 변해도 그대로이고 내용 밑부분만 변하면서 푸터는 하단에 고정이 되게 됩니다.

 

 

 

 

잘 됩니다!!! 캬캬

 

 

 


 

 

 

 

오늘은 푸터를 하단에 고정하기 위한 방법을 알아보았습니다.

전체적인 스타일은 수정하지 않으면서 내용 부분 밑에 여백을 주는 div를 만들고 유동적인 height를 주는 방법으로 이를 해결해보았습니다.

 

 

감사합니다. 

반응형