jQuery 焦点图教程

本教程将带你完成以下内容:

jquery 焦点图 教程
(图片来源网络,侵删)
  1. 准备工作:了解所需技术和文件结构。
  2. HTML 结构:搭建焦点图的骨架。
  3. CSS 样式:美化焦点图,实现基本布局和动画效果。
  4. jQuery 逻辑:实现核心的自动播放、手动切换、指示器点击等功能。
  5. 完整代码:提供所有代码的整合版本。
  6. 优化与扩展:介绍一些常见的优化和扩展方向。

第一步:准备工作

在开始之前,请确保你已经准备好了以下工具和文件:

  1. jQuery 库:从 jQuery 官网 下载最新版本的 jQuery 文件,或者使用 CDN 链接。
  2. 代码编辑器:如 VS Code、Sublime Text 等。
  3. 浏览器:用于预览和调试。

项目文件结构: 为了方便管理,我们创建一个项目文件夹,结构如下:

jquery-focus-slider/
├── index.html
├── css/
│   └── style.css
├── js/
│   └── script.js
└── lib/
    └── jquery-3.7.1.min.js  (或你下载的 jQuery 文件)

第二步:HTML 结构

index.html 是我们页面的骨架,我们需要一个容器来包裹整个焦点图,里面包含图片列表、左右切换按钮和底部的指示器。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">jQuery 焦点图教程</title>
    <link rel="stylesheet" href="css/style.css">
</head>
<body>
    <div class="slider-container">
        <!-- 焦点图主体,包含所有图片 -->
        <div class="slider">
            <!-- 每张图片用一个 div 表示 -->
            <div class="slide">
                <img src="https://picsum.photos/seed/slide1/800/400.jpg" alt="Slide 1">
            </div>
            <div class="slide">
                <img src="https://picsum.photos/seed/slide2/800/400.jpg" alt="Slide 2">
            </div>
            <div class="slide">
                <img src="https://picsum.photos/seed/slide3/800/400.jpg" alt="Slide 3">
            </div>
            <div class="slide">
                <img src="https://picsum.photos/seed/slide4/800/400.jpg" alt="Slide 4">
            </div>
        </div>
        <!-- 左右切换按钮 -->
        <button class="slider-btn prev-btn">&lt;</button>
        <button class="slider-btn next-btn">&gt;</button>
        <!-- 底部指示器 -->
        <div class="slider-dots">
            <span class="dot active"></span>
            <span class="dot"></span>
            <span class="dot"></span>
            <span class="dot"></span>
        </div>
    </div>
    <!-- 引入 jQuery 库 -->
    <script src="lib/jquery-3.7.1.min.js"></script>
    <!-- 引入我们自己的 JS 文件 -->
    <script src="js/script.js"></script>
</body>
</html>

结构说明

jquery 焦点图 教程
(图片来源网络,侵删)
  • .slider-container:整个焦点图的外层容器,用于定位和设置尺寸。
  • .slider:图片列表的容器,我们将通过移动这个容器来实现切换效果。
  • .slide:单张图片的容器。
  • .slider-btn:左右切换按钮。
  • .slider-dots:指示器容器。
  • .dot:单个指示点。

第三步:CSS 样式

css/style.css 负责所有的视觉呈现,重点是让所有图片重叠在一起,然后通过 .slider 的位移来显示当前图片。

/* 基础重置和样式 */
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f4;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
}
/* 焦点图容器 */
.slider-container {
    position: relative;
    width: 800px; /* 焦点图宽度 */
    height: 400px; /* 焦点图高度 */
    overflow: hidden; /* 隐藏超出容器的部分 */
    border-radius: 8px;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
/* 图片列表容器 */
.slider {
    position: absolute;
    width: 400%; /* 图片数量 * 100% */
    height: 100%;
    display: flex; /* 使用 flex 让所有图片并排 */
    transition: transform 0.5s ease-in-out; /* 平滑过渡动画 */
}
/* 单张图片 */
.slide {
    width: 25%; /* 100% / 图片数量 */
    height: 100%;
}
.slide img {
    width: 100%;
    height: 100%;
    object-fit: cover; /* 保证图片填充且不变形 */
}
/* 左右切换按钮 */
.slider-btn {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    background-color: rgba(0, 0, 0, 0.5);
    color: white;
    border: none;
    font-size: 24px;
    padding: 10px 15px;
    cursor: pointer;
    border-radius: 50%;
    z-index: 10;
    transition: background-color 0.3s;
}
.slider-btn:hover {
    background-color: rgba(0, 0, 0, 0.8);
}
.prev-btn {
    left: 20px;
}
.next-btn {
    right: 20px;
}
/* 底部指示器 */
.slider-dots {
    position: absolute;
    bottom: 20px;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    gap: 10px;
    z-index: 10;
}
/* 单个指示点 */
.dot {
    width: 12px;
    height: 12px;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, 0.5);
    cursor: pointer;
    transition: background-color 0.3s;
}
/* 激活状态的指示点 */
.dot.active {
    background-color: white;
}

样式说明

  • .slider-containeroverflow: hidden 是关键,它切掉了 .slider 移动时超出部分的图片。
  • .sliderwidth: 400% 是因为它包含4张图片,每张占25%的宽度。
  • .slidertransition 属性为 transform 的变化添加了平滑的动画效果。
  • .slidewidth: 25% 确保每张图片在容器中只显示一部分。

第四步:jQuery 逻辑

这是整个焦点图的核心。js/script.js 将处理所有的交互逻辑。

