jQuery 焦点图教程
本教程将带你完成以下内容:

(图片来源网络,侵删)
- 准备工作:了解所需技术和文件结构。
- HTML 结构:搭建焦点图的骨架。
- CSS 样式:美化焦点图,实现基本布局和动画效果。
- jQuery 逻辑:实现核心的自动播放、手动切换、指示器点击等功能。
- 完整代码:提供所有代码的整合版本。
- 优化与扩展:介绍一些常见的优化和扩展方向。
第一步:准备工作
在开始之前,请确保你已经准备好了以下工具和文件:
- jQuery 库:从 jQuery 官网 下载最新版本的 jQuery 文件,或者使用 CDN 链接。
- 代码编辑器:如 VS Code、Sublime Text 等。
- 浏览器:用于预览和调试。
项目文件结构: 为了方便管理,我们创建一个项目文件夹,结构如下:
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"><</button>
<button class="slider-btn next-btn">></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>
结构说明:

(图片来源网络,侵删)
.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-container的overflow: hidden是关键,它切掉了.slider移动时超出部分的图片。.slider的width: 400%是因为它包含4张图片,每张占25%的宽度。.slider的transition属性为transform的变化添加了平滑的动画效果。.slide的width: 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 对象和变量,方便后续使用。
init():初始化函数,设置初始状态并启动自动播放。updateSlider():这是核心函数,它负责:- 通过
transform: translateX()来移动.slider,显示正确的图片。 - 更新底部指示点的激活状态。
- 通过
nextSlide()/prevSlide():计算下一个或上一个图片的索引,并调用updateSlider()。startAutoPlay()/stopAutoPlay():使用setInterval和clearInterval来控制自动播放。- 事件绑定:
- 为按钮和指示器绑定点击事件,触发相应的切换函数。
- 重要:用户点击后,调用
startAutoPlay()重置计时器,这样用户操作后焦点图会重新等待3秒再切换,而不是立即切换。 - 为焦点图容器绑定
mouseenter和mouseleave事件,实现鼠标悬停时暂停、离开时继续播放的功能。 - 绑定
resize事件,当窗口大小改变时,重新计算并更新焦点图,保证响应式。
第五步:完整代码整合
将以上三个文件(index.html, css/style.css, js/script.js)按照指定的目录结构保存,然后用浏览器打开 index.html,你就能看到一个功能完整的焦点图了。
第六步:优化与扩展
这个基础版本已经很好用了,但你还可以根据需要进行扩展:
-
淡入淡出效果:
- HTML:将
.slide改为绝对定位,让它们重叠在一起。 - CSS:移除
.slider的flex布局,.slide设置position: absolute; top: 0; left: 0;,动画从transform改为opacity。 - JS:逻辑变为控制当前图片的
opacity: 1,其他图片的opacity: 0。
- HTML:将
-
触摸滑动支持:
- 使用 jQuery 的触摸事件插件(如 jQuery Touch Events)或原生 JavaScript 的
touchstart,touchmove,touchend事件来实现移动端的手势滑动。
- 使用 jQuery 的触摸事件插件(如 jQuery Touch Events)或原生 JavaScript 的
-
更丰富的动画:
- 使用 Animate.css 这样的 CSS 动画库,为切换添加更多酷炫的进入和离开效果。
-
响应式设计:
- 在 CSS 中使用媒体查询(
@media),让.slider-container的宽度和高度在不同屏幕尺寸下自适应。
- 在 CSS 中使用媒体查询(
-
使用现成的插件:
- 如果你想快速实现,可以考虑使用成熟的轮播图插件,它们功能更强大,兼容性更好。
- Slick:功能非常强大,高度可定制。
- Owl Carousel 2:同样非常流行,易于使用。
- Swiper:对移动端和触摸支持极佳,性能优秀。
希望这份详细的教程能帮助你成功创建出属于自己的 jQuery 焦点图!
