> 웹 프론트엔드 > JS 튜토리얼 > Svelte를 사용하여 동적 이미지 그리드 구축: 플립 카드 전환 구현

Svelte를 사용하여 동적 이미지 그리드 구축: 플립 카드 전환 구현

Barbara Streisand
풀어 주다: 2024-11-25 05:20:17
원래의
156명이 탐색했습니다.

Building a dynamic image grid with Svelte: implementing flip card transitions

매력적인 사용자 인터페이스를 만들려면 기능과 시각적 매력 사이의 미묘한 균형이 필요한 경우가 많습니다. 이 기사에서는 상태를 효율적으로 관리할 뿐만 아니라 이미지 교체 시 매끄럽고 눈길을 끄는 전환을 제공하는 Svelte를 사용하여 동적 이미지 그리드 구성 요소를 구축하는 방법을 살펴보겠습니다.

비전

새 이미지를 공개하기 위해 개별 카드를 부드럽게 뒤집어 주기적으로 새로 고치는 이미지 그리드를 상상해 보세요.

이렇게 하면 팀 구성원, 제품 카탈로그 또는 한 번에 표시할 수 있는 것보다 더 큰 이미지 컬렉션을 보여주기에 완벽한 매력적인 디스플레이가 만들어집니다.

회원 목록을 보여주는 이미지 그리드 위젯을 위해 이것을 만들어야 했습니다. 회원 이미지는 API에서 제공되며 시간이 지남에 따라 증가합니다.

Svelte로 이것을 구축하기로 결정한 이유는 왜 안 되겠습니까?!

좀 더 진지하게, 저는 필요한 양의 코드로 컴파일되고 웹사이트에 차지하는 공간이 아주 작은 것을 원했습니다.
이를 바탕으로 두 가지 옵션이 있었습니다.

  • 바닐라 자바스크립트로 빌드하기
  • 특히 프로젝트가 매우 작다는 점을 고려하면 매우 작은 번들을 생성하는 자바스크립트 라이브러리를 사용하세요.

게다가 날씬한 모델이 더 간단하고 직관적이라고 생각하므로 특히 이와 같은 소규모 프로젝트에서는 선택의 여지가 있는 경우 이를 기본적으로 사용하겠습니다.

조금 더 자세히 살펴보겠지만, svelte는 다른 솔루션에 비해 작고 복잡한 여러 상태 변경을 매우 간단하게 처리합니다(역시 개인 취향).
일반적으로 일을 망칠 수 있는 방법이 적습니다.

핵심 구성요소

우리의 구현은 두 가지 주요 Svelte 구성 요소로 구성됩니다.

  1. App.svelte - 그리드를 관리하고 이미지 스와핑을 조정하는 주요 구성 요소
  2. MemberImageCard.svelte - 플립 애니메이션 및 이미지 표시를 처리하는 개별 카드

상태 관리: 그리드 뒤의 두뇌

위젯의 핵심은 상태 관리에 있습니다. 우리는 여러 가지 정보를 추적해야 합니다.

let allImages: Image[]; // All available images
let imagesToUse: Image[] = []; // Initial grid images
let imagesInUse: Image[] = []; // Current grid state
let remainingImages: Image[] = []; // Pool of unused images
let imagesSwapMap = new Map<number, Image>(); // Tracks pending swaps
로그인 후 복사
로그인 후 복사
로그인 후 복사

현재 상태를 별도로 추적하는 이유는 무엇입니까?

imageInUse를 ImagesToUse와 별도로 유지하는 이유가 궁금할 것입니다. 이러한 분리는 다음과 같은 몇 가지 중요한 목적을 제공합니다.

  1. 현재 그리드 상태에 대한 단일 정보 소스를 제공합니다
  2. 그리드에 중복된 이미지가 나타나는 것을 방지하는 데 도움이 됩니다
  3. 전체 그리드를 다시 렌더링하지 않고도 효율적인 업데이트가 가능합니다
  4. 교환 작업 중에 그리드 무결성을 유지합니다

스왑 안무: 상세한 모습

