본문으로 건너뛰기

Sync

여러 Flicking 인스턴스를 동기화합니다. 대표적으로 메인 이미지와 썸네일 갤러리를 연동할 때 사용합니다.

import Flicking from "@egjs/flicking";
import { Sync } from "@egjs/flicking-plugins";
import "@egjs/flicking/dist/flicking.css";
import "./styles.css";

const IMAGES = [
  "https://picsum.photos/seed/sync1/600/300",
  "https://picsum.photos/seed/sync2/600/300",
  "https://picsum.photos/seed/sync3/600/300",
  "https://picsum.photos/seed/sync4/600/300",
  "https://picsum.photos/seed/sync5/600/300",
  "https://picsum.photos/seed/sync6/600/300"
];

const mainCamera = document.querySelector("#main .flicking-camera");
const thumbCamera = document.querySelector("#thumb .flicking-camera");

IMAGES.forEach(src => {
  const mainPanel = document.createElement("div");
  mainPanel.className = "main-panel";
  mainPanel.innerHTML = `<img src="${src}" />`;
  mainCamera.appendChild(mainPanel);

  const thumbPanel = document.createElement("div");
  thumbPanel.className = "thumb-panel";
  thumbPanel.innerHTML = `<img src="${src}" />`;
  thumbCamera.appendChild(thumbPanel);
});

const mainFlicking = new Flicking("#main", { bounce: 30, preventDefaultOnDrag: true });
const thumbFlicking = new Flicking("#thumb", {
  bound: true,
  bounce: 30,
  moveType: "freeScroll",
  preventDefaultOnDrag: true
});

mainFlicking.addPlugins(
  new Sync({
    type: "index",
    synchronizedFlickingOptions: [
      { flicking: mainFlicking, isSlidable: true },
      { flicking: thumbFlicking, isClickable: true, activeClass: "active" }
    ]
  })
);

요약

주요 옵션

옵션타입기본값설명
type"camera" | "index""camera"동기화 방식. camera는 카메라 위치, index는 패널 인덱스 기준 동기화
synchronizedFlickingOptionsSyncOption[][]동기화할 Flicking 인스턴스와 옵션 목록

SyncOption

옵션타입설명
flickingFlicking동기화할 Flicking 인스턴스
isSlidableboolean드래그로 슬라이드 가능 여부
isClickableboolean클릭으로 해당 패널로 이동 가능 여부
activeClassstring활성 패널에 추가될 CSS 클래스

상세 설명

동기화 타입

타입설명사용 예
camera모든 Flicking의 카메라 위치를 동시에 이동같은 콘텐츠를 다른 뷰로 표시
index하나의 Flicking에서 패널을 변경하면 다른 Flicking도 같은 인덱스로 이동메인 이미지 + 썸네일

프레임워크별 사용법

ReactuseRefuseEffect로 인스턴스에 접근합니다:

const mainRef = useRef(null);
const thumbRef = useRef(null);
const [plugins, setPlugins] = useState([]);

useEffect(() => {
setPlugins([new Sync({
type: "index",
synchronizedFlickingOptions: [
{ flicking: mainRef.current, isSlidable: true },
{ flicking: thumbRef.current, isClickable: true, activeClass: "active" }
]
})]);
}, []);

Vueref()onMounted로 인스턴스에 접근합니다:

const mainRef = ref(null);
const thumbRef = ref(null);
const plugins = ref([]);

onMounted(() => {
plugins.value = [new Sync({
type: "index",
synchronizedFlickingOptions: [
{ flicking: mainRef.value, isSlidable: true },
{ flicking: thumbRef.value, isClickable: true, activeClass: "active" }
]
})];
});

주의사항

주의
  • Sync 플러그인은 Flicking 인스턴스가 마운트된 후에 생성해야 합니다. React에서는 useEffect, Vue에서는 onMounted를 사용하세요.
  • index 타입에서 동기화된 Flicking들의 패널 수가 같아야 올바르게 동작합니다.
  • 플러그인은 동기화 대상 중 하나의 Flicking에만 추가(addPlugins)하면 됩니다.

관련 링크

관련 데모

  • Arrow: 화살표 네비게이션과 함께 사용
  • Pagination: 페이지 인디케이터와 함께 사용