Swipe 轮播

引入

基础用法

每个 SwipeItem 代表一张轮播卡片,可以通过 属性设置自动轮播的间隔。

  1. <van-swipe class="my-swipe" :autoplay="3000" indicator-color="white">
  2. <van-swipe-item>1</van-swipe-item>
  3. <van-swipe-item>2</van-swipe-item>
  4. <van-swipe-item>3</van-swipe-item>
  5. <van-swipe-item>4</van-swipe-item>
  6. </van-swipe>
  7. <style>
  8. color: #fff;
  9. font-size: 20px;
  10. line-height: 150px;
  11. text-align: center;
  12. background-color: #39a9ed;
  13. }
  14. </style>

图片懒加载

当 Swipe 中含有图片时,可以配合 Lazyload 组件实现图片懒加载。

  1. <van-swipe :autoplay="3000">
  2. <van-swipe-item v-for="(image, index) in images" :key="index">
  3. <img v-lazy="image" />
  4. </van-swipe-item>
  5. </van-swipe>
  1. import Vue from 'vue';
  2. import { Lazyload } from 'vant';
  3. Vue.use(Lazyload);
  4. export default {
  5. data() {
  6. return {
  7. images: [
  8. 'https://img01.yzcdn.cn/vant/apple-1.jpg',
  9. 'https://img01.yzcdn.cn/vant/apple-2.jpg',
  10. ],
  11. },
  12. };

监听 change 事件

  1. import { Toast } from 'vant';
  2. export default {
  3. methods: {
  4. Toast('当前 Swipe 索引:' + index);
  5. },
  6. },
  7. };

纵向滚动

设置 vertical 属性后滑块会纵向排列,此时需要指定滑块容器的高度。

  1. <van-swipe style="height: 200px;" vertical>
  2. <van-swipe-item>1</van-swipe-item>
  3. <van-swipe-item>2</van-swipe-item>
  4. <van-swipe-item>3</van-swipe-item>
  5. <van-swipe-item>4</van-swipe-item>
  6. </van-swipe>

滑块默认宽度为 100%,可以通过 width 属性设置单个滑块的宽度。纵向滚动模式下,可以通过 height 属性设置单个滑块的高度。

  1. <van-swipe :loop="false" :width="300">
  2. <van-swipe-item>1</van-swipe-item>
  3. <van-swipe-item>2</van-swipe-item>
  4. <van-swipe-item>3</van-swipe-item>
  5. <van-swipe-item>4</van-swipe-item>
  6. </van-swipe>

自定义指示器

通过 indicator 插槽可以自定义指示器的样式。

  1. export default {
  2. data() {
  3. return {
  4. current: 0,
  5. };
  6. methods: {
  7. onChange(index) {
  8. this.current = index;
  9. },
  10. },
  11. };

Swipe Props

Swipe Events

事件名说明回调参数
change每一页轮播结束后触发index, 当前页的索引

SwipeItem Events

Swipe 方法

通过 ref 可以获取到 Swipe 实例并调用实例方法,详见组件实例方法

方法名说明参数返回值
prev切换到上一轮播--
next切换到下一轮播--
swipeTo切换到指定位置index: number, options: Options-
resize外层元素大小或组件显示状态变化时,可以调用此方法来触发重绘--

Swipe Slots

名称说明
default轮播内容
indicator自定义指示器

样式变量

组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考。

滑动轮播时为什么触发了 click 事件?

这种情况通常是由于项目中引入了fastclick库导致的。fastclick的原理是通过 Touch 事件模拟出 click 事件,而 Swipe 内部默认会阻止 touchmove 事件冒泡,干扰了 fastclick 的判断,导致出现这个问题。

在桌面端无法操作组件?

参见桌面端适配

Swipe 组件功能太少,无法实现复杂效果?

Vant 中的 Swipe 组件是比较轻量的,因此功能也比较基础。如果需要更复杂的轮播效果,推荐使用社区里一些优质的轮播库,比如 vue-awesome-swiper

Swipe 组件在挂载时,会获取自身的宽度,并计算出轮播图的位置。如果组件一开始处于隐藏状态,则获取到的宽度永远为 0,因此无法正确计算位置。

解决方法

方法一,如果是使用 v-show 来控制组件展示的,则替换为 v-if 即可解决此问题:

  1. <!-- Before -->
  2. <van-swipe v-show="show" />
  3. <!-- After -->
  1. <van-swipe v-show="show" ref="swipe" />