React 로딩 스켈레톤 컴포넌트 만들기 (SCSS)

2023. 2. 5.·🎨 프론트엔드 공부/React & Next

📍완성된 이미지

📍구현

2개의 element가 필요하다

- 그라데이션 element

- 백그라운드 element

 

그라데이션 element는 회색 - 흰색 - 회색 이렇게 그라데이션 되게 스타일링한다

 

background element (회색) 위로 그라데이션 element가 지나가게 하면 된다

- 이때, 시작 지점은 | 그라데이션 | 백그라운드 | <- 이 위치

- 그리고 그라데이션 element가 백그라운드 element 위로 완전히 겹쳐지게 우측으로 이동

- overflow hidden을 적용하여 삐져나온 부분이 안보이게 해준다

 

📍코드

- Skeleton.jsx

import "./Skeleton.scss";

const Skeleton = () => {
  return (
    <main>
      <ul className="o-vertical-spacing o-vertical-spacing--l">
        <li className="blog-post o-media">
          <div className="o-media__figure">
            <span
              className="skeleton-box"
              style={{ width: "100px", height: "80px" }}
            ></span>
          </div>
          <div className="o-media__body">
            <div className="o-vertical-spacing">
              <h3 className="blog-post__headline">
                <span className="skeleton-box" style={{ width: "55%" }}></span>
              </h3>
              <p>
                <span className="skeleton-box" style={{ width: "80%" }}></span>
                <span className="skeleton-box" style={{ width: "90%" }}></span>
                <span className="skeleton-box" style={{ width: "83%" }}></span>
                <span className="skeleton-box" style={{ width: "80%" }}></span>
              </p>
              <div className="blog-post__meta">
                <span className="skeleton-box" style={{ width: "70%" }}></span>
              </div>
            </div>
          </div>
        </li>
      </ul>
    </main>
  );
};

export default Skeleton;

 

- Skeleton.scss

.skeleton-box {
  display: inline-block;
  height: 1em; // 부모 요소와 같게
  position: relative;
  overflow: hidden;
  background-color: #DDDBDD;

  &::after {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    transform: translateX(-100%); // 완전히 왼쪽에서 시작
    // 수평 그라데이션
    // 0~20%, 20%~60%, 60%~100% 각 구간 에서 색이 자연스레 바뀜.
    background: linear-gradient(
        90deg,
        rgba(#fff, 0) 0,
        rgba(#fff, 0.2) 20%,
        rgba(#fff, 0.5) 60%,
        rgba(#fff, 0) 100%
    );
    animation: shimmer 2s infinite;
    content: "";
  }

  // 2초에 걸쳐 도형을 겹치게 우측으로 이동
  @keyframes shimmer {
    100% {
      transform: translateX(100%);
    }
  }
}

.blog-post {
  &__headline {
    font-size: 1.25em;
    font-weight: bold;
  }

  &__meta {
    font-size: 0.85em;
    color: #6b6b6b;
  }
}

// OBJECTS

.o-media {
  display: flex;

  &__body {
    flex-grow: 1;
    margin-left: 1em;
  }
}

.o-vertical-spacing {
  > * + * {
    margin-top: 0.75em;
  }

  &--l {
    > * + * {
      margin-top: 2em;
    }
  }
}

// MISC

* {
  box-sizing: border-box;
}

body {
  max-width: 42em;
  margin: 0 auto;
  padding: 3em 1em;
  font-family: 'Karla', sans-serif;
  line-height: 1.4;
}

main {
  margin-top: 3em;
}

 

📍데모 사이트 (codesandbox)

https://codesandbox.io/s/loading-skeleton-yfrnw7

 

loading-skeleton - CodeSandbox

loading-skeleton by jong-k using react, react-dom, react-scripts, sass

codesandbox.io

 

 

📍참고

https://codepen.io/JCLee/pen/dyPejGV

 

Pure CSS Skeleton Loading Animation With Shimmer

See how to build a pure CSS skeleton loading animation with a pure CSS shimmer animation....

codepen.io

 

'🎨 프론트엔드 공부/React & Next' 카테고리의 다른 글
  • React에서 자동 슬라이더(캐러셀) 구현하기
  • [번역] Next.js 에서 styled-components 를 사용하고자 할 때 고려할 것
  • Pre-rendering
  • pages 폴더를 사용할 때 주의 사항
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (513) N
      • 🎨 프론트엔드 공부 (250) N
        • JS & TS (89) N
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
React 로딩 스켈레톤 컴포넌트 만들기 (SCSS)
상단으로

티스토리툴바