vue3封装轮播图组件

需求:

封装一个轮播图组件

功能:

1.有上下切换的点击图标,可以实现点击切换上下张

2.底部有小圆点,对应每一张图片,图片切换,小圆点对应切换

3.小圆点可以点击切换,对应的图片也会切换

功能实现

父组件通过自定义属性传值传递包含图片的数组变量,

子组件通过prorps接收数组,循环渲染数组中的图片

新建公共组件src/components/carousel/index.vue

html部分:

  • 轮播图图片部分由ul套li套img构成
  • 上一张下一张图片由
  • 底部小圆点
<template><div class="home-banner"><div class="carousel"><!--轮播图图片部分 --><ul class="carousel-body"><li class="carousel-item fade"><img src="" alt="" /></li></ul><!-- 上一张下一张箭头图标 --><a href=" javascript:;" class="carousel-btn prev"><i class="iconfont icon-angle-left"></i></a><a href="javascript:;" class="carousel-btn next"><i class="iconfont icon-angle-right"></i></a><!-- 底部小圆点 --><div class="carousel-indicator"><span class="active"></span><span></span><span></span><span></span><span></span></div></div></div>
</template> 

css部分

  • 轮播图切换通过类名fade的opacity实现
  • 加上transition使变化更加顺滑
  • 给span设置border-radius变成小圆点
<style scoped lang="less">
.hom
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 Vue2 轮播图组件封装: ```vue <template> <div class="slider"> <div class="slider__wrapper" :style="{ transform: 'translateX(' + translateX + 'px)' }"> <div v-for="(item, index) in items" :key="index" class="slider__item"> <img :src="item.imgUrl" alt=""> </div> </div> <div class="slider__dots"> <span v-for="(item, index) in items" :key="index" :class="{ active: currentIndex === index }" @click="handleDotClick(index)"></span> </div> <button class="slider__btn slider__btn--prev" @click="prev"> <i class="iconfont icon-arrow-left"></i> </button> <button class="slider__btn slider__btn--next" @click="next"> <i class="iconfont icon-arrow-right"></i> </button> </div> </template> <script> export default { props: { items: { type: Array, required: true }, interval: { type: Number, default: 3000 } }, data() { return { currentIndex: 0, translateX: 0, timer: null } }, computed: { wrapperWidth() { return this.items.length * 100 + '%' }, itemWidth() { return 100 / this.items.length + '%' } }, mounted() { this.startAutoPlay() }, beforeDestroy() { this.stopAutoPlay() }, methods: { startAutoPlay() { this.timer = setInterval(() => { this.next() }, this.interval) }, stopAutoPlay() { clearInterval(this.timer) }, prev() { this.currentIndex = (this.currentIndex + this.items.length - 1) % this.items.length this.translateX = -this.currentIndex * this.$el.clientWidth }, next() { this.currentIndex = (this.currentIndex + 1) % this.items.length this.translateX = -this.currentIndex * this.$el.clientWidth }, handleDotClick(index) { this.currentIndex = index this.translateX = -this.currentIndex * this.$el.clientWidth } } } </script> <style> .slider { position: relative; overflow: hidden; } .slider__wrapper { display: flex; transition: transform 0.3s ease-out; } .slider__item { width: 100%; flex-shrink: 0; } .slider__dots { position: absolute; bottom: 20px; left: 50%; transform: translateX(-50%); display: flex; } .slider__dots span { width: 10px; height: 10px; border-radius: 50%; background-color: #ccc; margin-right: 5px; cursor: pointer; transition: background-color 0.3s ease-out; } .slider__dots span.active { background-color: #333; } .slider__btn { position: absolute; top: 50%; transform: translateY(-50%); width: 30px; height: 30px; background-color: rgba(0, 0, 0, 0.3); border: none; border-radius: 50%; color: #fff; cursor: pointer; transition: background-color 0.3s ease-out; } .slider__btn:hover { background-color: rgba(0, 0, 0, 0.5); } .slider__btn i { font-size: 16px; line-height: 30px; } .slider__btn--prev { left: 20px; } .slider__btn--next { right: 20px; } </style> ``` 使用时,可在父组件中引入并传入轮播图数据: ```vue <template> <slider :items="items" :interval="3000" /> </template> <script> import Slider from '@/components/Slider.vue' export default { components: { Slider }, data() { return { items: [ { imgUrl: 'https://picsum.photos/800/400?random=1' }, { imgUrl: 'https://picsum.photos/800/400?random=2' }, { imgUrl: 'https://picsum.photos/800/400?random=3' } ] } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值