※以降の記事では、一部アフィリエイト広告が含まれます。
管理者
"肉体言語倶楽部" 観るならFANZAで決まり♡
信頼のDMM.com運営なので安心して観れるよ 👍👍👍
( 不定期開催だけど 0円キャンペーンも定期開催されているので要チェック♪ )
.simple-carousel-container {
position: relative;
max-width: 800px;
margin: 20px auto;
background: #fff;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
}
.simple-carousel-wrapper {
position: relative;
width: 100%;
height: 360px;
overflow: hidden;
background: #f8f9fa;
}
.simple-carousel-slides {
display: flex;
width: 500%; /* 5枚のスライド */
height: 100%;
transition: transform 0.5s ease;
}
.simple-carousel-slide {
width: 20%; /* 100% ÷ 5枚 */
height: 100%;
flex-shrink: 0;
position: relative;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
}
.simple-carousel-slide img {
max-width: 100%;
max-height: 100%;
object-fit: contain;
object-position: center;
display: block;
}
.simple-carousel-nav {
position: absolute;
top: 50%;
transform: translateY(-50%);
background: rgba(255, 255, 255, 0.9);
border: none;
width: 50px;
height: 50px;
border-radius: 50%;
cursor: pointer;
font-size: 18px;
color: #333;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
z-index: 10;
transition: background 0.3s;
}
.simple-carousel-nav:hover {
background: #fff;
}
.simple-carousel-prev {
left: 15px;
}
.simple-carousel-next {
right: 15px;
}
.simple-carousel-dots {
display: flex;
justify-content: center;
padding: 20px;
background: #f8f9fa;
gap: 8px;
}
.simple-carousel-dot {
width: 12px;
height: 12px;
border-radius: 50%;
border: none;
background: #ccc;
cursor: pointer;
transition: background 0.3s;
}
.simple-carousel-dot.active {
background: #007bff;
}
.simple-carousel-dot:hover {
background: #007bff;
}
@media (max-width: 768px) {
.simple-carousel-wrapper {
height: 250px;
}
.simple-carousel-nav {
width: 40px;
height: 40px;
font-size: 16px;
}
.simple-carousel-prev {
left: 10px;
}
.simple-carousel-next {
right: 10px;
}
}
(function() {
let currentSlide = 0;
let autoPlayInterval = null;
let isUserInteracting = false;
const slideCount = 5;
const slideTime = 4000;
const slidesContainer = document.getElementById('simpleCarouselSlides');
const dotsContainer = document.getElementById('simpleCarouselDots');
const prevBtn = document.querySelector('.simple-carousel-prev');
const nextBtn = document.querySelector('.simple-carousel-next');
const container = document.querySelector('.simple-carousel-container');
if (!slidesContainer) return;
// 安全な自動再生停止
function stopAutoPlay() {
if (autoPlayInterval) {
clearInterval(autoPlayInterval);
autoPlayInterval = null;
}
}
// 安全な自動再生開始
function startAutoPlay() {
stopAutoPlay();
if (!isUserInteracting) {
autoPlayInterval = setInterval(() => {
if (!isUserInteracting) {
nextSlide();
}
}, slideTime);
}
}
// ドットを作成
function createDots() {
dotsContainer.innerHTML = '';
for (let i = 0; i goToSlide(i));
dotsContainer.appendChild(dot);
}
updateDots();
}
// スライド更新
function updateSlide() {
const translateX = -currentSlide * (100 / slideCount);
slidesContainer.style.transform = `translateX(${translateX}%)`;
updateDots();
}
// ドット更新
function updateDots() {
const dots = dotsContainer.querySelectorAll('.simple-carousel-dot');
dots.forEach((dot, index) => {
dot.classList.toggle('active', index === currentSlide);
});
}
// 次のスライド
function nextSlide() {
currentSlide = (currentSlide + 1) % slideCount;
updateSlide();
}
// 前のスライド
function prevSlide() {
currentSlide = (currentSlide - 1 + slideCount) % slideCount;
updateSlide();
}
// 指定スライドへ移動
function goToSlide(index) {
currentSlide = index;
updateSlide();
restartAutoPlay();
}
// 自動再生再開(遅延付き)
function restartAutoPlay() {
stopAutoPlay();
setTimeout(() => {
if (!isUserInteracting) {
startAutoPlay();
}
}, 2000);
}
// ナビゲーションボタンのイベント
prevBtn.addEventListener('click', () => {
isUserInteracting = true;
prevSlide();
setTimeout(() => {
isUserInteracting = false;
restartAutoPlay();
}, 100);
});
nextBtn.addEventListener('click', () => {
isUserInteracting = true;
nextSlide();
setTimeout(() => {
isUserInteracting = false;
restartAutoPlay();
}, 100);
});
// タッチ操作
let touchStartX = 0;
let touchStartTime = 0;
let touchMoved = false;
let isTouching = false;
slidesContainer.addEventListener('touchstart', (e) => {
touchStartX = e.touches[0].clientX;
touchStartTime = Date.now();
touchMoved = false;
isTouching = true;
isUserInteracting = true;
stopAutoPlay();
}, { passive: true });
slidesContainer.addEventListener('touchmove', (e) => {
if (Math.abs(e.touches[0].clientX - touchStartX) > 10) {
touchMoved = true;
}
}, { passive: true });
slidesContainer.addEventListener('touchend', (e) => {
if (!isTouching) return;
const touchEndX = e.changedTouches[0].clientX;
const touchDuration = Date.now() - touchStartTime;
const touchDistance = touchStartX - touchEndX;
// スワイプされた場合
if (touchMoved && Math.abs(touchDistance) > 50 && touchDuration 0) {
nextSlide();
} else {
prevSlide();
}
}
// タップ(スワイプしていない)の場合はリンクを開く
else if (!touchMoved && touchDuration {
isUserInteracting = false;
restartAutoPlay();
}, 300);
}, { passive: true });
// マウスクリック(デスクトップ)
let mouseStartX = 0;
let mouseMoved = false;
let isMouseDown = false;
let hasSlideChanged = false;
slidesContainer.addEventListener('mousedown', (e) => {
mouseStartX = e.clientX;
mouseMoved = false;
isMouseDown = true;
hasSlideChanged = false;
isUserInteracting = true;
stopAutoPlay();
e.preventDefault();
});
slidesContainer.addEventListener('mousemove', (e) => {
if (!isMouseDown) return;
const deltaX = e.clientX - mouseStartX;
if (Math.abs(deltaX) > 10) {
mouseMoved = true;
}
// ドラッグ距離が十分で、まだスライドしていない場合のみ実行
if (mouseMoved && Math.abs(deltaX) > 80 && !hasSlideChanged) {
if (deltaX {
isUserInteracting = false;
restartAutoPlay();
}, 300);
}
});
slidesContainer.addEventListener('mouseup', (e) => {
if (!isMouseDown) return;
// ドラッグしていない場合はクリックとして処理
if (!mouseMoved) {
const slide = e.target.closest('.simple-carousel-slide');
if (slide) {
const url = slide.getAttribute('data-url');
if (url) {
window.open(url, '_blank');
}
}
}
isMouseDown = false;
mouseMoved = false;
hasSlideChanged = false;
setTimeout(() => {
isUserInteracting = false;
restartAutoPlay();
}, 300);
});
slidesContainer.addEventListener('mouseleave', () => {
isMouseDown = false;
mouseMoved = false;
hasSlideChanged = false;
setTimeout(() => {
isUserInteracting = false;
restartAutoPlay();
}, 300);
});
// ホバー時の自動再生制御
container.addEventListener('mouseenter', () => {
isUserInteracting = true;
stopAutoPlay();
});
container.addEventListener('mouseleave', () => {
isUserInteracting = false;
restartAutoPlay();
});
// 初期化
createDots();
updateSlide();
startAutoPlay();
})();

- 品番:d_655936
- 配信開始日:2025-08-27
- 収録時間:64
- レーベル:肉体言語倶楽部
今回の本はサークル遮断活動の給水係さん(@zess_kyuusui)の
オリジナルキャラクター、シスターのエルミナさんを元にした本です
孤児がたくさんいるスケベなシスターさん達の一人らしいです
見た目があまりにも好み過ぎたので描いていいですか!?と
伺った所快くOKをいただけたのでこの本を出す事となりました
給水係さん本当にありがとうございます・・・
...

関連記事も見逃し厳禁だよ!良かったらチェックしてみてね♡
管理者
➡ FANZAブックス読み放題
お試し無料!60000冊超が読み放題!!??