// 等待文档完全加载完毕后执行
$(document).ready(function() {
    // --- 变量定义 ---
    const $slider = $('.slider');
    const $slides = $('.slide');
    const $dots = $('.dot');
    const $prevBtn = $('.prev-btn');
    const $nextBtn = $('.next-btn');
    const slideCount = $slides.length; // 获取图片总数
    let currentIndex = 0; // 当前显示的图片索引
    let slideWidth = $('.slider-container').width(); // 每张图片的宽度
    let interval; // 用于存储定时器的变量
    // --- 初始化函数 ---
    function init() {
        // 设置第一张图片为激活状态
        updateSlider();
        // 开始自动播放
        startAutoPlay();
    }
    // --- 更新焦点图显示状态 ---
    function updateSlider() {
        // 1. 移动 .slider 容器
        // translateX(-${currentIndex * 100}%) 表示向左移动当前索引 * 100% 的距离
        $slider.css('transform', `translateX(-${currentIndex * 100}%)`);
        // 2. 更新指示器状态
        $dots.removeClass('active'); // 移除所有 .dot 的 active 类
        $dots.eq(currentIndex).addClass('active'); // 给当前索引的 .dot 添加 active 类
    }
    // --- 切换到下一张 ---
    function nextSlide() {
        // 如果是最后一张,则切换到第一张,否则索引+1
        currentIndex = (currentIndex + 1) % slideCount;
        updateSlider();
    }
    // --- 切换到上一张 ---
    function prevSlide() {
        // 如果是第一张,则切换到最后一张,否则索引-1
        currentIndex = (currentIndex - 1 + slideCount) % slideCount;
        updateSlider();
    }
    // --- 开始自动播放 ---
    function startAutoPlay() {
        // 清除之前的定时器,防止重复设置
        clearInterval(interval);
        // 设置新的定时器,每3秒切换一次
        interval = setInterval(nextSlide, 3000);
    }
    // --- 停止自动播放 ---
    function stopAutoPlay() {
        clearInterval(interval);
    }
    // --- 事件绑定 ---
    // 点击下一张按钮
    $nextBtn.on('click', function() {
        nextSlide();
        // 用户交互后,重新开始计时
        startAutoPlay();
    });
    // 点击上一张按钮
    $prevBtn.on('click', function() {
        prevSlide();
        // 用户交互后,重新开始计时
        startAutoPlay();
    });
    // 点击指示器
    $dots.on('click', function() {
        // 获取被点击的指示器的索引
        currentIndex = $(this).index();
        updateSlider();
        // 用户交互后,重新开始计时
        startAutoPlay();
    });
    // 鼠标悬停在焦点图上时,停止自动播放
    $('.slider-container').on('mouseenter', stopAutoPlay);
    // 鼠标离开焦点图时,重新开始自动播放
    $('.slider-container').on('mouseleave', startAutoPlay);
    // 窗口大小改变时,重新计算并更新
    $(window).on('resize', function() {
        slideWidth = $('.slider-container').width();
        updateSlider();
    });
    // --- 启动焦点图 ---
    init();
});

jQuery 逻辑详解

jquery 焦点图 教程
(图片来源网络,侵删)
  1. 变量定义:获取所有需要的 jQuery 对象和变量,方便后续使用。
  2. init():初始化函数,设置初始状态并启动自动播放。
  3. updateSlider():这是核心函数,它负责:
    • 通过 transform: translateX() 来移动 .slider,显示正确的图片。
    • 更新底部指示点的激活状态。
  4. nextSlide() / prevSlide():计算下一个或上一个图片的索引,并调用 updateSlider()
  5. startAutoPlay() / stopAutoPlay():使用 setIntervalclearInterval 来控制自动播放。
  6. 事件绑定
    • 为按钮和指示器绑定点击事件,触发相应的切换函数。
    • 重要:用户点击后,调用 startAutoPlay() 重置计时器,这样用户操作后焦点图会重新等待3秒再切换,而不是立即切换。
    • 为焦点图容器绑定 mouseentermouseleave 事件,实现鼠标悬停时暂停、离开时继续播放的功能。
    • 绑定 resize 事件,当窗口大小改变时,重新计算并更新焦点图,保证响应式。

第五步:完整代码整合

将以上三个文件(index.html, css/style.css, js/script.js)按照指定的目录结构保存,然后用浏览器打开 index.html,你就能看到一个功能完整的焦点图了。


第六步:优化与扩展

这个基础版本已经很好用了,但你还可以根据需要进行扩展:

  1. 淡入淡出效果

    • HTML:将 .slide 改为绝对定位,让它们重叠在一起。
    • CSS:移除 .sliderflex 布局,.slide 设置 position: absolute; top: 0; left: 0;,动画从 transform 改为 opacity
    • JS:逻辑变为控制当前图片的 opacity: 1,其他图片的 opacity: 0
  2. 触摸滑动支持

    • 使用 jQuery 的触摸事件插件(如 jQuery Touch Events)或原生 JavaScript 的 touchstart, touchmove, touchend 事件来实现移动端的手势滑动。
  3. 更丰富的动画

    • 使用 Animate.css 这样的 CSS 动画库,为切换添加更多酷炫的进入和离开效果。
  4. 响应式设计

    • 在 CSS 中使用媒体查询(@media),让 .slider-container 的宽度和高度在不同屏幕尺寸下自适应。
  5. 使用现成的插件

    • 如果你想快速实现,可以考虑使用成熟的轮播图插件,它们功能更强大,兼容性更好。
    • Slick:功能非常强大,高度可定制。
    • Owl Carousel 2:同样非常流行,易于使用。
    • Swiper:对移动端和触摸支持极佳,性能优秀。

希望这份详细的教程能帮助你成功创建出属于自己的 jQuery 焦点图!