"광주 문화예술 인문스토리 플랫폼2"의 두 판 사이의 차이
광주문화예술인문스토리플랫폼
1,056번째 줄: | 1,056번째 줄: | ||
</script> | </script> | ||
<script src="https://cdn.jsdelivr.net/npm/keen-slider@6.8.5/keen-slider.min.js"></script> | <script src="https://cdn.jsdelivr.net/npm/keen-slider@6.8.5/keen-slider.min.js"></script> | ||
− | + | <script> | |
− | + | var animation = { | |
− | + | duration: (document.querySelectorAll('.keen-slider__slide').length / 2) * 500, | |
− | + | easing: t => t, | |
− | + | }; | |
− | + | ||
− | + | // 변수 초기화 | |
− | + | let slider = null; | |
− | + | let slider2 = null; | |
− | + | let autoplayActive = true; | |
− | + | let autoplayTimeoutId = null; | |
− | + | let isSyncingSlider1 = false; | |
− | + | let isSyncingSlider2 = false; | |
− | + | let isMouseOverContainer = false; // 컨테이너 마우스 상태 추적 변수 | |
− | + | // 슬라이더 2 먼저 초기화 | |
− | + | slider2 = new KeenSlider('#my-keen-slider2', { | |
− | + | loop: true, | |
− | + | renderMode: 'performance', | |
− | + | mode: 'free', | |
− | + | rtl: true, | |
− | + | slides: { | |
− | + | perView: 'auto', | |
− | + | spacing: 8, | |
− | + | }, | |
− | + | breakpoints: { | |
− | + | '(min-width: 500px)': { | |
− | + | slides: { | |
− | + | perView: 'auto', | |
− | + | spacing: 28, | |
− | + | }, | |
− | + | }, | |
− | + | }, | |
− | + | created(s) { | |
− | + | if (!isMouseOverContainer) { | |
− | + | s.moveToIdx(5, true, animation); | |
− | + | } | |
− | + | }, | |
− | + | animationEnded(s) { | |
− | + | // if (!isMouseOverContainer) { | |
− | + | slider2.endTimer = setTimeout(()=>{ | |
− | + | slider?.moveToIdx(slider.track.details.abs + 4, true, animation); | |
− | + | s.moveToIdx(s.track.details.abs + 5, true, animation); | |
− | + | },1000) | |
− | + | // } | |
− | + | }, | |
− | + | detailsChanged(s) { | |
− | + | // 마우스가 컨테이너 위에 있을 때만 동기화 작동 | |
− | + | if(slider2?.endTimer) clearTimeout(slider2?.endTimer); | |
− | + | if (!isSyncingSlider1) { | |
− | + | if(slider){ | |
− | + | if(slider.track){ | |
− | + | slider.animator.stop(); | |
− | + | isSyncingSlider2 = true; | |
− | + | // 위치 동기화 | |
− | + | const position = s.track.details.position; | |
− | + | slider.track.to(position); | |
− | + | setTimeout(() => { | |
− | + | isSyncingSlider2 = false; | |
− | + | }, 30); | |
− | + | } | |
− | + | } | |
− | + | } | |
− | + | }, | |
− | + | }); | |
− | + | ||
− | + | // slider1 초기화 | |
− | + | slider = new KeenSlider('#my-keen-slider', { | |
− | + | loop: true, | |
− | + | renderMode: 'performance', | |
− | + | mode: 'free', | |
− | + | breakpoints: { | |
− | + | '(min-width: 500px)': { | |
− | + | slides: { | |
− | + | perView: 'auto', | |
− | + | spacing: 28, | |
− | + | }, | |
− | + | }, | |
− | + | }, | |
− | + | slides: { | |
− | + | perView: 'auto', | |
− | + | spacing: 8, | |
− | + | }, | |
− | + | created(s) { | |
− | + | if (!isMouseOverContainer) { | |
− | + | s.moveToIdx(5, true, animation); | |
− | + | } | |
− | + | }, | |
− | + | animationEnded(s) { | |
− | + | // if (!isMouseOverContainer) { | |
− | + | slider.endTimer = setTimeout(()=>{ | |
− | + | slider2?.moveToIdx(slider2.track.details.abs + 4, true, animation); | |
− | + | s.moveToIdx(s.track.details.abs + 5, true, animation); | |
− | + | },1000) | |
− | + | // } | |
− | + | }, | |
− | + | detailsChanged(s) { | |
− | + | if(slider?.endTimer) clearTimeout(slider?.endTimer); | |
− | + | // 마우스가 컨테이너 위에 있을 때만 동기화 작동 | |
− | + | if (!isSyncingSlider2 ) { | |
− | + | if(slider2){ | |
− | + | if(slider2.track){ | |
− | + | slider2.animator.stop(); | |
− | + | isSyncingSlider1 = true; | |
− | + | slider2.track.to(s.track.details.position); | |
− | + | setTimeout(() => { | |
− | + | isSyncingSlider1 = false; | |
− | + | }, 30); | |
− | + | } | |
− | + | } | |
− | + | } | |
− | + | }, | |
− | + | }); | |
− | + | ||
− | + | // 컨테이너 하나에만 마우스 이벤트 적용 | |
− | + | document.querySelector('.asset-swiper').addEventListener('pointerdown', () => { | |
− | + | // 타임아웃 삭제 | |
− | + | if (autoplayTimeoutId) clearTimeout(autoplayTimeoutId); | |
− | + | ||
+ | // 현재 진행 중인 애니메이션 중단 | ||
+ | if (slider ){ | ||
+ | if(slider.animator){ | ||
+ | slider.animator.stop(); | ||
+ | } | ||
+ | } | ||
+ | if (slider2){ | ||
+ | if(slider2.animator){ | ||
+ | slider2.animator.stop(); | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | </script> | ||
</body> | </body> | ||
}} | }} |