教程目录

  1. 准备工作
    • 引入 jQuery 和 jQuery UI
    • 准备 HTML 结构
    • 准备 CSS 样式
  2. 最基础的淡入淡出切换
    • 核心思路
    • 完整代码
  3. 带左右箭头和指示器的切换
    • 功能增强
    • HTML 结构调整
    • CSS 样式调整
    • jQuery 代码调整
  4. 使用 jQuery UI 实现滑动切换
    • 优势
    • 代码调整
  5. 总结与最佳实践

准备工作

在开始之前,我们需要准备好三样东西:库文件、HTML 结构和 CSS 样式。

jquery图片切换 教程
(图片来源网络,侵删)

1 引入 jQuery 和 jQuery UI

jQuery UI 是一个基于 jQuery 的库,它提供了许多丰富的交互效果,比如我们的滑动效果。

<head> 标签内引入它们:

<!-- 引入 jQuery 核心库 -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<!-- 引入 jQuery UI 核心库和主题样式 -->
<!-- 我们使用官方 CDN,方便快捷 -->
<link rel="stylesheet" href="https://code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>

2 准备 HTML 结构

创建一个容器来包裹所有的图片,并为第一张图片添加一个 active 类,用于默认显示。

<div class="slider-container">
  <div class="slides">
    <!-- 默认显示第一张,所以给它 active 类 -->
    <img src="https://via.placeholder.com/800x400/FF5733/FFFFFF?text=Slide+1" class="active" alt="Slide 1">
    <img src="https://via.placeholder.com/800x400/33FF57/FFFFFF?text=Slide+2" alt="Slide 2">
    <img src="https://via.placeholder.com/800x400/3357FF/FFFFFF?text=Slide+3" alt="Slide 3">
    <img src="https://via.placeholder.com/800x400/F333FF/FFFFFF?text=Slide+4" alt="Slide 4">
  </div>
</div>

3 准备 CSS 样式

为了确保图片能正确切换,我们需要一些基本的 CSS 样式,关键点:

jquery图片切换 教程
(图片来源网络,侵删)
  • .slides 容器设置 position: relativeoverflow: hidden
  • 每张图片默认都设置为 display: none
  • 通过 .active 类来控制当前显示的图片 (display: block)。
