123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- <template>
- <view class="app-video app-content" :style="{width: width, height: height}" @click.stop="preventD">
- <view class="app-video app-image" @click.stop="play" v-if="!start">
- <image :src="picUrl" class="app-image" style="width: 100%;height:100%"></image>
- <view class="app-play app-image">
- <icon class="app-play-icon"></icon>
- </view>
- </view>
- <video id="myVideo" @fullscreenchange="fullscreenChange" v-else class="app-video video" :style="{width: width, height: height}" :autoplay="start" show-center-play-btn @error="error" :src="url"></video>
- </view>
- </template>
- <script>
- import * as event from '../../../core/event.js';
- export default {
- name: "app-video",
- data() {
- return {
- start: false,
- fullScreen: false,
- maxTop: 0
- }
- },
- props: {
- picUrl: {
- type: String,
- default: () => {
- return '';
- }
- },
- url: {
- type: String,
- default() {
- return '';
- }
- },
- width: {
- type: String,
- default() {
- return `750rpx`;
- }
- },
- height: {
- type: String,
- default() {
- return `422rpx`;
- }
- },
- },
- methods: {
- fullscreenChange(e) {
- this.fullScreen = e.detail.fullScreen;
- },
- play() {
- this.$nextTick().then(() => {
- this.start = true;
- });
- event.trigger(this.$const.EVENT_VIDEO_END);
- this.$emit('videoStart', true);
- event.on(this.$const.EVENT_VIDEO_END, true).then(() => {
- this.start = false;
- this.$emit('videoStart', false);
- });
- },
- autoEnd() {
- let query = null;
- /* #ifndef MP-ALIPAY */
- query = this.createSelectorQuery();
- /* #endif */
- /* #ifdef MP-ALIPAY */
- query = uni.createSelectorQuery();
- /* #endif */
- query.select('.video').boundingClientRect();
- query.selectViewport().scrollOffset();
- query.exec(res => {
- if (res[0].top <= -200 || res[0].top >= this.maxTop - 57) {
- event.trigger(this.$const.EVENT_VIDEO_END);
- }
- });
- },
- preventD() {
- },
- },
- computed: {
- scrollTop() {
- return this.$store.state.page.scrollTop;
- }
- },
- created() {
- this.maxTop = uni.getSystemInfoSync().windowHeight;
- },
- watch: {
- scrollTop: {
- handler() {
- if (!this.start || this.fullScreen) return;
- this.$utils.throttle(this.autoEnd, 500);
- },
- immediate: true
- }
- }
- }
- </script>
- <style scoped lang="scss">
- .app-content {
- position: relative;
- }
- .app-image {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 100;
- width: 100%;
- height:100%;
- }
- .app-play-icon {
- width:#{130rpx};
- height: #{130rpx};
- background-image: url("../../../static/image/icon/play.png");
- background-size:100% 100%;
- position: absolute;
- top: 50%;
- z-index: 100;
- left: 50%;
- transform: translate(-50%, -50%);
- }
- </style>
|