[React] 빌어먹을 iOS - vh 편

2023. 8. 29. 19:22·React/실험실
반응형

웹 개발을 하다보면 가장 큰 스트레스 중 하나가 브라우저이다. 

IE는 처리했고 남은게 사파리 ( iOS ) 그리고 떠오르는 샛별 카카오 브라우저이다.

 

카카오톡은 웹사이트 링크를 타고 들어가면 인웹 브라우저로 실행이 된다. 

근데 요놈도 참 간혹 예상치 못한 말썽을 일으기키는 뇨속이다. 

 

아무튼 iOS에서 발생한 문제를 하나씩 해결하면 올려보겠다. 

 

vh 

아이폰에서 vh를 100으로 설정했을 때, 스크롤을 내린다던지 해서 해당 영역이 짤리는 문제가 있다. 

 

resize 

  useEffect(() => {
    const setViewportHeight = () => {
      let vh = window.innerHeight * 0.01;
      document.documentElement.style.setProperty("--vh", `${vh}px`);
    };

    setViewportHeight();

    window.addEventListener("resize", setViewportHeight);

    return () => {
      window.removeEventListener("resize", setViewportHeight);
    };
  }, []);
  
  <div
    style={{
      height: "calc(100 * var(--vh))"
    }}
  />

첫 번째 해결 방법으로 화면의 뷰포트 크기가 줄어들었을 때 자동으로 뷰포트를 재조정해주는 방식이다. 

 

여기서 window.innerHeight * 0.01을 하는 이유는 

만약 높이가 900px이라면 우리는 이것을 `vh` 로 변환해야한다. 

 

여기서 1vh는 뷰포트의 높이의 1%를 뜻하기 때문에 900px의 1%, 즉 1vh는 9px로 사용한다. 

이렇게 사용하면 vh 단위를 사용하는 곳에서 --vh 변수를 사용하면 되므로 간단하게 처리가 가능하다. 

 

여기서 첫 번째 해결방법이라고 한 이유가 카카오톡에서는 일부 해당 방식이 제대로 작동하지 않는 문제가 있었다. 

 

-webkit-fill-available 

height: 100vh;

@supports (-webkit-touch-callout: none) {
  height: -webkit-fill-available;
}

두 번째 방법으로 -webkit-fill-available 속성을 사용하는 것이다. 

 

여기서 @supports는 특정 기능이 브라우저에 의해 지원되는지 확인하는 데 사용하는 규칙이다. 

-webkit-touch-callout 는 웹킷 기반 브라우저에서 터치하면 나타나는 컨텍스트 메뉴 ( 링크를 길게 누르면 나타나는 메뉴) 의 표시를 제어하는 속성이다. 

 

합쳐서 @supports (-webkit-touch-callout: none)는 브라우저가 -webkit-touch-callout 지원하는지 확인한다. 

결국 iOS 기기에서의 사파리 브라우저를 대상으로 css를 적용하는 속성이다. 

 

-webkit-fill-available

옵션은 뷰포트에서 사용가능한 높이를 사용한다는 것으로 사파리에서 작동한다. 

 

해당 방식을 사용하니 사파리 / 카카오톡 모두 해결이 되었다. 

 

반응형
저작자표시 비영리 변경금지

'React > 실험실' 카테고리의 다른 글

[React] Effect가 필요하지 않을 수 있다.  (1) 2023.11.20
[React] Swiper 잘 쓰기 - AutoPlay Pause Resume  (1) 2023.11.04
[React] 메일 템플릿 만들기  (1) 2023.08.07
[React] day.js vs moment.js  (0) 2023.06.22
[React] dayjs  (0) 2023.06.13
'React/실험실' 카테고리의 다른 글
  • [React] Effect가 필요하지 않을 수 있다.
  • [React] Swiper 잘 쓰기 - AutoPlay Pause Resume
  • [React] 메일 템플릿 만들기
  • [React] day.js vs moment.js
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    react
    영어독학
    ChatGPT
    리액트
    typescript
    타일러영어
    redux
    알고리즘
    영어회화
    CCNA
    바질
    Docker
    Node.js
    자바스크립트
    타입스크립트
    next.js
    네이버 부스트캠프
    리얼클래스
    네트워크
    식물
    Babel
    webpack
    다이소
    ReactNative
    javascript
    덤프
    리얼학습일기
    프로그래머스
    CSS
    바질 키우기
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React] 빌어먹을 iOS - vh 편
상단으로

티스토리툴바