{% block main %}
<style>
.box_pdcommon {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
width: 100%;
height: 180px;
z-index: 1;
background-image: url("https://nakatomishop.sakura.ne.jp/prod/merchandiseimage/25winter/wi2025_top_h250.png");
background-size: cover;
}
.fit-picture_pdcommon3 {
width: 100%;
}
.carousel-container {
display: flex;
gap: 20px;
flex-wrap: wrap;
justify-content: center;
margin-top: 10px;
margin-bottom: 10px;
}
.carousel_common {
position: relative;
width: 320px;
height: 150px;
overflow: hidden;
border: 1px solid #aaa;
border-radius: 5px;
background: #fff;
}
.carousel-track {
display: flex;
transition: transform 0.5s ease-in-out;
}
.carousel-item {
flex: 0 0 100%;
text-align: center;
background: #ddd;
padding: px 0;
font-size: 24px;
}
.prev, .next {
position: absolute;
top: 50%;
transform: translateY(-50%);
background: rgba(0,0,0,0.5);
color: #fff;
border: none;
font-size: 24px;
cursor: pointer;
padding: 5px 10px;
}
.prev { left: 5px; }
.next { right: 5px; }
/* ドットマーカー */
.dots {
position: absolute;
bottom: 10px;
width: 100%;
display: flex;
justify-content: center;
gap: 8px;
}
.dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: rgba(0,0,0,0.3);
cursor: pointer;
transition: background 0.3s;
}
.dot.active {
background: rgba(0,0,0,0.8);
}
/* レスポンシブ */
@media (max-width: 1000px) {
.carousel { width: 45%; }
}
@media (max-width: 600px) {
.carousel { width: 100%; }
}
</style>
<div class="box_pdcommon">
<div class="carousel-container">
<div class="carousel_common" id="carousel1">
<div class="carousel-track">
<div class="carousel-item">
<a href="https://www.nakatomishop.com/products/detail/1404">
<img class="fit-picture_pdcommon3" src="https://nakatomishop.sakura.ne.jp/prod/merchandiseimage/25winter/image_spacification_320_150.png"></a>
</div>
<div class="carousel-item">
<a href="https://www.nakatomishop.com/products/detail/1404">
<img class="fit-picture_pdcommon3" src="https://nakatomishop.sakura.ne.jp/prod/merchandiseimage/25winter/image_spacification_320_150.png"></a>
</div>
<div class="carousel-item">
<a href="https://www.nakatomishop.com/products/detail/1404">
<img class="fit-picture_pdcommon3" src="https://nakatomishop.sakura.ne.jp/prod/merchandiseimage/25winter/image_spacification_320_150.png"></a>
</div>
<div class="carousel-item">
<a href="https://www.nakatomishop.com/products/detail/1404">
<img class="fit-picture_pdcommon3" src="https://nakatomishop.sakura.ne.jp/prod/merchandiseimage/25winter/image_spacification_320_150.png"></a>
</div>
</div>
<button class="prev">‹</button>
<button class="next">›</button>
<div class="dots"></div>
</div>
<div class="carousel_common" id="carousel2">
<div class="carousel-track">
<div class="carousel-item">2-1</div>
<div class="carousel-item">2-2</div>
<div class="carousel-item">2-3</div>
<div class="carousel-item">2-4</div>
</div>
<button class="prev">‹</button>
<button class="next">›</button>
<div class="dots"></div>
</div>
<div class="carousel_common" id="carousel3">
<div class="carousel-track">
<div class="carousel-item">3-1</div>
<div class="carousel-item">3-2</div>
<div class="carousel-item">3-3</div>
<div class="carousel-item">3-4</div>
</div>
<button class="prev">‹</button>
<button class="next">›</button>
<div class="dots"></div>
</div>
</div>
</div>
<script>
document.querySelectorAll('.carousel_common').forEach(carousel => {
const track = carousel.querySelector('.carousel-track');
const items = Array.from(track.children);
const prevButton = carousel.querySelector('.prev');
const nextButton = carousel.querySelector('.next');
const dotsContainer = carousel.querySelector('.dots');
let index = 0;
let slideWidth = carousel.offsetWidth;
// 🧹ドット重複防止
dotsContainer.innerHTML = "";
// ドット生成
items.forEach((_, i) => {
const dot = document.createElement('div');
dot.classList.add('dot');
if (i === 0) dot.classList.add('active');
dot.addEventListener('click', () => {
index = i;
moveToSlide();
updateDots();
resetAuto();
});
dotsContainer.appendChild(dot);
});
const dots = dotsContainer.querySelectorAll('.dot');
const updateSlideWidth = () => {
slideWidth = carousel.offsetWidth;
track.style.transition = 'none';
track.style.transform = `translateX(-${slideWidth * index}px)`;
};
window.addEventListener('resize', updateSlideWidth);
updateSlideWidth();
const moveToSlide = () => {
track.style.transition = 'transform 0.5s ease-in-out';
track.style.transform = `translateX(-${slideWidth * index}px)`;
updateDots();
};
const updateDots = () => {
dots.forEach(dot => dot.classList.remove('active'));
dots[index].classList.add('active');
};
nextButton.addEventListener('click', () => {
index = (index + 1) % items.length;
moveToSlide();
resetAuto();
});
prevButton.addEventListener('click', () => {
index = (index - 1 + items.length) % items.length;
moveToSlide();
resetAuto();
});
// 自動スライド
let interval = setInterval(() => {
index = (index + 1) % items.length;
moveToSlide();
}, 3000);
const resetAuto = () => {
clearInterval(interval);
interval = setInterval(() => {
index = (index + 1) % items.length;
moveToSlide();
}, 3000);
};
carousel.addEventListener('mouseenter', () => clearInterval(interval));
carousel.addEventListener('mouseleave', resetAuto);
// スワイプ操作
let startX = 0;
let isDragging = false;
carousel.addEventListener('touchstart', e => {
startX = e.touches[0].clientX;
isDragging = true;
track.style.transition = 'none';
});
carousel.addEventListener('touchmove', e => {
if (!isDragging) return;
const moveX = e.touches[0].clientX - startX;
track.style.transform = `translateX(${-slideWidth * index + moveX}px)`;
});
carousel.addEventListener('touchend', e => {
isDragging = false;
const diff = e.changedTouches[0].clientX - startX;
if (diff > 50) index = (index - 1 + items.length) % items.length;
else if (diff < -50) index = (index + 1) % items.length;
moveToSlide();
resetAuto();
});
});
</script>
{% endblock %}