You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
4.5 KiB
180 lines
4.5 KiB
3 years ago
|
<!-- 视频组件: <me-video src="视频地址" poster="封面图"></me-video>
|
||
|
video标签在APP端是原生组件, 真机APP端下拉时会渲染不及时, 出现悬浮错位现象;
|
||
|
me-video组件, 未播放时自动展示image封面, 播放时才显示video, 提高性能; 如果播放中执行下拉,会自动显示封面, 避免视频下拉悬浮错位;
|
||
|
-->
|
||
|
<template>
|
||
|
<view class="me-video" :style="{width:width, height:height}">
|
||
|
<!-- 播放的时候才渲染video标签 -->
|
||
|
<video v-if="showVideo" ref="videoRef" class="video" :class="{'full-play': fullplay&&!autoplay, 'mescroll-dowload': mescrollDownLoad}" :src="src" autoplay :loop="loop" @click="videoClick" x5-playsinline="true" x5-video-player-type="h5" playsinline="true" webkit-playsinline="true" x5-video-player-fullscreen="false"></video>
|
||
|
<!-- 播放按钮 -->
|
||
|
<view v-else class="btn-play"> <view class="triangle"></view> </view>
|
||
|
<!-- 封面 -->
|
||
|
<image v-if="(!showVideo || mescrollDownLoad) && poster" class="poster" :src="poster" @click="play()" mode="aspectFit"></image>
|
||
|
</view>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
export default {
|
||
|
props: {
|
||
|
src: String, // 视频地址
|
||
|
poster: String, // 封面图
|
||
|
autoplay: { // 是否自动播放
|
||
|
type: Boolean,
|
||
|
default(){
|
||
|
return false
|
||
|
}
|
||
|
},
|
||
|
fullplay: { // 是否全屏播放,默认不全屏
|
||
|
type: Boolean,
|
||
|
default(){
|
||
|
return false
|
||
|
}
|
||
|
},
|
||
|
loop: { // 是否循环播放
|
||
|
type: Boolean,
|
||
|
default(){
|
||
|
return true // 循环播放可避免Android微信播放完毕显示广告
|
||
|
}
|
||
|
},
|
||
|
width: { // 宽度 (需带单位,支持格式: '100%', '300px', '300rpx')
|
||
|
type: String,
|
||
|
default: "100%"
|
||
|
},
|
||
|
height: { // 高度 (需带单位,支持格式: '100%', '300px', '300rpx')
|
||
|
type: String,
|
||
|
default: "225px"
|
||
|
},
|
||
|
mescroll: { // mescroll对象,APP端下拉刷新时显示封面,隐藏视频.缓解APP端视频下拉悬浮错位问题
|
||
|
type: Object,
|
||
|
default(){
|
||
|
return {}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
data() {
|
||
|
return {
|
||
|
showVideo: this.autoplay // 是否播放视频
|
||
|
}
|
||
|
},
|
||
|
computed: {
|
||
|
// 是否下拉中 (下拉隐藏视频,显示封面, 仅APP端生效)
|
||
|
mescrollDownLoad() {
|
||
|
// #ifdef APP-PLUS
|
||
|
return this.mescroll.downLoadType
|
||
|
// #endif
|
||
|
// #ifndef APP-PLUS
|
||
|
return false
|
||
|
// #endif
|
||
|
}
|
||
|
},
|
||
|
watch: {
|
||
|
autoplay(val) {
|
||
|
if(val) this.play()
|
||
|
}
|
||
|
},
|
||
|
methods: {
|
||
|
// 播放
|
||
|
play(){
|
||
|
this.showVideo = true
|
||
|
this.wxAutoPlay()
|
||
|
},
|
||
|
// 视频点击事件
|
||
|
videoClick(){
|
||
|
// 全屏播放时,点击视频退出
|
||
|
if(this.fullplay) this.showVideo = false
|
||
|
},
|
||
|
// 解决微信端视频无法自动播放的问题
|
||
|
wxAutoPlay(){
|
||
|
// #ifdef H5
|
||
|
// 微信端
|
||
|
if(navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){
|
||
|
// iOS
|
||
|
let head = document.getElementsByTagName("head")[0]
|
||
|
let wxscript = document.createElement("script");
|
||
|
wxscript.type = "text/javascript"
|
||
|
wxscript.src = "https://res.wx.qq.com/open/js/jweixin-1.6.0.js"
|
||
|
head.appendChild(wxscript)
|
||
|
let vm = this
|
||
|
let doPlay = function(){
|
||
|
vm.$refs.videoRef && vm.$refs.videoRef.play()
|
||
|
}
|
||
|
wxscript.onload = function(){
|
||
|
window.wx.config({
|
||
|
debug: !1,
|
||
|
appId: "",
|
||
|
timestamp: 1,
|
||
|
nonceStr: "",
|
||
|
signature: "",
|
||
|
jsApiList: []
|
||
|
})
|
||
|
window.wx.ready(doPlay)
|
||
|
}
|
||
|
// Android
|
||
|
document.addEventListener("WeixinJSBridgeReady", doPlay, false);
|
||
|
// 先尝试播放
|
||
|
setTimeout(()=>{
|
||
|
doPlay()
|
||
|
},20)
|
||
|
}
|
||
|
// #endif
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
<style lang="scss">
|
||
|
.me-video{
|
||
|
position: relative;
|
||
|
background-color: #000;
|
||
|
overflow: hidden;
|
||
|
// 播放按钮
|
||
|
.btn-play{
|
||
|
z-index: 9;
|
||
|
position: absolute;
|
||
|
left: 50%;
|
||
|
top: 50%;
|
||
|
transform: translate(-50%, -50%);
|
||
|
width: 100rpx;
|
||
|
height: 100rpx;
|
||
|
border-radius: 50%;
|
||
|
background-color: rgba(0,0,0,.75);
|
||
|
pointer-events: none;
|
||
|
.triangle{
|
||
|
position: absolute;
|
||
|
left: 50%;
|
||
|
top: 50%;
|
||
|
transform: translate(-25%, -50%);
|
||
|
width: 0;
|
||
|
height: 0;
|
||
|
border-top: 16rpx solid transparent;
|
||
|
border-left: 24rpx solid #fff;
|
||
|
border-bottom: 16rpx solid transparent;
|
||
|
}
|
||
|
}
|
||
|
// 封面图
|
||
|
.poster{
|
||
|
width: 100%;
|
||
|
height: 100%;
|
||
|
vertical-align: bottom;
|
||
|
}
|
||
|
// 视频 (默认非全屏播放)
|
||
|
.video{
|
||
|
z-index: 8;
|
||
|
position: absolute;
|
||
|
top: 0;
|
||
|
left: 0;
|
||
|
width: 100%;
|
||
|
height: 100%;
|
||
|
// 全屏播放
|
||
|
&.full-play{
|
||
|
z-index: 999;
|
||
|
position: fixed;
|
||
|
}
|
||
|
// 下拉时隐藏视频
|
||
|
&.mescroll-dowload{
|
||
|
display: none;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
</style>
|