coForward Slider 사용 매뉴얼

CFcoForward InstallKit
Project Collaboration Guide

coForward Slider

콘텐츠를 자동으로 순환 표시하는 슬라이더 컴포넌트입니다.

Slider는 리스트 형태의 콘텐츠를 좌우 또는 상하 방향으로 자연스럽게 반복 이동시킵니다.

방향과 속도를 자유롭게 설정할 수 있으며, 마우스 오버 시 자동으로 일시 정지됩니다.

↔️

4방향 슬라이드

좌·우·상·하 방향을 모두 지원합니다.

속도 설정

슬라이드 이동 속도를 자유롭게 변경할 수 있습니다.

♾️

무한 반복

콘텐츠를 자연스럽게 이어서 반복 표시합니다.

⏸️

자동 일시정지

마우스를 올리면 슬라이드가 일시 정지됩니다.

▶️

재생 제어

시작과 정지를 API로 제어할 수 있습니다.

📄

리스트 기반

UL 목록만으로 간단하게 슬라이드를 구성할 수 있습니다.

coForward Slider 소개

coForward Slider는 컨테이너 안의 첫 번째 ul 목록을 복제한 뒤 requestAnimationFrame()으로 자동 이동시키는 사내 공통 JavaScript 컴포넌트입니다.

별도 스타일 파일은 사용하지 않습니다. Slider.js가 실행되면 컨테이너와 ul에 필요한 기본 표시 설정을 코드에서 직접 적용합니다.

이 문서에서 다루는 기능

기능 설명
자동 슬라이드 컨테이너 안의 목록을 자동으로 이동시킵니다.
무한 반복 표시 첫 번째 ul을 복제해 이어지는 목록처럼 표시합니다.
방향 설정 left, right, up, down 값을 지정할 수 있습니다.
속도 설정 숫자 값으로 한 프레임당 이동 속도를 조정합니다.
마우스 일시 정지 컨테이너에 마우스를 올리면 정지하고, 벗어나면 다시 시작합니다.
수동 제어 startSlide(), stopSlide()로 직접 시작·정지할 수 있습니다.

필수 준비물

  • Slider 클래스 파일
  • 슬라이더를 표시할 HTML 컨테이너
  • 컨테이너 안의 첫 번째 ul 목록
  • ES Module을 지원하는 브라우저 또는 프로젝트 번들러

적용 준비

HTML 작성

슬라이더 컨테이너 안에 하나의 ul 목록을 준비합니다.

<div id="exchangeRateSlider">
    <ul>
        <li>USD/KRW 1,380.50원 ▲ 2.30</li>
        <li>EUR/KRW 1,492.80원 ▼ 1.20</li>
        <li>JPY/KRW(100엔) 928.40원 ▲ 0.75</li>
        <li>CNY/KRW 190.65원 ▼ 0.18</li>
    </ul>
</div>

<script type="module" src="/js/exchange-rate-slider.js"></script>

📌 참고
JavaScript 경로는 프로젝트의 실제 정적 리소스 경로에 맞게 변경합니다.

클래스 불러오기

페이지용 JavaScript 파일에서 클래스를 import합니다.

// exchange-rate-slider.js
import Slider from '/path/to/Slider.js';

기본 생성 및 실행

슬라이더는 다음 순서로 생성합니다.

import Slider from '/path/to/Slider.js';

const container = document.getElementById('exchangeRateSlider');

if (!container) {
    throw new Error('슬라이더 컨테이너를 찾을 수 없습니다.');
}

const slider = new Slider(container, 'left');
slider.setSpeed(0.5);

기본 적용 순서

HTML 컨테이너와 ul 목록 준비
↓
클래스 import
↓
컨테이너 요소 조회
↓
인스턴스 생성
↓
필요 시 속도 또는 방향 변경

⚠️ 중요
Slider는 별도의 render() 메서드가 없습니다. new Slider(container, direction)을 호출하면 내부 초기화와 슬라이드 시작이 함께 실행됩니다.


HTML 구조

Slider는 컨테이너 안의 첫 번째 ul을 기준으로 동작합니다.

기본 구조

<div id="logoSlider">
    <ul>
        <li>Alpha</li>
        <li>Beta</li>
        <li>Gamma</li>
        <li>Delta</li>
    </ul>
</div>

컨테이너 안에 ul이 없으면 슬라이드가 시작되지 않습니다.

초기화 후 내부 동작

