284 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			284 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <view class="swiper-wrap">
 | |
|     <swiper
 | |
|       class="swiper"
 | |
|       ref="swiper"
 | |
|       :autoplay="autoplay"
 | |
|       :circular="circular"
 | |
|       :interval="interval"
 | |
|       :duration="duration"
 | |
|       @change="swiperChange"
 | |
|     >
 | |
|       <block v-for="(item, index) in urls" :key="index">
 | |
|         <swiper-item @tap="previewImage(index)">
 | |
|           <view v-if="item.type == 'video'" class="video-wrap">
 | |
|             <!-- #ifdef H5 || MP-WEIXIN -->
 | |
|             <video
 | |
|               id="myVideo"
 | |
|               class="my-video"
 | |
|               :enable-progress-gesture="false"
 | |
|               :controls="showControls"
 | |
|               :show-progress="true"
 | |
|               :show-fullscreen-btn="showControls"
 | |
|               :src="item.url"
 | |
|               :show-center-play-btn="false"
 | |
|               :muted="false"
 | |
|               show-mute-btn="true"
 | |
|               @error="videoErrorCallback"
 | |
|               :show-play-btn="showControls"
 | |
|               @click="play"
 | |
|               @ended="playEnd"
 | |
|               @fullscreenchange="fullscreenchange"
 | |
|             ></video>
 | |
|             <image
 | |
|               v-show="showPlay"
 | |
|               @tap.stop="play"
 | |
|               src="/static/images/icon_play.png"
 | |
|               class="icon-play"
 | |
|             >
 | |
|             </image>
 | |
| 
 | |
|             <!--  <image v-show="showPlay" style="right: 50rpx;bottom: 50rpx;" @tap.stop="play" src="/static/images/all.png" class="icon-play">
 | |
|                         </image> -->
 | |
|             <!-- #endif -->
 | |
|             <!-- #ifdef APP-PLUS -->
 | |
|             <j-video
 | |
|               :url="item.url"
 | |
|               height="750rpx"
 | |
|               width="750rpx"
 | |
|               :poster="urls[1].url"
 | |
|             ></j-video>
 | |
|             <!-- #endif -->
 | |
|           </view>
 | |
|           <u-image
 | |
|             v-else
 | |
|             width="750rpx"
 | |
|             height="750rpx"
 | |
|             :src="item.url"
 | |
|             mode="aspectFill"
 | |
|           ></u-image>
 | |
|         </swiper-item>
 | |
|       </block>
 | |
|     </swiper>
 | |
|     <view class="dots black sm bg-white br60" id="bottom"
 | |
|       >{{ currentSwiper + 1 }}/{{ urls.length }}</view
 | |
|     >
 | |
|   </view>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| var app = getApp();
 | |
