100vh : 뷰포트(Viewport) 높이의 100%를 의미합니다.
1vh = 뷰포트 높이의 1%
100vh = 브라우저 창 전체 높이
calc() : CSS에서 동적 계산을 할 수 있는 함수입니다.
calc(100vh - 100px) → 뷰포트 전체 높이에서 100px을 뺀 값결과적으로, 화면 크기가 변해도 항상 "화면 전체 높이 - 100px" 만큼의 높이를 유지합니다.
.main-content {
height: calc(100vh - 100px);
overflow-y: auto; /* 내용이 넘칠 경우 스크롤 */
}
100vh = 화면 전체 높이
- Xpx = 그 높이에서 X 픽셀만큼 빼는 것
X가 작아지면 빼는 양이 줄어들어 → 최종 높이가 커짐
X가 커지면 빼는 양이 많아져 → 최종 높이가 작아짐
화면 높이가 900px이라고 가정
| CSS 코드 | 계산식 | 최종 높이 |
|---|---|---|
height: calc(100vh - 50px); | 900px - 50px | 850px |
height: calc(100vh - 100px); | 900px - 100px | 800px |
height: calc(100vh - 200px); | 900px - 200px | 700px |
반응형 레이아웃 구현 가능 (화면 크기 변화에 자동 대응)
고정된 헤더/푸터와 함께 사용 시, 남은 영역을 정확히 채움
CSS만으로 계산 가능 → JS 없이도 동적 높이 설정 가능
모바일 브라우저에서의 vh 문제
모바일 환경에서는 주소창이 나타났다/사라졌다 할 때 vh 값이 변동될 수 있습니다.
iOS Safari 등에서는 100vh가 실제 보이는 영역보다 크게 계산되는 경우가 있어, 100dvh(Dynamic Viewport Height) 사용을 고려할 수 있습니다.
calc() 연산 시 공백 필수
calc(100vh-100px)처럼 공백 없이 쓰면 일부 브라우저에서 인식 오류 발생 가능
올바른 문법: calc(100vh - 100px)
스크롤바 고려
overflow 속성 조정 필요.content {
height: calc(100vh - 150px); /* 헤더 100px + 푸터 50px */
}
.main {
width: calc(100vw - 250px); /* 전체 너비에서 사이드바 너비 제외 */
}
만약 모바일 환경까지 고려한 안정적인 레이아웃을 원한다면,
height: calc(100dvh - 100px);또는 JavaScript로window.innerHeight값을 가져와서 스타일에 반영하는 방법을 병행하는 것이 좋습니다.