html+js 轮播图

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>轮播图示例</title>
    <style>
        /* 基本样式 */
        body {
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            background-color: #f0f0f0;
            font-family: Arial, sans-serif;
        }

        /* 轮播图容器 */
        .carousel {
            width: 600px;
            height: 400px;
            position: relative;
            overflow: hidden;
            border-radius: 10px;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
        }

        /* 图片容器 */
        .carousel-images {
            display: flex;
            width: 100%;
            height: 100%;
            transition: transform 0.5s ease-in-out;
        }

        /* 图片样式 */
        .carousel-images img {
            width: 100%;
            height: 100%;
            object-fit: cover;
            flex-shrink: 0;
        }

        /* 左右按钮 */
        .carousel-button {
            position: absolute;
            top: 50%;
            transform: translateY(-50%);
            background-color: rgba(0, 0, 0, 0.5);
            color: white;
            border: none;
            padding: 10px;
            cursor: pointer;
            font-size: 18px;
            border-radius: 50%;
            transition: background-color 0.3s ease;
        }

        .carousel-button:hover {
            background-color: rgba(0, 0, 0, 0.8);
        }

        /* 左按钮 */
        .carousel-button.prev {
            left: 10px;
        }

        /* 右按钮 */
        .carousel-button.next {
            right: 10px;
        }

        /* 指示器容器 */
        .carousel-indicators {
            position: absolute;
            bottom: 10px;
            left: 50%;
            transform: translateX(-50%);
            display: flex;
            gap: 5px;
        }

        /* 指示器样式 */
        .carousel-indicators span {
            width: 10px;
            height: 10px;
            background-color: rgba(255, 255, 255, 0.5);
            border-radius: 50%;
            cursor: pointer;
            transition: background-color 0.3s ease;
        }

        .carousel-indicators span.active {
            background-color: white;
        }
    </style>
</head>
<body>
    <!-- 轮播图容器 -->
    <div class="carousel">
        <!-- 图片容器 -->
        <div class="carousel-images">
            <img src="https://image.meiye.art/pic_1631411429199mjIE7yxqjZxWNdOvWLxL2?imageMogr2/thumbnail/640x/interlace/1" alt="Image 1">
            <img src="https://image.meiye.art/pic_16324946992753vSLEv0P2s-1PY95ynOZn?imageMogr2/thumbnail/640x/interlace/1" alt="Image 2">
            <img src="https://image.meiye.art/pic_1628403749737?imageMogr2/thumbnail/640x/interlace/1" alt="Image 3">
        </div>

        <!-- 左右按钮 -->
        <button class="carousel-button prev">&lt;</button>
        <button class="carousel-button next">&gt;</button>

        <!-- 指示器 -->
        <div class="carousel-indicators">
            <span class="active"></span>
            <span></span>
            <span></span>
        </div>
    </div>

    <script>
        // 获取元素
        const carouselImages = document.querySelector('.carousel-images');
        const prevButton = document.querySelector('.carousel-button.prev');
        const nextButton = document.querySelector('.carousel-button.next');
        const indicators = document.querySelectorAll('.carousel-indicators span');

        let currentIndex = 0; // 当前显示的图片索引
        const totalImages = carouselImages.children.length; // 图片总数

        // 更新指示器状态
        function updateIndicators() {
            indicators.forEach((indicator, index) => {
                indicator.classList.toggle('active', index === currentIndex);
            });
        }

        // 切换到指定图片
        function goToImage(index) {
            if (index < 0) {
                index = totalImages - 1; // 如果小于0,切换到最后一张
            } else if (index >= totalImages) {
                index = 0; // 如果超出范围,切换到第一张
            }
            currentIndex = index;
            carouselImages.style.transform = `translateX(-${currentIndex * 100}%)`;
            updateIndicators();
        }

        // 切换到上一张图片
        prevButton.addEventListener('click', () => {
            goToImage(currentIndex - 1);
        });

        // 切换到下一张图片
        nextButton.addEventListener('click', () => {
            goToImage(currentIndex + 1);
        });

        // 点击指示器切换图片
        indicators.forEach((indicator, index) => {
            indicator.addEventListener('click', () => {
                goToImage(index);
            });
        });

        // 自动播放
        let autoPlayInterval = setInterval(() => {
            goToImage(currentIndex + 1);
        }, 3000);

        // 鼠标悬停时停止自动播放
        const carousel = document.querySelector('.carousel');
        carousel.addEventListener('mouseenter', () => {
            clearInterval(autoPlayInterval);
        });

        // 鼠标离开时恢复自动播放
        carousel.addEventListener('mouseleave', () => {
            autoPlayInterval = setInterval(() => {
                goToImage(currentIndex + 1);
            }, 3000);
        });
    </script>
</body>
</html>
相关推荐
人工智能训练师1 小时前
Ubuntu22.04如何安装新版本的Node.js和npm
linux·运维·前端·人工智能·ubuntu·npm·node.js
Seveny071 小时前
pnpm相对于npm,yarn的优势
前端·npm·node.js
yddddddy2 小时前
css的基本知识
前端·css
昔人'2 小时前
css `lh`单位
前端·css
前端君2 小时前
实现最大异步并发执行队列
javascript
破无差3 小时前
《赛事报名系统小程序》
小程序·html·uniapp
Nan_Shu_6144 小时前
Web前端面试题(2)
前端
知识分享小能手4 小时前
React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
前端·javascript·vue.js·学习·react.js·react·anti-design-vue
蚂蚁RichLab前端团队5 小时前
🚀🚀🚀 RichLab - 花呗前端团队招贤纳士 - 【转岗/内推/社招】
前端·javascript·人工智能
孩子 你要相信光5 小时前
css之一个元素可以同时应用多个动画效果
前端·css