본문으로 건너뛰기

Fullpage Scroll

moveType: "strict", bound, align 옵션을 조합하여 풀페이지 스크롤 UI를 구성합니다.

import Flicking from "@egjs/flicking";
import "@egjs/flicking/dist/flicking.css";
import "./styles.css";

const PAGES = [
  { title: "Page 1", subtitle: "Welcome", color: "#e74c3c" },
  { title: "Page 2", subtitle: "Features", color: "#3498db" },
  { title: "Page 3", subtitle: "Pricing", color: "#2ecc71" },
  { title: "Page 4", subtitle: "Contact", color: "#f39c12" },
  { title: "Page 5", subtitle: "About", color: "#9b59b6" }
];

const camera = document.querySelector(".flicking-camera");
PAGES.forEach(page => {
  const panel = document.createElement("div");
  panel.className = "page-panel";
  panel.style.background = page.color;
  panel.innerHTML = `<span>${page.title}</span><span class="page-subtitle">${page.subtitle}</span>`;
  camera.appendChild(panel);
});

const viewport = document.getElementById("flick");
const btnVertical = document.getElementById("btn-vertical");
const btnHorizontal = document.getElementById("btn-horizontal");

let flicking = new Flicking("#flick", {
  horizontal: false,
  moveType: "strict",
  bound: true,
  align: "prev"
});

btnVertical.addEventListener("click", () => {
  flicking.destroy();
  viewport.classList.add("vertical");
  btnVertical.classList.add("active");
  btnHorizontal.classList.remove("active");
  flicking = new Flicking("#flick", {
    horizontal: false,
    moveType: "strict",
    bound: true,
    align: "prev"
  });
});

btnHorizontal.addEventListener("click", () => {
  flicking.destroy();
  viewport.classList.remove("vertical");
  btnHorizontal.classList.add("active");
  btnVertical.classList.remove("active");
  flicking = new Flicking("#flick", {
    horizontal: true,
    moveType: "strict",
    bound: true,
    align: "prev"
  });
});

요약

주요 옵션

옵션타입설정값역할
moveTypestring"strict"한 번에 한 페이지만 이동
boundbooleantrue양 끝에서 빈 공간 방지
alignstring"prev"페이지를 뷰포트 시작점에 정렬
horizontalbooleanfalse세로 방향 스크롤

방향별 비교

방향horizontal결과필수 설정
세로 (Fullpage)false위/아래 스와이프뷰포트에 height 필수
가로 (Slider)true좌/우 스와이프기본 동작

상세 설명

moveType: "strict"의 역할

moveType: "strict"는 아무리 세게 스와이프해도 정확히 한 패널(한 페이지)만 이동합니다. 이것이 풀페이지 스크롤의 핵심이며, "snap"(기본값)은 세기에 따라 여러 패널을 건너뛸 수 있어 풀페이지에 부적합합니다.

세로 방향 설정

horizontal: false로 설정하면 세로 방향 스크롤이 됩니다. 이때 뷰포트 요소에 반드시 높이(height)를 지정해야 합니다. 풀스크린이라면 100vh, 특정 영역이라면 고정 높이를 사용합니다.

연관 옵션

  • moveType이 핵심: "strict"만 정확히 1페이지씩 이동을 보장
  • bound와의 조합: 마지막 페이지에서 빈 공간이 보이지 않도록 방지
  • align: "prev"와의 조합: 각 페이지를 뷰포트 시작점에 맞춰 빈틈 없이 배치

사용 시나리오

언제 사용하나요?
  • 랜딩 페이지: 섹션별 풀페이지 전환
  • 프레젠테이션 뷰: 슬라이드 넘기기
  • 모바일 앱 온보딩: 단계별 소개 화면

주의사항

주의
  • 세로 방향(horizontal: false)에서 뷰포트에 height를 반드시 설정해야 합니다. 설정하지 않으면 높이가 0이 되어 아무것도 보이지 않습니다.
  • 세로 스크롤 시 브라우저의 기본 스크롤과 충돌할 수 있습니다. preventDefaultOnDrag: true를 함께 사용하면 해결됩니다.

관련 링크

관련 옵션

관련 데모