/* 轮播图容器 */
.slider-container {
  width: 800px;
  height: 400px;
  margin: 50px auto;
  position: relative; /* 为内部绝对定位的图片提供参考 */
  border: 1px solid #ccc;
  box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
/* 图片列表容器 */
.slides {
  width: 100%;
  height: 100%;
  position: relative;
}
/* 所有图片默认隐藏 */
.slides img {
  width: 100%;
  height: 100%;
  object-fit: cover; /* 保证图片不变形 */
  display: none; /* 关键:默认隐藏所有图片 */
  position: absolute; /* 让所有图片重叠在一起 */
  top: 0;
  left: 0;
}
/* 当前显示的图片 */
.slides img.active {
  display: block; /* 关键:显示带有 active 类的图片 */
}

实现一:最基础的淡入淡出切换

1 核心思路

  1. 找到所有图片,并存储在一个变量中。
  2. 设置一个定时器,每隔几秒就执行一次切换函数。
  3. 切换函数的逻辑:
    • 找到当前正在显示的图片(带有 active 类的)。
    • 移除它的 active 类,让它隐藏。
    • 找到下一张图片。
    • 如果已经是最后一张,则循环到第一张。
    • 给下一张图片添加 active 类,让它显示。

2 完整代码

将以下 jQuery 代码放在 </body> 标签之前。

<script>
$(document).ready(function(){
  // 1. 获取所有图片
  const $slides = $('.slides img');
  let currentIndex = 0; // 当前显示的图片索引
  // 2. 创建一个切换函数
  function switchSlide() {
    // 移除当前图片的 active 类
    $slides.eq(currentIndex).removeClass('active');
    // 计算下一张图片的索引
    currentIndex = (currentIndex + 1) % $slides.length;
    // 给下一张图片添加 active 类
    $slides.eq(currentIndex).addClass('active');
  }
  // 3. 设置定时器,每3秒切换一次
  setInterval(switchSlide, 3000);
});
</script>

代码解释:

  • $(document).ready(function(){...}): 确保页面所有元素都加载完毕后再执行 jQuery 代码。
  • $('.slides img'): 选择器,选中 .slides 容器内的所有 <img>
  • let currentIndex = 0;: 用一个变量记录当前显示的是第几张图片(索引从0开始)。
  • $slides.eq(currentIndex): .eq() 方法可以根据索引获取集合中的某一个元素。$slides.eq(0) 就是第一张图片。
  • .removeClass('active'): 移除 CSS 类。
  • .addClass('active'): 添加 CSS 类。
  • currentIndex = (currentIndex + 1) % $slides.length;: 这是实现循环的关键。
    • $slides.length 是图片的总数(比如4)。
    • currentIndex 是 3 (最后一张) 时,(3 + 1) % 4 结果是 0,这样就回到了第一张,实现了无缝循环。
  • setInterval(switchSlide, 3000): 设置一个定时器,每隔 3000 毫秒(3秒)就调用一次 switchSlide 函数。

打开你的 HTML 文件,你应该能看到一个自动播放的、带有淡入淡出效果的图片轮播图了!


实现二:带左右箭头和指示器的切换

现在我们给它加上左右箭头和底部的小圆点指示器,让用户可以手动控制。

jquery图片切换 教程
(图片来源网络,侵删)

1 HTML 结构调整

.slider-container 内添加控制按钮和指示器。

<div class="slider-container">
  <!-- ... 图片列表 ... -->
  <!-- 左右箭头 -->
  <button class="prev-btn">&lt;</button>
  <button class="next-btn">&gt;</button>
  <!-- 指示器 -->
  <div class="indicators">
    <span class="indicator active" data-index="0">1</span>
    <span class="indicator" data-index="1">2</span>
    <span class="indicator" data-index="2">3</span>
    <span class="indicator" data-index="3">4</span>
  </div>
</div>

2 CSS 样式调整

为新添加的元素添加样式。

/* ... (之前的CSS保持不变) ... */
/* 左右箭头 */
.prev-btn, .next-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;
  z-index: 10;
  border-radius: 50%;
  transition: background-color 0.3s;
}
.prev-btn {
  left: 10px;
}
.next-btn {
  right: 10px;
}
.prev-btn:hover, .next-btn:hover {
  background-color: rgba(0, 0, 0, 0.8);
}
/* 指示器 */
.indicators {
  position: absolute;
  bottom: 20px;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  gap: 10px;
}
.indicator {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background-color: rgba(255, 255, 255, 0.5);
  cursor: pointer;
  display: inline-block;
}
.indicator.active {
  background-color: white;
}

3 jQuery 代码调整

我们需要增加处理点击事件的功能。

<script>
$(document).ready(function(){
  const $slides = $('.slides img');
  const $indicators = $('.indicator');
  const $prevBtn = $('.prev-btn');
  const $nextBtn = $('.next-btn');
  let currentIndex = 0;
  // 切换函数 (稍微优化,接受一个索引作为参数)
  function goToSlide(index) {
    // 边界检查
    if (index < 0) index = $slides.length - 1;
    if (index >= $slides.length) index = 0;
    $slides.eq(currentIndex).removeClass('active');
    $indicators.eq(currentIndex).removeClass('active');
    currentIndex = index;
    $slides.eq(currentIndex).addClass('active');
    $indicators.eq(currentIndex).addClass('active');
  }
  // 自动播放
  setInterval(() => goToSlide(currentIndex + 1), 3000);
  // 点击上一张
  $prevBtn.on('click', function(){
    goToSlide(currentIndex - 1);
  });
  // 点击下一张
  $nextBtn.on('click', function(){
    goToSlide(currentIndex + 1);
  });
  // 点击指示器
  $indicators.on('click', function(){
    const targetIndex = $(this).data('index'); // 获取 data-index 属性的值
    goToSlide(targetIndex);
  });
});
</script>