new Slider(container, direction)을 호출하면 다음 처리가 실행됩니다.

처리 설명
마우스 이벤트 등록 mouseenter에 정지, mouseleave에 재시작 이벤트를 등록합니다.
기존 복제 목록 정리 컨테이너 안에 ul이 여러 개 있으면 첫 번째 ul만 남깁니다.
목록 복제 첫 번째 ul을 복제해 컨테이너 뒤쪽에 추가합니다.
기본 스타일 적용 컨테이너와 ul에 위치·정렬 관련 인라인 스타일을 적용합니다.
자동 시작 초기화가 끝나면 startSlide()를 호출합니다.

방향별 목록 구조

가로 방향(left, right)은 일반 ul > li 구조를 그대로 사용할 수 있습니다.

<div id="horizontalSlider">
    <ul>
        <li>항목 1</li>
        <li>항목 2</li>
        <li>항목 3</li>
    </ul>
</div>

세로 방향(up, down)도 같은 HTML 구조를 사용합니다.

<div id="verticalSlider">
    <ul>
        <li>첫 번째 공지</li>
        <li>두 번째 공지</li>
        <li>세 번째 공지</li>
    </ul>
</div>

📌 참고
Slider.jsuldisplay: flexflex-wrap: nowrap을 직접 적용합니다. 따라서 프로젝트에 별도 스타일 파일이 없어도 기본 동작은 가능합니다.


방향 설정

생성자 두 번째 인자 또는 setDirection()으로 방향을 지정합니다.

const slider = new Slider(container, 'left');

실행 중 방향을 변경할 수도 있습니다.

slider.setDirection('up');
설명
left 왼쪽으로 이동합니다.
right 오른쪽으로 이동합니다.
up 위쪽으로 이동합니다.
down 아래쪽으로 이동합니다.

유효하지 않은 값을 전달하면 방향은 변경되지 않고 Console에 경고가 출력됩니다.

slider.setDirection('left');
slider.setDirection('wrong'); // Invalid direction 경고

속도 설정

setSpeed(speed)로 슬라이드 속도를 변경합니다.

slider.setSpeed(0.5);
설명
0.3 느리게 이동합니다.
0.5 기본값과 같은 속도입니다.
1 빠르게 이동합니다.
2 매우 빠르게 이동합니다.

speed는 0보다 큰 숫자만 적용됩니다.

slider.setSpeed(1);
slider.setSpeed(0);      // 적용되지 않음
slider.setSpeed('fast'); // 적용되지 않음

📌 참고
속도 값은 한 프레임에서 이동하는 픽셀 값으로 사용됩니다. 화면 크기와 목록 길이에 따라 체감 속도가 달라질 수 있습니다.


일시 정지와 재시작

Slider는 기본적으로 마우스 이벤트를 등록합니다.

이벤트 동작
mouseenter 슬라이드를 정지합니다.
mouseleave 슬라이드를 다시 시작합니다.

필요하면 메서드로 직접 제어할 수 있습니다.

<button id="stopSlider" type="button">정지</button>
<button id="startSlider" type="button">시작</button>
const stopButton = document.getElementById('stopSlider');
const startButton = document.getElementById('startSlider');

stopButton.addEventListener('click', () => {
    slider.stopSlide();
});

startButton.addEventListener('click', () => {
    slider.startSlide();
});

startSlide()는 이미 실행 중이면 중복 실행하지 않습니다.


통합 예제

아래 예제는 KRW 기준 환율 목록을 왼쪽 방향으로 자동 슬라이드하고, 버튼으로 속도와 정지 상태를 제어합니다.

표시된 환율은 사용 예시를 위한 임의의 값입니다.

HTML

<div id="exchangeRateSlider">
    <ul>
        <li>USD/KRW 1,380.50원 ▲ 2.30</li>
        <li>EUR/KRW 1,492.80원 ▼ 1.20</li>
        <li>JPY/KRW(100엔) 928.40원 ▲ 0.75</li>
        <li>CNY/KRW 190.65원 ▼ 0.18</li>
    </ul>
</div>

<button id="slowSlider" type="button">느리게</button>
<button id="fastSlider" type="button">빠르게</button>
<button id="stopSlider" type="button">정지</button>
<button id="startSlider" type="button">시작</button>

<script type="module" src="/js/exchange-rate-slider.js"></script>

JavaScript

import Slider from '/path/to/Slider.js';

