UNPKG

@tanzhenxing/zx-swiper

Version:

zx-swiper 轮播组件

396 lines (318 loc) 10.1 kB
# zx-swiper 轮播组件 一个功能丰富、高度可定制的 uni-app 轮播组件,支持图片、视频、自定义内容等多种形式的轮播展示。 ## ✨ 特性 - 🖼️ **多媒体支持**:支持图片、视频、自定义内容轮播 - 🎛️ **丰富配置**:支持所有 uni-app swiper 组件的原生属性 - 📱 **响应式设计**:支持横向、纵向滑动,自适应高度 - 🎨 **自定义样式**:可自定义指示器、遮罩层、圆角等样式 - ⚡ **性能优化**:懒加载、视频自动暂停等性能优化 - 🎯 **事件完整**:完整的事件回调支持 - 🔧 **方法暴露**:提供编程式控制方法 ## 📦 安装使用 1. 将 `zx-swiper` 文件夹复制到项目的 `components` 目录下 2. 在页面中引入并使用: ```vue <template> <zx-swiper :list="imageList" :height="'400rpx'" /> </template> <script setup> import { ref } from 'vue' const imageList = ref([ 'https://example.com/image1.jpg', 'https://example.com/image2.jpg', 'https://example.com/image3.jpg' ]) </script> ``` ## 📋 Props 属性 ### 基础属性 | 属性名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | list | Array | [] | 轮播数据列表 | | height | String/Number | '320rpx' | 组件高度 | | width | String/Number | '750rpx' | 组件宽度 | | loading | Boolean | false | 是否显示加载状态 | | bgColor | String | '#f3f4f6' | 背景颜色 | | radius | String/Number | '10rpx' | 圆角大小 | ### 轮播控制 | 属性名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | autoplay | Boolean | true | 是否自动播放 | | interval | String/Number | 3000 | 自动切换间隔时间(ms) | | duration | String/Number | 500 | 滑动动画时长(ms) | | circular | Boolean | true | 是否启用循环播放 | | current | String/Number | 0 | 当前显示的索引 | | currentItemId | String | '' | 当前显示的item-id | ### 滑动控制 | 属性名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | vertical | Boolean | false | 是否纵向滑动 | | disableTouch | Boolean | false | 是否禁用触摸滑动 | | touchable | Boolean | true | 是否响应用户触摸事件 | | previousMargin | String/Number | '0rpx' | 前边距 | | nextMargin | String/Number | '0rpx' | 后边距 | ### 显示控制 | 属性名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | displayMultipleItems | Number | 1 | 同时显示的滑块数量 | | acceleration | Boolean | false | 是否开启连续滑动 | | easingFunction | String | 'default' | 切换缓动动画类型 | ### 指示器 | 属性名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | indicator | Boolean | true | 是否显示指示器 | | indicatorMode | String | 'dot' | 指示器模式: 'dot', 'line' | | indicatorActiveColor | String | '#FFFFFF' | 激活指示器颜色 | | indicatorInactiveColor | String | 'rgba(255,255,255,0.35)' | 非激活指示器颜色 | | indicatorStyle | String/Object | '' | 指示器自定义样式 | ### 内容显示 | 属性名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | keyName | String | 'url' | 对象数组中的图片字段名 | | imgMode | String | 'aspectFill' | 图片裁剪模式 | | showTitle | Boolean | false | 是否显示标题 | | showMask | Boolean | false | 是否显示遮罩 | | maskStyle | String/Object | '' | 遮罩样式 | | autoHeight | Boolean | false | 是否自适应高度 | | lazyLoad | Boolean | true | 是否开启懒加载 | ### 视频控制 | 属性名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | videoControls | Boolean | true | 是否显示视频控制栏 | | videoAutoplay | Boolean | false | 视频是否自动播放 | | videoLoop | Boolean | false | 视频是否循环播放 | | videoMuted | Boolean | false | 视频是否静音 | ## 🎯 Events 事件 | 事件名 | 参数 | 说明 | |--------|------|------| | change | { current, source, currentItem } | 轮播切换时触发 | | click | { index, item } | 点击轮播项时触发 | | transition | event.detail | 轮播过渡时触发 | | animationfinish | event.detail | 动画结束时触发 | | imageLoad | event | 图片加载成功时触发 | | imageError | event | 图片加载失败时触发 | | videoPlay | event | 视频开始播放时触发 | | videoPause | event | 视频暂停时触发 | | videoEnded | event | 视频播放结束时触发 | | videoError | event | 视频播放错误时触发 | ## 🔧 Methods 方法 通过 `ref` 可以调用以下方法: ```vue <template> <zx-swiper ref="swiperRef" :list="list" /> <button @click="next">下一张</button> </template> <script setup> import { ref } from 'vue' const swiperRef = ref() // 切换到下一张 const next = () => { swiperRef.value.next() } </script> ``` | 方法名 | 参数 | 说明 | |--------|------|------| | switchTo(index) | index: Number | 切换到指定索引 | | next() | - | 切换到下一张 | | prev() | - | 切换到上一张 | | getCurrentItem() | - | 获取当前轮播项数据 | | pauseAllVideos() | - | 暂停所有视频播放 | ## 🎨 Slots 插槽 ### indicator 插槽 自定义指示器: ```vue <zx-swiper :list="list"> <template #indicator="{ current, total }"> <view class="custom-indicator"> {{ current + 1 }} / {{ total }} </view> </template> </zx-swiper> ``` ### item 插槽 自定义轮播项内容: ```vue <zx-swiper :list="customList"> <template #item="{ item, index }"> <view class="custom-item"> <text>{{ item.text }}</text> </view> </template> </zx-swiper> ``` ### overlay 插槽 自定义覆盖层: ```vue <zx-swiper :list="list"> <template #overlay="{ current, total }"> <view class="overlay"> 自定义覆盖内容 </view> </template> </zx-swiper> ``` ## 📱 使用示例 ### 基础图片轮播 ```vue <template> <zx-swiper :list="imageList" :height="'400rpx'" :autoplay="true" :interval="3000" /> </template> <script setup> const imageList = [ 'https://example.com/image1.jpg', 'https://example.com/image2.jpg', 'https://example.com/image3.jpg' ] </script> ``` ### 带标题的轮播 ```vue <template> <zx-swiper :list="titleList" :show-title="true" :height="'400rpx'" /> </template> <script setup> const titleList = [ { url: 'https://example.com/image1.jpg', title: '图片标题1' }, { url: 'https://example.com/image2.jpg', title: '图片标题2' } ] </script> ``` ### 视频轮播 ```vue <template> <zx-swiper :list="videoList" :height="'300rpx'" :video-controls="true" @video-play="onVideoPlay" /> </template> <script setup> const videoList = [ { type: 'video', url: 'https://example.com/video1.mp4', poster: 'https://example.com/poster1.jpg' } ] const onVideoPlay = (e) => { console.log('视频开始播放', e) } </script> ``` ### 纵向轮播 ```vue <template> <zx-swiper :list="imageList" :vertical="true" :height="'600rpx'" /> </template> ``` ### 自定义内容轮播 ```vue <template> <zx-swiper :list="customList"> <template #item="{ item, index }"> <view class="custom-item" :style="{ backgroundColor: item.color }"> <text>{{ item.text }}</text> </view> </template> </zx-swiper> </template> <script setup> const customList = [ { text: '自定义内容1', color: '#ff6b6b' }, { text: '自定义内容2', color: '#4ecdc4' } ] </script> ``` ## 🔍 数据格式说明 ### 字符串数组 ```javascript ['image1.jpg', 'image2.jpg', 'video.mp4'] ``` ### 对象数组 ```javascript [ { url: 'image1.jpg', // 图片/视频地址 title: '标题', // 可选:标题 poster: 'poster.jpg', // 可选:视频封面 type: 'image|video|custom', // 可选:类型 id: 'unique_id' // 可选:唯一标识 } ] ``` ## 🚀 高级用法 ### 1. 自适应高度 开启 `autoHeight` 后,组件会根据图片的实际高度自动调整: ```vue <zx-swiper :list="imageList" :auto-height="true" /> ``` ### 2. 多项显示 同时显示多个轮播项: ```vue <zx-swiper :list="imageList" :display-multiple-items="2" :previous-margin="'20rpx'" :next-margin="'20rpx'" /> ``` ### 3. 编程式控制 通过 ref 调用方法进行控制: ```vue <template> <zx-swiper ref="swiperRef" :list="imageList" /> <view class="controls"> <button @click="prev">上一张</button> <button @click="next">下一张</button> <button @click="goToFirst">第一张</button> </view> </template> <script setup> const swiperRef = ref() const prev = () => swiperRef.value.prev() const next = () => swiperRef.value.next() const goToFirst = () => swiperRef.value.switchTo(0) </script> ``` ## 🐛 注意事项 1. **视频播放**:在小程序中,视频组件层级较高,可能会遮挡其他内容 2. **自适应高度**:开启后会异步获取图片信息,可能导致初始化时高度闪动 3. **性能优化**:大量图片时建议开启 `lazyLoad` 懒加载 4. **平台差异**:部分属性在不同平台可能有差异,详见 [uni-app 官方文档](https://uniapp.dcloud.net.cn/component/swiper.html) ## 🔄 更新日志 ### v2.0.0 - ✨ 新增视频轮播支持 - ✨ 新增自定义内容插槽 - ✨ 新增更多事件回调 - ✨ 新增编程式控制方法 - 🐛 修复 nextMargin 默认值错误 - 🐛 修复多项显示时的样式问题 - ⚡ 优化性能和代码结构 ### v1.0.0 - 🎉 初始版本发布 - ✨ 基础轮播功能 - ✨ 指示器支持 - ✨ 自适应高度 ## 📄 许可证 MIT License