이미지 교환 프로세스는 그리드 무결성을 유지하면서 원활한 전환을 보장하도록 세심하게 조정된 순서입니다. switchImages 기능을 단계별로 분석해 보겠습니다.

let allImages: Image[]; // All available images
let imagesToUse: Image[] = []; // Initial grid images
let imagesInUse: Image[] = []; // Current grid state
let remainingImages: Image[] = []; // Pool of unused images
let imagesSwapMap = new Map<number, Image>(); // Tracks pending swaps
로그인 후 복사
로그인 후 복사
로그인 후 복사

1. 풀에서 이미지 선택

먼저 남은 풀에서 교체에 사용할 이미지를 결정해야 합니다.

const switchImages = () => {
  let newImagesSwapMap = new Map<number, Image>()
  let remainingImagesToUse
  let newRemainingImages: Image[]
로그인 후 복사
로그인 후 복사

이 코드는 두 가지 시나리오를 처리합니다.

  • 남은 이미지가 부족하면 다 사용합니다
  • 그렇지 않으면 풀에서 마지막 N개의 이미지를 가져옵니다. 여기서 N은 NUMBER_OF_IMAGES_TO_SWITCH입니다.

2. 그리드 위치 선택

다음으로 그리드에서 이미지를 교환할 위치를 무작위로 선택합니다.

if (remainingImages.length <= NUMBER_OF_IMAGES_TO_SWITCH) {
 // If we have fewer remaining images than needed, use all of them
 remainingImagesToUse = remainingImages.slice(0);
 newRemainingImages = [];
} else {
 // Take the last N images from the remaining pool
 remainingImagesToUse = remainingImages.slice(-NUMBER_OF_IMAGES_TO_SWITCH);
 // Keep the rest for future swaps
 newRemainingImages = remainingImages.slice(0, -NUMBER_OF_IMAGES_TO_SWITCH);
}
로그인 후 복사
로그인 후 복사

그리드 크기 내에 무작위 인덱스 배열이 생성됩니다. 예를 들어 NUMBER_OF_IMAGES_TO_SWITCH가 1이고 NUMBER_OF_IMAGES_TO_USE가 16인 경우 그리드의 위치 7에서 이미지를 교체한다는 것을 나타내는 [7]을 얻을 수 있습니다.

3. 중복 방지

교체를 수행하기 전에 새 이미지가 이미 표시되어 있는지 확인합니다.

indexesToSwap = Array(NUMBER_OF_IMAGES_TO_SWITCH)
 .fill(null)
 .map(() => Math.floor(Math.random() * NUMBER_OF_IMAGES_TO_USE));
로그인 후 복사
로그인 후 복사

이 기능은 동일한 이미지가 그리드에 여러 번 나타나는 것을 방지합니다.

4. 스왑 작업

이제 코어 교환 논리가 나옵니다.

const imageIsInUse = (image: Image) => {
 const inUse = imagesInUse.find((img: Image) => image.picture_url === img.picture_url);
 return inUse;
};
로그인 후 복사

각 교환에서 어떤 일이 발생하는지 분석해 보겠습니다.

  1. 무작위로 선택된 위치(색인)를 얻습니다
  2. 해당 위치에서 현재 이미지를 식별합니다(imageToSwap)
  3. 풀에서 새 이미지를 가져옵니다(imageToSwapWith)
  4. 새 이미지가 유효하고 아직 표시되지 않은 경우:
    • imageSwapMap에 스왑을 기록합니다.
    • imageInUse에서 그리드 상태를 업데이트합니다.
    • 처음에 풀에 이전 이미지를 다시 추가합니다

5. 국가 확정

모든 교체를 수행한 후 상태를 업데이트합니다.

for (let i = 0; i < indexesToSwap.length; i++) {
 let index = indexesToSwap[i];
 let imageToSwap = imagesInUse[index]; // Current image in the grid
 let imageToSwapWith = remainingImagesToUse.pop(); // New image to display

 if (imageToSwapWith && !imageIsInUse(imageToSwapWith)) {
  // Record the swap in our map
  newImagesSwapMap.set(index, imageToSwapWith);
  // Update the swap map to trigger component updates
  imagesSwapMap = newImagesSwapMap;
  // Update the grid state
  imagesInUse[index] = imageToSwapWith;
  // Add the old image back to the pool
  newRemainingImages.unshift(imageToSwap);
 } else {
  return; // Skip if the image is already in use
 }
}
로그인 후 복사

6. 애니메이션 트리거

imageSwapMap은 애니메이션을 실행하는 핵심입니다. 업데이트되면 관련 MemberImageCard 구성 요소가 반응합니다.

remainingImages = newRemainingImages;
imagesInUse = imagesInUse;
로그인 후 복사

MemberImageCard의 반응문:

  1. 스왑에 해당 위치가 포함될 때 감지
  2. 카드 반대편에 새 이미지를 로드합니다
  3. faceOnDisplay를 변경하여 뒤집기 애니메이션을 트리거합니다.
  4. 부드러운 전환을 위해 이미지 로딩 상태를 재설정합니다

이 시스템의 장점은 다음을 보장하면서 원활한 사용자 경험을 유지한다는 것입니다.

  • 그리드에 중복된 이미지가 표시되지 않습니다
  • 이미지가 효율적으로 순환됩니다
  • 그리드는 항상 구조를 유지합니다
  • 애니메이션이 원활하고 예측 가능하게 발생합니다
  • 중복으로 인해 실패한 스왑은 정상적으로 처리됩니다

뒤집기 애니메이션: 부드럽게 만들기

각 MemberImageCard 구성 요소는 CSS 변환 및 전환을 사용하여 자체 플립 애니메이션을 관리합니다. 상태 추적과 CSS의 조합을 통해 마법 같은 일이 일어납니다.

let allImages: Image[]; // All available images
let imagesToUse: Image[] = []; // Initial grid images
let imagesInUse: Image[] = []; // Current grid state
let remainingImages: Image[] = []; // Pool of unused images
let imagesSwapMap = new Map<number, Image>(); // Tracks pending swaps
로그인 후 복사
로그인 후 복사
로그인 후 복사
const switchImages = () => {
  let newImagesSwapMap = new Map<number, Image>()
  let remainingImagesToUse
  let newRemainingImages: Image[]
로그인 후 복사
로그인 후 복사

이미지를 교체해야 할 경우 우리는 다음을 수행합니다.

  1. 뒷면에 새 이미지를 로드하세요
  2. 플립 애니메이션 트리거
  3. 뒤집기가 완료되면 이전 이미지를 정리하세요

더 나은 UX를 위한 프로그레시브 로딩

사용자 경험을 향상하기 위해 프로그레시브 로딩 효과를 구현했습니다.

if (remainingImages.length <= NUMBER_OF_IMAGES_TO_SWITCH) {
 // If we have fewer remaining images than needed, use all of them
 remainingImagesToUse = remainingImages.slice(0);
 newRemainingImages = [];
} else {
 // Take the last N images from the remaining pool
 remainingImagesToUse = remainingImages.slice(-NUMBER_OF_IMAGES_TO_SWITCH);
 // Keep the rest for future swaps
 newRemainingImages = remainingImages.slice(0, -NUMBER_OF_IMAGES_TO_SWITCH);
}
로그인 후 복사
로그인 후 복사

로드되면 이미지가 흐려지기 시작하고 부드럽게 페이드 인되어 세련된 모양과 느낌을 제공합니다.

댄스 일정 잡기

정기적인 이미지 스왑은 Svelte의 onMount 수명 주기 기능을 사용하여 예약됩니다.

indexesToSwap = Array(NUMBER_OF_IMAGES_TO_SWITCH)
 .fill(null)
 .map(() => Math.floor(Math.random() * NUMBER_OF_IMAGES_TO_USE));
로그인 후 복사
로그인 후 복사

결론

이 구현은 역동적이고 매력적인 UI 구성요소를 생성하기 위한 최신 CSS 변환과 결합된 Svelte의 반응형 기능의 강력함을 보여줍니다.

위 내용은 Svelte를 사용하여 동적 이미지 그리드 구축: 플립 카드 전환 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