<template> <view class="swiper-wrap"> <swiper class="swiper" ref="swiper" :autoplay="autoplay" :circular="circular" :interval="interval" :duration="duration" @change="changeSwiper" > <block v-for="(item, index) in urls" :key="index"> <swiper-item @tap="previewSwiperItem(index)"> <view v-if="item['type'] === 'video'" class="video-wrap"> <j-video width="750rpx" height="750rpx" :url="item.url" :poster="videoCover" /> </view> <u-image width="750" height="750" :src="item.uri" mode="scaleToFill" /> </swiper-item> </block> </swiper> <view class="dots black sm bg-white br60">{{ currentSwiperIndex + 1 }}/{{ urls.length || 0 }}</view> </view> </template> <script> export default { data() { return { currentSwiperIndex: 0, showPlay: true, showControls: false, autoplay: true, videoContext: null, } }, props: { // 图片链接列表 images: { type: Array, default: () => [], }, // 视频链接 video: { type: [String, Boolean], default: false, }, // 视频封面 videoCover: { type: [String, Boolean], default:false }, // 衔接滑动,即播放到末尾后重新回到开头 circular: { type: Boolean, default: true, }, // 自动切换时间间隔 interval: { type: Number, default: 3 * 1000, }, // 滑动动画时长 duration: { type: Number, default: 500, }, }, computed: { urls() { const images = this.images.map(item => ({ uri: item.uri, type: 'image' })) return this.video ? [{ uri: this.video, type: 'video' }, ...images] : images } }, mounted() { this.videoContext = uni.createVideoContext('video', this) }, methods: { // 切换Swiper项 changeSwiper(e) { this.currentSwiperIndex = e.detail.current }, // 视频异常 videoErrorCallback(err) { throw new Error(err) }, // 查看Swiper项 previewSwiperItem(current) { const type = this.urls[current].type // #ifdef MP-WEIXIN wx.previewMedia({ current, sources: this.urls, }) //#endif // #ifdef H5 || APP-PLUS const index = this.video ? current - 1 : current type === "video" ? this.videoContext.requestFullScreen() : uni.previewImage({ index, urls: this.images }) //#endif }, // 视频播放 playVideo() { // this.videoContext.play() }, // 当视频进入和退出全屏时触发 fullscreenchange(e) { const { fullScreen } = e.detail this.showPlay = !fullScreen this.showControls = !!fullScreen console.log(fullScreen) !!fullScreen && this.videoContext.play() !fullScreen && this.videoContext.pause() } }, } </script> <style scoped> .swiper-wrap { width: 100%; height: 750rpx; position: relative; } .swiper-wrap .swiper { width: 100%; height: 100%; position: relative; } .swiper-wrap .swiper .slide-image { width: 100%; height: 100%; } .swiper-wrap .dots { position: absolute; right: 24rpx; bottom: 24rpx; display: flex; height: 34rpx; padding: 0 15rpx; } .swiper-wrap .video-wrap { width: 100%; height: 100%; position: relative; overflow: hidden; } .swiper-wrap .video { width: 100%; height: 100%; } .swiper-wrap .icon-play { width: 90rpx; height: 90rpx; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 999; } </style>