통합검색

Javascript

[Javascript] swiper 슬라이드 개수가 모자란 경우 특정 엘리먼트를 찾아 숨김 처리하기

  • 2025.10.25 11:39:04


swiper 를 사용하는 영역에서 navigation 요소가 삽입될 부모 엘리먼트를 하나 만들어 놨는데,
ex) <div class="arrows_wrapper"><div class="arrows">.....navigation 이 곳에 삽입.....</div></div>

swiper 사용시 설정된 slidesPerView 보다 slide의 개수가 적은 경우 navigation 은 swiper에서 노출 시키지 않지만, arrows_wrapper 부모 엘리먼트는 그대로 남아있어.
arrows_wrapper에 설정된 margin, padding등의 스타일로 인해 swiper 하단에 불필요한 공백이 생기는 상황.

아래 코드는 swiper의 슬라이드 개수가 slidesPerView가 적은 경우 arrows_wrapper 엘리먼트를 찾아 숨김 처리하는 코드.


[!]swiper 코드[/!] 
const swiper = new Swiper(wrap.querySelector('.itemlist'), {
    loop: false,
    navigation: {
        prevEl: wrap.querySelector('.arrows_wrapper .arrows .prev'),
        nextEl: wrap.querySelector('.arrows_wrapper .arrows .next'),
        clickable: true
    },
    allowTouchMove: true,      // 모바일/PC 드래그 모두 허용
    simulateTouch: true,       // 마우스로 드래그 허용
    grabCursor: true,           // 마우스 올렸을 때 손바닥 커서
    speed: 500, // 슬라이드 전환 속도
    spaceBetween: 20, // 간격
    breakpoints: {
        1200: {
            slidesPerView: 4 // PC
        },
        750: {
            slidesPerView: 3 // 태블릿
        },
        0: {
            slidesPerView: 2, // 모바일
            spaceBetween: 10, // 간격
        }
    },
    on: {
        init(sw){ toggleUi(sw); },
        resize(sw){ toggleUi(sw); },
        breakpoint(sw){ toggleUi(sw); },
        slidesLengthChange(sw){ toggleUi(sw); }
    },

});


[!]swiper on 에서 실행되는 함수 (swiper 코드 아래 삽입)[/!] 
// 슬라이드 개수 적은 경우 특정 요소 숨김 처리
function toggleUi(sw) {
    const total = getRealSlidesLength(sw);
    const perView = getSlidesPerView(sw) * getRows(sw);
    const shouldHide = total <= perView;

    // 숨겨질 대상. 아래 부분 수정 (sw 기준으로 요소를 찾음.)
    const ele = sw.el.closest('.itemlist_wrap').querySelector('.arrows_wrapper');
    
    if (!ele) return;

    ele.style.display = shouldHide ? 'none' : '';

}
function getSlidesPerView(sw){
    const spv = sw.params.slidesPerView;
    if (spv === 'auto') return sw.slidesPerViewDynamic('current', true) || 1;
    return Number(spv) || 1;
}
function getRows(sw){
    return Number(sw.params.grid?.rows || 1) || 1;
}
function getRealSlidesLength(sw){
    // 1) virtual 모드가 '활성화'된 경우에만 사용
    const virtualEnabled =
        sw.params?.virtual === true ||
        sw.params?.virtual?.enabled === true ||
        sw.virtual?.enabled === true;

    if (virtualEnabled && Array.isArray(sw.virtual?.slides)) {
        return sw.virtual.slides.length;
    }

    // 2) loop 모드: 원본 개수 사용
    if (sw.params?.loop && Array.isArray(sw.originalSlides)) {
        return sw.originalSlides.length;
    }

    // 3) 기본
    return Array.isArray(sw.slides) ? sw.slides.length : 0;
}