代码解释:

  • 我们优化了 switchSlide 函数,重命名为 goToSlide,并让它接收一个目标索引 index
  • 这样无论是自动播放、点击箭头还是点击指示器,都可以调用同一个函数,使代码更简洁、逻辑更清晰。
  • $(this): 在事件处理函数中,this 指向触发事件的 DOM 元素,就是被点击的那个 .indicator
  • .data('index'): 获取该元素上 data-index 属性的值(点击第二个指示器时,会获取到 1)。
  • .on('click', function(){...}): 为元素绑定点击事件。

你的轮播图功能就非常完整了!


实现三:使用 jQuery UI 实现滑动切换

淡入淡出效果很平滑,但滑动切换通常更酷炫,使用 jQuery UI,我们只需要修改几行代码。

1 优势

  • 代码量少:利用现成的动画效果,无需自己写复杂的动画逻辑。
  • 性能好:jQuery UI 的动画经过优化。
  • 效果丰富:除了 slide,还有 fadeblindclip 等多种效果。

2 代码调整

我们只需要修改 goToSlide 函数,利用 jQuery UI 的 .switchClass().animate() 方法。

这里我们使用 .switchClass() 配合 slide 效果。

<!-- 确保你已经引入了 jQuery UI (如1.1节所示) -->
<script>
$(document).ready(function(){
  const $slides = $('.slides img');
  const $indicators = $('.indicator');
  const $prevBtn = $('.prev-btn');
  const $nextBtn = $('.next-btn');
  let currentIndex = 0;
  function goToSlide(index) {
    if (index < 0) index = $slides.length - 1;
    if (index >= $slides.length) index = 0;
    // jQuery UI 的切换类效果
    // 从 'slide-left' 切换到 'slide-right',实现滑动
    // 注意:我们需要预先定义这些类
    $slides.eq(currentIndex).switchClass('slide-active', 'slide-inactive', 'slow');
    $indicators.eq(currentIndex).removeClass('active');
    currentIndex = index;
    $slides.eq(currentIndex).switchClass('slide-inactive', 'slide-active', 'slow');
    $indicators.eq(currentIndex).addClass('active');
  }
  // ... (自动播放和点击事件代码与上面相同) ...
});
</script>

我们需要在 CSS 中添加 jQuery UI 效果所需的类:

/* jQuery UI 滑动效果所需的类 */
.slide-active {
  display: block !important;
  left: 0 !important;
}
.slide-inactive {
  display: block !important; /* 在动画过程中需要显示 */
  left: -100% !important; /* 从左侧滑出 */
}
/* 为下一张图片准备的初始状态 */
.slides img:not(.slide-active) {
  left: 100%; /* 从右侧滑入 */
}

注意:使用 jQuery UI 的滑动效果会比淡入淡出需要更多的 CSS 配合,因为它涉及到元素的位移,在实际项目中,更推荐使用专业的轮播图插件,它们已经处理好了所有细节。


总结与最佳实践

  • 从简单开始:先实现最基础的功能,再逐步添加交互和美化。
  • 代码复用:将核心逻辑(如 goToSlide)封装成函数,避免重复代码。
  • 考虑用户体验
    • 添加 cursor: pointer 让用户知道按钮可以点击。
    • 添加过渡效果 (transition) 让交互更平滑。
    • 考虑添加触摸滑动支持,这对移动端用户很重要(这通常需要更复杂的代码或使用插件)。
  • 使用插件:对于生产环境,强烈建议使用成熟的轮播图插件,如:

这些插件功能强大、性能优异、兼容性好,并且支持响应式设计,能帮你节省大量的开发时间。

希望这份教程能帮助你掌握 jQuery 图片切换的核心技术!