iOS 브라우저에서의 뷰포트 높이 문제와 해결 방법

2 min read

문제 발생

position: sticky;를 적용을 위해 모바일에서 영역 높이를 뷰포트 만큼 설정해야 하는 경우 iOS 브라우저에서 height: 100vh; 를 적용할 영역이 경우 예상보다 길게 적용되는 특징을 확인했습니다.

Sticky 헤더, 푸터를 적용했지만 ios 사파리의 툴바에 가려지는 이슈 이미지

해결 방법

여러 해결 방법 중 3가지를 소개합니다.

1. -webkit-fill-available 사용

height-webkit-fill-available을 적용해 iOS 브라우저에서 해결 가능합니다.

.container {
  height: -webkit-fill-available;
}

2. dvh 사용

dvh는 동적 뷰포트 높이(Dynamic viewport height)라는 뜻으로 1dvh는 동적 뷰포트 높이의 1%와 같습니다.

dvh는 브라우저 UI 변경으로 인한 크기 조절 시 반영됩니다.

.container {
  height: 100dvh;
}

dvh 사용 시 아래 링크에서 브라우저 호환성을 확인 가능합니다. https://caniuse.com/mdn-css_types_length_viewport_percentage_units_dynamic (opens in a new tab)

3. 자바스크립트를 이용한 해결(커스텀 vh)

자바스크립트를 이용해 document 크기가 변경될 때 마다 실제 inner height를 이용해 커스텀 vh를 지정하여 해결 가능합니다.

function setCustomVh() {
  const vh = window.innerHeight * 0.01;
  document.documentElement.style.setProperty('--vh', `${vh}px`);
}
 
setCustomVh();
window.addEventListener('resize', setCustomVh);

이후 --vh 변수를 이용해 아래처럼 사용 가능합니다.

.container {
  height: calc(var(--vh) * 100);
}

참고

https://www.linkedin.com/pulse/understanding-dvh-lvh-svh-css-prabhath-senadheera-wmvkc/ (opens in a new tab)

https://mong-blog.tistory.com/entry/CSSJS-vh-%EB%B2%84%EA%B7%B8-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95dvh-%EC%82%AC%EC%9A%A9%EB%B2%95-js-%EA%B3%84%EC%82%B0%EB%B2%95 (opens in a new tab)

© freejak5520. All rights reserved.