SOURCE

console 命令行工具 X clear

                    
>
console
document.addEventListener('DOMContentLoaded', () => {
    const wrapper = document.querySelector('.swiper-wrapper');
    const slides = document.querySelectorAll('.swiper-slide');
    const pagination = document.querySelector('.swiper-pagination');

    let currentIndex = 0;
    const slideCount = slides.length;
    let startX = 0; // 记录开始拖拽的坐标
    let currentTranslate = 0; // 当前滑块的偏移量
    let isDragging = false; // 是否处于拖拽状态

    // 初始化分页指示器
    slides.forEach((_, index) => {
        const bullet = document.createElement('div');
        bullet.className = 'swiper-pagination-bullet';
        if (index === 0) bullet.classList.add('active');
        bullet.addEventListener('click', () => goToSlide(index));
        pagination.appendChild(bullet);
    });

    // 切换到指定 slide
    function goToSlide(index) {
        currentIndex = index;
        currentTranslate = -index * window.innerWidth;
        wrapper.style.transition = 'transform 0.3s ease';
        wrapper.style.transform = `translateX(${currentTranslate}px)`;
        updatePagination();
    }

    // 更新分页指示器状态
    function updatePagination() {
        document.querySelectorAll('.swiper-pagination-bullet').forEach((bullet, index) => {
            bullet.classList.toggle('active', index === currentIndex);
        });
    }

    // 处理拖拽开始
    function handleDragStart(event) {
        startX = event.type === 'mousedown' ? event.pageX : event.touches[0].clientX;
        isDragging = true;
        wrapper.style.transition = 'none'; // 取消动画,保证拖拽流畅
    }

    // 处理拖拽过程
    function handleDragMove(event) {
        if (!isDragging) return;
        const currentX = event.type === 'mousemove' ? event.pageX : event.touches[0].clientX;
        const deltaX = currentX - startX;
        wrapper.style.transform = `translateX(${currentTranslate + deltaX}px)`;
    }

    // 处理拖拽结束
    function handleDragEnd(event) {
        if (!isDragging) return;
        isDragging = false;
        const endX = event.type === 'mouseup' ? event.pageX : event.changedTouches[0].clientX;
        const deltaX = endX - startX;

        // 判断滑动距离是否超过 1/4 滑块宽度,决定是否切换滑块
        if (deltaX > window.innerWidth / 4 && currentIndex > 0) {
            goToSlide(currentIndex - 1); // 向右滑
        } else if (deltaX < -window.innerWidth / 4 && currentIndex < slideCount - 1) {
            goToSlide(currentIndex + 1); // 向左滑
        } else {
            goToSlide(currentIndex); // 回弹到当前滑块
        }
    }

    // 绑定事件 (PC 端)
    wrapper.addEventListener('mousedown', handleDragStart);
    window.addEventListener('mousemove', handleDragMove);
    window.addEventListener('mouseup', handleDragEnd);

    // 绑定事件 (移动端)
    wrapper.addEventListener('touchstart', handleDragStart);
    window.addEventListener('touchmove', handleDragMove);
    window.addEventListener('touchend', handleDragEnd);
});
<div class="swiper-container">
	<div class="swiper-wrapper">
		<div class="swiper-slide" style="background-color: #42b983;">Slide 1</div>
		<div class="swiper-slide" style="background-color: #ff6f61;">Slide 2</div>
		<div class="swiper-slide" style="background-color: #6a5acd;">Slide 3</div>
		<div class="swiper-slide" style="background-color: #ffa500;">Slide 4</div>
	</div>
	<div class="swiper-pagination"></div>
</div>
/* Swiper 容器 */

.swiper-container {
    width: 100%;
    overflow: hidden;
    position: relative;
    border: 1px solid #ddd;
}


/* 滑动区域 */

.swiper-wrapper {
    display: flex;
    transition: transform 0.5s ease;
}


/* 单个滑块 */

.swiper-slide {
    min-width: 100%;
    height: 200px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: white;
    font-size: 2rem;
}


/* 分页指示器 */

.swiper-pagination {
    position: absolute;
    bottom: 10px;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    gap: 8px;
}

.swiper-pagination-bullet {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, 0.6);
    cursor: pointer;
    transition: background-color 0.3s;
}

.swiper-pagination-bullet.active {
    background-color: #42b983;
}