안녕하세요

[UX] 동적 width의 image가 로드되기 전과 후 레이아웃 다른 문제 해결 - 스켈레톤 본문

유튜브컨텐츠탐색-StelLife

[UX] 동적 width의 image가 로드되기 전과 후 레이아웃 다른 문제 해결 - 스켈레톤

sakuraop 2023. 8. 23. 15:41

문제 상황: 동적으로 width가 달라지는 상황에서 height를 고정해줄 수 없다.

로드 전 사진: image가 로드되기 전에는 height가 비어있다.

로드 후 사진: 로드 된 image 만큼 height가 채워진다.


해결방법: img를 감싸는 박스에 img 비율만큼의 높이를 미리 지정한다.

      <div className="thumbnail-ratio">
        <img src={video.thumbnailsUrl} alt="" />
      </div>

박스의 높이를 padding-top 을 이용해 만들어 주고,

img를 absolute로 크기를 미리 갖도록 한다.

      .thumbnail-ratio {
        position: relative;
        width: 100%;
        padding-top: 56.25%; /* 16:9 비율의 경우 */
        img {
          position: absolute;
          top: 0;
          left: 0;
          width: 100%;
          height: 100%;
        }
      }

이는 레이지 로드를 적용하거나 빠른 이용자 경험을 위한 스켈레톤 방식이라고 보면 된다.

 

실제 데이터가 들어갈 골조를 모두 구현한 뒤에 먼저 렌더링 하고,

img와 같이 비동기 처리되는 데이터는 이 골조에 끼워넣는 방식이다.

유튜브에서 매일마다 보는 그 로딩 화면이다.

 

그런데 유튜브는 끼워넣기 방식이 아니라,

 

이 스켈레톤 레이아웃 자체를 하나의 컴포넌트로 가지고, 비동기 처리가 끝나면 

이 스켈레톤 레이아웃을 치우고, 보여주고 싶은 데이터를 포함한 새로운 컴포넌트를 보여주는 듯하다.

(잘 살펴보면 다르다)

 

레이지 로드를 적용하지 않으면 이와 같은 방식이 될 것이고,

 

레이지 로드를 적용한다면 스켈레톤에 비동기로 불러온 img 데이터를 로드시키는 방식이 될 것이다.