Shift+Wheel to Swiper Bullet for ZOD.kr

Shift + 마우스휠로 Swiper 페이지 이동

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         Shift+Wheel to Swiper Bullet for ZOD.kr
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Shift + 마우스휠로 Swiper 페이지 이동
// @author
// @match        https://zod.kr/*
// @grant        none
// @license MIT

// ==/UserScript==

(function () {
    'use strict';

    /**
     * 스크립트 초기화
     */
    function initSwiperShiftScroll() {
        // 현재 페이지 내 모든 Swiper 영역을 탐색
        const swiperPaginations = document.querySelectorAll('.swiper-pagination');

        swiperPaginations.forEach((paginationEl) => {
            // 이미 이벤트가 붙어있다면 재등록 방지
            if (paginationEl.getAttribute('data-shift-scroll-initialized') === 'true') {
                return;
            }

            // 실제로 휠 이벤트를 받을 .swiper 부모 컨테이너
            const swiperContainer = paginationEl.closest('.swiper');
            if (!swiperContainer) return;

            swiperContainer.addEventListener('wheel', function (event) {
                // Shift 키가 눌려있는 경우에만 동작
                if (event.shiftKey) {
                    event.preventDefault();

                    // 불릿 리스트 가져오기
                    const bullets = paginationEl.querySelectorAll('.swiper-pagination-bullet');
                    if (!bullets || bullets.length === 0) return;

                    // 현재 활성화된 불릿 인덱스 찾기
                    let activeIndex = 0;
                    for (let i = 0; i < bullets.length; i++) {
                        if (bullets[i].getAttribute('aria-current') === 'true') {
                            activeIndex = i;
                            break;
                        }
                    }

                    // event.deltaY > 0 이면 → 다음 슬라이드로
                    // event.deltaY < 0 이면 → 이전 슬라이드로
                    if (event.deltaY > 0) {
                        // 다음 불릿이 있으면 클릭
                        if (activeIndex < bullets.length - 1) {
                            bullets[activeIndex + 1].click();
                        }
                    } else {
                        // 이전 불릿이 있으면 클릭
                        if (activeIndex > 0) {
                            bullets[activeIndex - 1].click();
                        }
                    }
                }
            }, { passive: false });

            // 중복 방지 마크
            paginationEl.setAttribute('data-shift-scroll-initialized', 'true');
        });
    }

    // DOM 변경을 감지하면서, 새로 생긴 Swiper에도 동일 동작을 적용
    const observer = new MutationObserver(() => {
        initSwiperShiftScroll();
    });
    observer.observe(document.body, {
        childList: true,
        subtree: true,
    });

    // 처음 스크립트가 실행될 때도 한 번 초기화
    initSwiperShiftScroll();
})();