const container = document.getElementById('exchangeRateSlider');
const slowButton = document.getElementById('slowSlider');
const fastButton = document.getElementById('fastSlider');
const stopButton = document.getElementById('stopSlider');
const startButton = document.getElementById('startSlider');

if (!container || !slowButton || !fastButton || !stopButton || !startButton) {
    throw new Error('슬라이더 적용에 필요한 HTML 요소가 없습니다.');
}

const slider = new Slider(container, 'left');

slowButton.addEventListener('click', () => {
    slider.setSpeed(0.3);
});

fastButton.addEventListener('click', () => {
    slider.setSpeed(1);
});

stopButton.addEventListener('click', () => {
    slider.stopSlide();
});

startButton.addEventListener('click', () => {
    slider.startSlide();
});

실행 데모

LIVE DEMO

환율 카드가 자동으로 반복 이동합니다. 방향과 속도를 바꾸거나 시작·정지할 수 있으며, 카드 위에 마우스를 올리면 일시 정지합니다.

  • USD/KRW1,380.50원 ▲ 2.30
  • EUR/KRW1,492.80원 ▼ 1.20
  • JPY/KRW(100엔)928.40원 ▲ 0.75
  • CNY/KRW190.65원 ▼ 0.18
상태: 실행 중

문제 해결

슬라이더가 시작되지 않습니다.

다음 항목을 확인합니다.

  1. 클래스 파일이 올바른 경로에서 import되었는지 확인합니다.
  2. 슬라이더 컨테이너가 실제로 존재하는지 확인합니다.
  3. 컨테이너 안에 ul이 있는지 확인합니다.
  4. ul 안에 표시할 li가 있는지 확인합니다.
  5. 브라우저 개발자 도구의 Console 오류를 확인합니다.
const container = document.getElementById('exchangeRateSlider');
console.log(container);
console.log(container?.querySelector('ul'));

목록이 두 개로 늘어납니다.

정상 동작입니다. Slider는 무한 반복 표시를 위해 첫 번째 ul을 복제합니다.

const container = document.getElementById('exchangeRateSlider');
console.log(container.querySelectorAll('ul').length); // 2

슬라이드가 움직이지 않는 것처럼 보입니다.

목록의 실제 너비 또는 높이가 0이면 이동 범위를 계산할 수 없습니다.

다음 항목을 확인합니다.

  • li에 내용이 있는지 확인합니다.
  • 컨테이너와 uldisplay: none 상태에서 초기화되지 않았는지 확인합니다.
  • new Slider(container, direction)이 컨테이너가 화면에 배치된 뒤 호출되는지 확인합니다.

방향이 변경되지 않습니다.

setDirection()에는 left, right, up, down 중 하나만 전달합니다.

slider.setDirection('right');
slider.setDirection('up');

잘못된 값을 전달하면 Console에 다음 경고가 출력됩니다.

Invalid direction. Use "left", "right", "up", or "down".

속도 변경이 적용되지 않습니다.

setSpeed()는 0보다 큰 숫자만 적용합니다.

slider.setSpeed(0.5); // 적용
slider.setSpeed(0);   // 적용되지 않음

같은 컨테이너에 다시 적용해야 합니다.

setContainer(container)를 호출하면 컨테이너를 다시 초기화합니다. 기존에 복제된 ul이 여러 개 있으면 첫 번째 ul만 남기고 나머지를 제거합니다.

slider.setContainer(container);

API 요약

주요 속성

속성 기본값 설명
container null 슬라이더가 적용될 HTML 요소입니다.
direction left 이동 방향입니다. left, right, up, down을 사용할 수 있습니다.
animationFrame null requestAnimationFrame() ID를 저장합니다.
isRunning false 슬라이드 실행 상태입니다.
speed 0.5 한 프레임당 이동 픽셀 값입니다.

주요 메서드

메서드 설명
constructor(container, direction) 컨테이너와 방향을 받아 슬라이더를 생성하고 초기화합니다.
setContainer(container) 슬라이더 컨테이너를 설정하고 다시 초기화합니다.
setSpeed(speed) 0보다 큰 숫자인 경우 슬라이드 속도를 변경합니다.
setDirection(direction) 이동 방향을 변경합니다. 실행 중이면 멈춘 뒤 다시 시작합니다.
startSlide() 슬라이드를 시작합니다. 이미 실행 중이면 다시 시작하지 않습니다.
stopSlide() 슬라이드를 정지하고 animation frame을 해제합니다.

© team coForward