| export default {
 | |
|   data() {
 | |
|     return {
 | |
|       currentSwiper: 0,
 | |
|       urls: [],
 | |
|       showPlay: true,
 | |
|       showControls: false,
 | |
|       autoplay: true,
 | |
|       start: 0,
 | |
|     };
 | |
|   },
 | |
| 
 | |
|   components: {},
 | |
|   props: {
 | |
|     imgUrls: {
 | |
|       type: Array,
 | |
|       default: () => [],
 | |
|     },
 | |
|     circular: {
 | |
|       type: Boolean,
 | |
|       default: true,
 | |
|     },
 | |
|     interval: {
 | |
|       type: Number,
 | |
|       default: 3000,
 | |
|     },
 | |
|     duration: {
 | |
|       type: Number,
 | |
|       default: 500,
 | |
|     },
 | |
|     video: {
 | |
|       type: String,
 | |
|     },
 | |
|     isShow: {
 | |
|       type: Boolean,
 | |
|       default: false,
 | |
|     },
 | |
|   },
 | |
| 
 | |
|   watch: {
 | |
|     imgUrls: {
 | |
|       handler(val) {
 | |
|         this.urls = val.map((item) => {
 | |
|           return {
 | |
|             url: item.uri,
 | |
|             type: "image",
 | |
|           };
 | |
|         });
 | |
|         if (this.video) {
 | |
|           this.urls.unshift({
 | |
|             url: this.video,
 | |
|             type: "video",
 | |
|           });
 | |
|           this.autoplay = false;
 | |
| 
 | |
|           this.$nextTick(() => {
 | |
|             this.videoContext = uni.createVideoContext("myVideo", this);
 | |
|             this.videoContexts = uni.createVideoContext("videos", this);
 | |
|           });
 | |
|         }
 | |
|       },
 | |
|       immediate: true,
 | |
|     },
 | |
|     isShow: {
 | |
|       handler(val) {
 | |
|         if (val == true && !this.showPlay) {
 | |
|           this.videoContext.stop();
 | |
|         } else if (val == false && this.showPlay == false) {
 | |
|           this.videoContext.play();
 | |
|         }
 | |
|       },
 | |
|     },
 | |
|   },
 | |
| 
 | |
|   methods: {
 | |
|     swiperChange(e) {
 | |
|       this.currentSwiper = e.detail.current;
 | |
|       if (e.detail.current !== 0 && this.video != "") {
 | |
|         try {
 | |
|           this.showPlay = true;
 | |
|           this.videoContext.stop();
 | |
|           this.videoContexts.stop();
 | |
|         } catch (error) {
 | |
|           console.log("err==>", err);
 | |
|         }
 | |
|       }
 | |
|     },
 | |
|     videoErrorCallback(err) {
 | |
|       console.log("err==>", err);
 | |
|     },
 | |
| 
 | |
|     previewImage(current) {
 | |
|       let index = current;
 | |
| 
 | |
|       if (current == 0 && this.video) {
 | |
|         return false;
 | |
|       }
 | |
| 
 | |
|       // #ifdef MP-WEIXIN
 | |
|       wx.previewMedia({
 | |
|         current,
 | |
|         indicator: "default",
 | |
|         sources: this.urls,
 | |
|       });
 | |
|       //#endif
 | |
|       // #ifdef H5 || APP-PLUS
 | |
|       if (this.video) {
 | |
|         index = current - 1;
 | |
|       }
 | |
|       if (this.urls[current].type == "video") {
 | |
|         this.videoContext.requestFullScreen();
 | |
|       } else {
 | |
|         uni.previewImage({
 | |
|           indicator: "default",
 | |
|           index,
 | |
|           urls: this.imgUrls.map((item) => item.uri),
 | |
|         });
 | |
|       }
 | |
| 
 | |
|       //#endif
 | |
|     },
 | |
|     play() {
 | |
|       if (this.start == 0) {
 | |
|         this.start = 1;
 | |
|         this.showPlay = false;
 | |
|         this.videoContext.play();
 | |
|       } else {
 | |
|         this.start = 0;
 | |
|         this.showPlay = true;
 | |
|         this.videoContext.stop();
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     playEnd() {
 | |
|       this.start = 0;
 | |
|       this.showPlay = true;
 | |
|     },
 | |
| 
 | |
|     fullscreenchange(e) {
 | |
|       const { fullScreen } = e.detail;
 | |
|       !fullScreen && this.videoContext.stop();
 | |
|       this.showControls = fullScreen ? true : false;
 | |
|       this.showPlay = fullScreen ? false : true;
 | |
|     },
 | |
|   },
 | |
| };
 | |
| </script>
 | |
| <style lang="scss">
 | |
| .swiper-wrap {
 | |
|   width: 100%;
 | |
|   height: 750rpx;
 | |
|   position: relative;
 | |
| 
 | |
|   .close {
 | |
|     width: 250rpx;
 | |
|     height: 250rpx;
 | |
|     top: 230rpx;
 | |
|     right: 50rpx;
 | |
|     z-index: 1000;
 | |
|     position: relative;
 | |
|     position: fixed;
 | |
| 
 | |
|     .close-item {
 | |
|       top: 0rpx;
 | |
|       right: 0rpx;
 | |
|       position: absolute;
 | |
|       z-index: 1001;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| .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 .my-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>
 |