123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- <template>
- <view class="page">
- <swiper class="swiper" :circular="circular" :vertical="true" @change="onSwiperChange">
- <swiper-item v-for="item in videoList" :key="item.id">
- <video class="video" :id="item.id" :ref="item.id" :src="item.src" :controls="false" :loop="true"
- :show-center-play-btn="false"></video>
- </swiper-item>
- </swiper>
- </view>
- </template>
- <script>
- const videoData = [{
- src: 'https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/hellouniapp/hello-nvue-swiper-vertical-01.mp4'
- },
- {
- src: 'https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/hellouniapp/hello-nvue-swiper-vertical-02.mp4'
- },
- {
- src: 'https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/hellouniapp/hello-nvue-swiper-vertical-03.mp4'
- },
- {
- src: 'https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/hellouniapp/hello-nvue-swiper-vertical-01.mp4'
- },
- {
- src: 'https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/hellouniapp/hello-nvue-swiper-vertical-02.mp4'
- },
- {
- src: 'https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/hellouniapp/hello-nvue-swiper-vertical-03.mp4'
- }
- ];
- export default {
- data() {
- return {
- circular: true,
- videoList: [{
- id: "video0",
- src: "",
- img: ""
- },
- {
- id: "video1",
- src: "",
- img: ""
- },
- {
- id: "video2",
- src: "",
- img: ""
- }
- ],
- videoDataList: []
- }
- },
- onLoad(e) {},
- onReady() {
- this.init();
- this.getData();
- },
- methods: {
- init() {
- this._videoIndex = 0;
- this._videoContextList = [];
- for (var i = 0; i < this.videoList.length; i++) {
- this._videoContextList.push(uni.createVideoContext('video' + i, this));
- }
- this._videoDataIndex = 0;
- },
- getData(e) {
- this.videoDataList = videoData;
- setTimeout(() => {
- this.updateVideo(true);
- }, 200)
- },
- onSwiperChange(e) {
- let currentIndex = e.detail.current;
- if (currentIndex === this._videoIndex) {
- return;
- }
- let isNext = false;
- if (currentIndex === 0 && this._videoIndex === this.videoList.length - 1) {
- isNext = true;
- } else if (currentIndex === this.videoList.length - 1 && this._videoIndex === 0) {
- isNext = false;
- } else if (currentIndex > this._videoIndex) {
- isNext = true;
- }
- if (isNext) {
- this._videoDataIndex++;
- } else {
- this._videoDataIndex--;
- }
- if (this._videoDataIndex < 0) {
- this._videoDataIndex = this.videoDataList.length - 1;
- } else if (this._videoDataIndex >= this.videoDataList.length) {
- this._videoDataIndex = 0;
- }
- this.circular = (this._videoDataIndex != 0);
- if (this._videoIndex >= 0) {
- this._videoContextList[this._videoIndex].pause();
- this._videoContextList[this._videoIndex].seek(0);
- }
- this._videoIndex = currentIndex;
- setTimeout(() => {
- this.updateVideo(isNext);
- }, 200);
- },
- getNextIndex(isNext) {
- let index = this._videoIndex + (isNext ? 1 : -1);
- if (index < 0) {
- return this.videoList.length - 1;
- } else if (index >= this.videoList.length) {
- return 0;
- }
- return index;
- },
- getNextDataIndex(isNext) {
- let index = this._videoDataIndex + (isNext ? 1 : -1);
- if (index < 0) {
- return this.videoDataList.length - 1;
- } else if (index >= this.videoDataList.length) {
- return 0;
- }
- return index;
- },
- updateVideo(isNext) {
- this.$set(this.videoList[this._videoIndex], 'src', this.videoDataList[this._videoDataIndex].src);
- this.$set(this.videoList[this.getNextIndex(isNext)], 'src', this.videoDataList[this.getNextDataIndex(isNext)].src);
- setTimeout(() => {
- this._videoContextList[this._videoIndex].play();
- }, 200);
- console.log("v:" + this._videoIndex + " d:" + this._videoDataIndex + "; next v:" + this.getNextIndex(
- isNext) + " next d:" + this.getNextDataIndex(isNext));
- }
- }
- }
- </script>
- <style>
- /* #ifndef H5 */
- /* page {
- width: 100%;
- min-height: 100%;
- display: flex;
- } */
- /* #endif */
- .page {
- flex: 1;
- /* width: 750rpx; */
- }
- .swiper {
- flex: 1;
- background-color: #007AFF;
- }
- .swiper-item {
- flex: 1;
- }
- .video {
- flex: 1;
- /* #ifndef APP-PLUS */
- width: 100%;
- /* #endif */
- }
- </style>
|