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

2025년 7월 18일 (금) 16:38 판

MEMORIAL SITE

장소로 알아보는
열흘 간의 항쟁 기록

그날의 기억이 머문 장소들을 따라가며, 시간 속에 남은 이야기를 천천히 만나보세요.
번호를 따라가며 클릭하면, 장소마다 담긴 역사적 의미와 당시의 이야기를 자세히 살펴볼 수 있습니다. 광주의 골목골목에 스며든 기억과 그날의 진실과 마주해보세요.

3D ASSET

3D로 보는 광주 인문 아카이브

AR Heritage

광주의 근현대 역사와 문화를 엿볼 수 있는 유산들을 증강현실

광주의 역사적 명소와 문화예술 거점을 AR 콘텐츠로 체험할 수 있는 투어입니다.
실시간 위치 정보와 장소의 맥락을 제공하여 시민들이 지역 인문자원을 향유하도록 기획되었습니다.
AR을 통해 광주 시민들이 공유하는 기억과 감성을 생생하게 느낄 수 있습니다.