glhcp/business/components/goods-swiper/goods-swiper.vue

200 lines
4.0 KiB
Vue

<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>