Files
sam-kd/www/image-slider.html
hskwon aca1767eb9 초기 커밋: 5130 레거시 시스템
- URL 하드코딩 → .env APP_URL 기반 동적 URL로 변경
- DB 연결 하드코딩 → .env 기반으로 변경
- MySQL strict mode DATE 오류 수정
2025-12-10 20:14:31 +09:00

173 lines
5.3 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>이미지 슬라이드쇼</title>
<style>
.slider-container {
position: relative;
width: 800px;
height: 400px;
margin: 0 auto;
overflow: hidden;
}
.slider {
display: flex;
transition: transform 0.5s ease-in-out;
}
.slide {
min-width: 100%;
height: 400px;
}
.slide img {
width: 100%;
height: 100%;
object-fit: cover;
}
.slider-button {
position: absolute;
top: 50%;
transform: translateY(-50%);
background: rgba(0, 0, 0, 0.5);
color: white;
padding: 10px 15px;
border: none;
cursor: pointer;
font-size: 18px;
}
.prev {
left: 10px;
}
.next {
right: 10px;
}
.slider-dots {
position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 10px;
}
.dot {
width: 12px;
height: 12px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.5);
cursor: pointer;
}
.dot.active {
background: white;
}
</style>
</head>
<body>
<div class="slider-container">
<div class="slider">
<!-- 이미지가 여기에 동적으로 로드됩니다 -->
</div>
<button class="slider-button prev"></button>
<button class="slider-button next"></button>
<div class="slider-dots">
<!-- 도트가 여기에 동적으로 생성됩니다 -->
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const slider = document.querySelector('.slider');
const dotsContainer = document.querySelector('.slider-dots');
const prevButton = document.querySelector('.prev');
const nextButton = document.querySelector('.next');
let currentSlide = 0;
let slides = [];
let dots = [];
// Google Drive에서 이미지 로드
fetch('load_slider_images.php')
.then(response => response.json())
.then(images => {
if (images.error) {
console.error(images.error);
return;
}
// 슬라이드 생성
images.forEach((image, index) => {
// 슬라이드 추가
const slide = document.createElement('div');
slide.className = 'slide';
slide.innerHTML = `<img src="${image.url}" alt="${image.name}">`;
slider.appendChild(slide);
// 도트 추가
const dot = document.createElement('div');
dot.className = 'dot' + (index === 0 ? ' active' : '');
dotsContainer.appendChild(dot);
});
// 슬라이드와 도트 요소 업데이트
slides = document.querySelectorAll('.slide');
dots = document.querySelectorAll('.dot');
// 초기 슬라이드 표시
updateSlider();
})
.catch(error => console.error('이미지 로드 중 오류 발생:', error));
function updateSlider() {
slider.style.transform = `translateX(-${currentSlide * 100}%)`;
dots.forEach((dot, index) => {
dot.classList.toggle('active', index === currentSlide);
});
}
function nextSlide() {
currentSlide = (currentSlide + 1) % slides.length;
updateSlider();
}
function prevSlide() {
currentSlide = (currentSlide - 1 + slides.length) % slides.length;
updateSlider();
}
// 자동 슬라이드
let slideInterval = setInterval(nextSlide, 5000);
// 버튼 클릭 이벤트
nextButton.addEventListener('click', () => {
clearInterval(slideInterval);
nextSlide();
slideInterval = setInterval(nextSlide, 5000);
});
prevButton.addEventListener('click', () => {
clearInterval(slideInterval);
prevSlide();
slideInterval = setInterval(nextSlide, 5000);
});
// 도트 클릭 이벤트
dotsContainer.addEventListener('click', (e) => {
if (e.target.classList.contains('dot')) {
clearInterval(slideInterval);
currentSlide = Array.from(dots).indexOf(e.target);
updateSlider();
slideInterval = setInterval(nextSlide, 5000);
}
});
});
</script>
</body>
</html>