기본 콘텐츠로 건너뛰기

slick with Dragdealer

FRONTEND / UI LIBRARY

🔗 슬라이더 동기화: slick.js와 Dragdealer를 연결하여 커스텀 프로그레스 바 구현

웹사이트에서 슬라이더(캐러셀)는 흔하지만, 드래그 가능한 컨트롤 바(Slider Bar)와 슬라이더를 완벽하게 동기화하는 것은 고급 기술입니다. 이 글은 인기 있는 slick.js 슬라이더와 Dragdealer를 결합하여 양방향 제어 시스템을 구축하는 방법을 분석합니다.

1. HTML 구조: 슬라이더와 드래그 바

슬라이더를 위한 `.center`와 드래그 바를 위한 `#rolling_Bar` 및 `.handle` 구조가 필요합니다. `Dragdealer`는 내부 `.handle` 요소를 드래그하여 `#rolling_Bar` 영역 내에서 움직이게 합니다.

<!-- (1) slick 슬라이더 영역 -->
<div class="content">
    <div class="center">
        <div><div class="slide prod"><a href="#">... (슬라이드 내용 1) ...</a></div></div>
        <div><div class="slide prod"><a href="#">... (슬라이드 내용 2) ...</a></div></div>
        <div><div class="slide prod"><a href="#">... (슬라이드 내용 3) ...</a></div></div>
    </div>
</div>

<!-- (2) Dragdealer 바 영역 -->
<div id="rolling_Bar" class="rolling_Bar dragdealer" >
    <span class='handle'>
        <img id="barImage" src="./images/rolling_bar_on.png" alt="롤링on이미지" />
    </span>
</div>

2. JavaScript (jQuery): 슬라이더 동기화 로직

핵심은 두 플러그인 간의 **이벤트 리스너**와 **API 호출**을 통해 상태를 서로 업데이트하는 것입니다.

<script type="text/javascript"> 
    var slick; // slick 인스턴스
    var drag; // Dragdealer 인스턴스

    $(document).ready(function(){
        var count = $(".slide").length; // 전체 슬라이드 개수 (steps 설정에 사용)
        
        // 1. slick 슬라이더 초기화
        slick = $('.center').slick({
            arrows: false,
            centerMode: true,
            infinite: true,
            centerPadding: '230px',
            slidesToShow: 1,
            autoplay : true,
            autoplaySpeed : 100000 // 재생 속도를 매우 길게 설정 (거의 정지 상태로 사용)
        }); 

        // 2. Dragdealer 초기화
        drag = new Dragdealer('rolling_Bar',{
            x: 0,
            steps: count, // 슬라이드 개수만큼 스텝 설정
            callback : function(x,y){
                // (A) Dragdealer -> slick 동기화 (사용자가 바를 조작했을 때)
                var currentSlide = drag.getStep()[0] - 1 ;
                if($('.center').slick('slickCurrentSlide') != currentSlide){
                    $('.center').slick('slickGoTo', currentSlide);
                }
            }
        }); 

        // 3. slick 이벤트 바인딩 (slick -> Dragdealer 동기화)
        $(".center").on('afterChange', function(event, slick, currentSlide){
            // (B) slick -> Dragdealer 동기화 (슬라이더가 변경되었을 때)
            drag.setStep($('.center').slick('slickCurrentSlide') + 1)
        });

        // 4. Dragdealer 핸들 크기 초기 설정
        $("#barImage").width(drag.getStepWidth())

    });
</script>

2.1. Dragdealer 초기화 (`steps`와 `callback`)

  • `steps: count`: Dragdealer 바를 **슬라이드 개수**만큼의 '단계'로 나눕니다. (예: 슬라이드 3개면, 바를 3등분하여 각 단계에 멈춥니다.)
  • **콜백 함수 (A):** 사용자가 바를 드래그하여 멈출 때 실행됩니다. `drag.getStep()[0]`으로 현재 단계를 얻은 후, `slickGoTo` API를 사용하여 해당 슬라이드로 이동시킵니다. (인덱스 보정: `getStep()`은 1부터 시작, `slickGoTo`는 0부터 시작하므로 `-1` 처리)

2.2. slick 이벤트 바인딩 (`afterChange`)

  • **`afterChange` 이벤트 (B):** slick 슬라이더가 이동을 마칠 때마다 발생합니다.
  • `drag.setStep(...)`: `slickCurrentSlide()`로 현재 슬라이더 인덱스를 얻은 후, Dragdealer의 `setStep` API를 사용하여 드래그 바의 위치를 해당 단계로 이동시킵니다. (인덱스 보정: `setStep`은 1부터 시작하므로 `+1` 처리)

3. 결론: 양방향 동기화의 완성

이 코드는 **슬라이더의 상태 변경 → 드래그 바 업데이트** (B) 와 **드래그 바의 조작 → 슬라이더 이동** (A)이라는 두 가지 핵심 로직을 통해 완벽하게 양방향으로 동기화된 커스텀 UI를 구축했습니다.

💡 Tip: 이 방식은 디자인 제약이 많은 프로젝트에서 슬라이더의 기본 UI를 대체하고, 사용자에게 새로운 형태의 탐색 경험을 제공하는 데 유용합니다.

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...