当前位置:首页 > VUE

vue实现列表轮播

2026-02-20 04:57:33VUE

Vue 实现列表轮播

使用 Swiper 插件

Swiper 是一个流行的轮播库,支持 Vue 集成。安装 Swiper 后,可以通过配置实现列表轮播效果。

安装依赖:

npm install swiper vue-awesome-swiper

基本用法:

<template>
  <swiper :options="swiperOption">
    <swiper-slide v-for="(item, index) in list" :key="index">
      {{ item }}
    </swiper-slide>
  </swiper>
</template>

<script>
import { Swiper, SwiperSlide } from 'vue-awesome-swiper'
import 'swiper/swiper-bundle.css'

export default {
  components: {
    Swiper,
    SwiperSlide
  },
  data() {
    return {
      list: ['Item 1', 'Item 2', 'Item 3', 'Item 4'],
      swiperOption: {
        slidesPerView: 3,
        spaceBetween: 30,
        loop: true,
        autoplay: {
          delay: 2500,
          disableOnInteraction: false
        }
      }
    }
  }
}
</script>

使用 CSS 动画

通过 CSS 的 @keyframestransform 属性可以实现简单的轮播效果。

<template>
  <div class="carousel-container">
    <div class="carousel-track" :style="trackStyle">
      <div v-for="(item, index) in list" :key="index" class="carousel-item">
        {{ item }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: ['Item 1', 'Item 2', 'Item 3', 'Item 4'],
      currentIndex: 0,
      itemWidth: 200
    }
  },
  computed: {
    trackStyle() {
      return {
        transform: `translateX(${-this.currentIndex * this.itemWidth}px)`,
        transition: 'transform 0.5s ease'
      }
    }
  },
  mounted() {
    setInterval(() => {
      this.currentIndex = (this.currentIndex + 1) % this.list.length
    }, 2000)
  }
}
</script>

<style>
.carousel-container {
  width: 600px;
  overflow: hidden;
}
.carousel-track {
  display: flex;
  width: max-content;
}
.carousel-item {
  width: 200px;
  height: 100px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid #ddd;
}
</style>

使用 Vue Transition

结合 Vue 的 <transition-group> 组件可以实现更复杂的轮播动画效果。

<template>
  <div class="carousel">
    <transition-group name="slide" tag="div" class="carousel-inner">
      <div v-for="(item, index) in visibleItems" :key="item.id" class="carousel-item">
        {{ item.text }}
      </div>
    </transition-group>
    <button @click="prev">Prev</button>
    <button @click="next">Next</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, text: 'Item 1' },
        { id: 2, text: 'Item 2' },
        { id: 3, text: 'Item 3' },
        { id: 4, text: 'Item 4' }
      ],
      currentIndex: 0,
      visibleCount: 3
    }
  },
  computed: {
    visibleItems() {
      const end = this.currentIndex + this.visibleCount
      return this.items.slice(this.currentIndex, end)
    }
  },
  methods: {
    next() {
      this.currentIndex = (this.currentIndex + 1) % (this.items.length - this.visibleCount + 1)
    },
    prev() {
      this.currentIndex = (this.currentIndex - 1 + this.items.length) % (this.items.length - this.visibleCount + 1)
    }
  }
}
</script>

<style>
.carousel {
  width: 600px;
  overflow: hidden;
}
.carousel-inner {
  display: flex;
}
.carousel-item {
  width: 200px;
  height: 100px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid #ddd;
}
.slide-enter-active, .slide-leave-active {
  transition: all 0.5s;
}
.slide-enter {
  transform: translateX(100%);
}
.slide-leave-to {
  transform: translateX(-100%);
}
</style>

响应式轮播

针对不同屏幕尺寸调整显示的轮播项数量,可以使用计算属性和窗口大小监听。

<template>
  <swiper :options="swiperOption">
    <swiper-slide v-for="(item, index) in list" :key="index">
      {{ item }}
    </swiper-slide>
  </swiper>
</template>

<script>
import { Swiper, SwiperSlide } from 'vue-awesome-swiper'
import 'swiper/swiper-bundle.css'

export default {
  components: {
    Swiper,
    SwiperSlide
  },
  data() {
    return {
      list: ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5'],
      swiperOption: {
        slidesPerView: this.getSlidesPerView(),
        spaceBetween: 20,
        loop: true,
        autoplay: {
          delay: 2500,
          disableOnInteraction: false
        },
        breakpoints: {
          640: {
            slidesPerView: 2
          },
          768: {
            slidesPerView: 3
          },
          1024: {
            slidesPerView: 4
          }
        }
      }
    }
  },
  methods: {
    getSlidesPerView() {
      const width = window.innerWidth
      if (width < 640) return 1
      if (width < 768) return 2
      if (width < 1024) return 3
      return 4
    }
  }
}
</script>

这些方法提供了从简单到复杂的 Vue 列表轮播实现方案,可以根据项目需求选择合适的方案。Swiper 插件功能最全面,CSS 动画方案最轻量,而 Vue Transition 则提供了更多自定义动画的可能性。

vue实现列表轮播

标签: 列表vue
分享给朋友:

相关文章

eventbus vue实现

eventbus vue实现

EventBus 实现原理 EventBus 是一种发布/订阅模式,用于 Vue 组件间的通信。核心是通过一个中央事件总线管理事件监听和触发。 创建 EventBus 在 Vue 项目中创建一个独立…

vue实现后退

vue实现后退

Vue 实现后退功能的方法 在 Vue 中实现后退功能通常可以通过以下几种方式完成,具体取决于应用场景和需求。 使用 window.history API 通过原生 JavaScript 的 win…

vue slot实现

vue slot实现

vue slot 的实现方法 在 Vue 中,slot 是一种内容分发机制,允许父组件向子组件传递模板内容。以下是几种常见的 slot 实现方式: 默认 slot 默认 slot 是最基础的 sl…

vue实现bootstrap

vue实现bootstrap

Vue 中集成 Bootstrap 的方法 在 Vue 项目中集成 Bootstrap 可以通过以下方式实现,涵盖样式、组件和交互功能。 安装 Bootstrap 依赖 通过 npm 或 yarn…

vue实现同步

vue实现同步

Vue 实现同步的方法 在 Vue 中实现同步操作通常涉及数据绑定、状态管理和异步操作的处理。以下是几种常见的方法: 使用计算属性(Computed Properties) 计算属性基于响应式依赖…

vue实现setinterval

vue实现setinterval

在 Vue 中使用 setInterval Vue 中可以通过生命周期钩子和方法结合 setInterval 实现定时任务。以下是一个完整的实现示例: <template> <…