한 줄의 CSS로 해결한 Swiper 렌더링 버그

Yenny·2025년 7월 31일
post-thumbnail

오늘은 React + Swiper 조합에서 발생한 모바일 렌더링 이슈를 transform: translateZ(0) 한 줄로 해결한 경험을 공유하려고 한다.

🚨 문제 상황

증상

  • PC에서는 정상: 모든 요소가 예상대로 렌더링
  • 모바일에서만 문제: '.bottom' 이라는 요소에 position을 absolute로 정해두었는데, 터치할 때 사라졌다가 터치가 끝나면 다시 나타남
  • Swiper를 주석 처리하면 정상으로 보임: 명백히 Swiper와 관련된 문제

코드 구조

<div className={`relative w-full h-full flex items-end ${styles.wrap}`}>
  {/* Swiper 슬라이더 */}
  <Swiper
    direction="horizontal"
    // ...
  >
  </Swiper>

  {/* 문제의 그 요소 */}
  <div className={styles.bottom}>
  	/* ... */
  </div>
</div>

CSS 설정

.bottom {
  display: flex ;
  position: absolute;
  bottom: 0;
  left: 0;
  z-index: 2;
  width: 100%;
  /* ... 그외 스타일 */
}

🔍 문제 분석

  • 1차 추측: opacity
  • 2차 추측: 부모 relative
  • 3차 시도: 이벤트 간섭
    - Swiper의 터치 이벤트가 DOM 조작을 방해하는 것 같아서 이벤트 핸들러를 수정해봤지만 여전했다ㅠㅠ

💡 해결책 발견

그러던 중, AI에게 swiper로 인해 문제가 생기는 사례가 있는지 질문해봤다. 여러 해결책을 제시해주었는데, 그 중 첫 번째 방법인 translateZ(0)을 써보라는것...!
평소에는 translateZ를 쓸 일이 거의 없어서 반신반의하며 스타일을 적용해봤는데,
아니 이런, 완벽하게 해결... 🎉

.bottom {
  /* 기존 스타일들... */
  transform: translateZ(0); /* 이 한 줄이 전부였다! */
}

🤔 왜 이게 작동하는 걸까?

하드웨어 가속의 마법

1. 컴포지팅 레이어 생성

  • 일반 요소: DOM 트리의 일부로 CPU에서 처리
  • 가속 요소: 별도의 GPU 레이어로 분리되어 독립적 처리

2. 렌더링 파이프라인의 변화

  • 🔴 기존 (문제 상황)
    DOM → Layout → Paint → Composite
    ↑ Swiper의 transform이 전체 레이아웃에 영향

  • 🟢 하드웨어 가속 적용 후
    DOM → Layout → Paint → 독립 GPU 레이어
    ↑ Swiper와 격리됨

3. 브라우저의 최적화 전략

  • 브라우저에게 이렇게 말하는 것과 같음:

    "이 요소는 3D 공간에서 움직일 수 있으니
    GPU에서 따로 관리해줘!"

🔧 다른 하드웨어 가속 방법들

  • 같은 효과를 내는 다양한 방법들:
    - 1. will-change: transform;
    - 2. backface-visibility: hidden;
    - 3. 부모 요소에 transform-style: preserve-3d;

🎯 언제 사용해야 할까?

  • ✅ 사용하면 좋은 경우
    - 복잡한 애니메이션이 있는 요소
    - 자주 변경되는 요소 (스크롤, 드래그 등)
    - 다른 애니메이션 라이브러리와 충돌하는 요소
    - 모바일에서 렌더링 이슈가 있는 요소

⚠️ 주의사항: 남발하면 안 됨!

  • 메모리 사용량 증가: 각 레이어마다 GPU 메모리 사용
  • 배터리 소모: GPU 사용으로 인한 전력 소비
  • 오버드로우: 너무 많은 레이어는 성능 저하

📱 모바일에서 특히 중요한 이유

  • 터치 이벤트의 복잡성
    - javascript 모바일 브라우저의 터치 처리 과정
    - touchstart → touchmove → 리플로우 발생 → 렌더링 지연
    모바일 GPU의 특성

💭 배운 점

  1. 때로는 근본 원인보다 우회가 더 효율적: 복잡한 이벤트 핸들링보다 한 줄의 CSS가 더 나은 해결책이다.
  2. 하드웨어 가속의 힘: 브라우저의 렌더링 엔진을 이해하면 예상치 못한 문제들을 해결할 수 있다.
  3. 모바일 우선 디버깅: 모바일에서만 나타나는 문제들은 대부분 성능 최적화와 관련이 있다.

마무리

웹 개발에서 가장 재미있는 순간 중 하나는 바로 이런 "아하!" 순간이다. 복잡해 보이는 문제가 간단한 해결책으로 풀릴 때의 그 쾌감.......!
이번에 css 한 줄이 해결해준 것은 단순한 렌더링 문제가 아니라, 브라우저 엔진의 작동 원리에 대한 깊은 이해였다. 다음에 비슷한 문제를 만난다면, 이번에 배운대로 해결해 봐야겠다!

profile
✨프론트엔드 개발 공부 중인 정예은 입니다.

0개의 댓글