vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】


Posted in Javascript onAugust 29, 2018

最近公司的产品上线,一些高级功能在基础版本中不对用户开发,通过视频的形式展示。

产品开发用的是 vue, 经同事介绍使用了vue-video-player 视频播放插件,通过 demo 案例很快实现了视频播放效果

vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】 

<video-player
 class="vjs-custom-skin"
 ref="videoPlayer1"
 :options="playerOptions"
 :playsinline="true"
 :events="events"
 @play="onPlayerPlay($event)"
 @pause="onPlayerPause($event)"
 @ended="onPlayerEnded($event)"
 @loadeddata="onPlayerLoadeddata($event)"
 @waiting="onPlayerWaiting($event)"
 @playing="onPlayerPlaying($event)"
 @timeupdate="onPlayerTimeupdate($event)"
 @canplay="onPlayerCanplay($event)"
 @canplaythrough="onPlayerCanplaythrough($event)"
 @ready="playerReadied"
 @statechanged="playerStateChanged($event)">
</video-player>

老板看了之后说: '不需要全屏切换,不需要让用户看的那么仔细',

通过配置项 controlBar: {fullscreenToggle: false}, 关闭全屏切换后,由于视频标清、展示区域大小 483px X 303px,根本看不清视频里内容,老板又说:"实现全屏不铺满整个屏幕,而是通过固定大小的弹出层展示"

首先想到的是: 开启全屏切换,监听全屏切换的事件,在事件中强制退出全屏,显示固定大小的弹出层

<video-player
 ...
 :events="events"
 @fullscreenchange="onPlayerFullScreenchange($event)"
 ...
>
</video-player>
// 需要在 events 中指定全屏切换事件,不然无法监听
data () {
 return {
  videoDialogVisible: false, // 控制弹出层
  events: ['fullscreenchange']
 }
},
methods: {
 ...
 onPlayerFullScreenchange (player) {
  player.exitFullscreen() //强制退出全屏,恢复正常大小
  this.videoDialogVisible = true
 }
 ...
}

这种办法,虽然能实现,但在强制退出全屏那一下,整个页面会跳一下,碰到网速慢,或电脑卡的情况,效果更差...

没办法,继续想办法,在该插件 GitHub 库中,有网友提过相关 issues , 通过 注册一个自定义按钮组件,添加到播放器的 controlBar中,替换默认的全屏切换按钮

import * as videojs from 'video.js'

export default {
 ...
 methods: {
  ...
  createMyButton () {
   let Button = videojs.getComponent('Button')
   let myButton = videojs.extend(Button, {
    constructor: function (player, options) {
     Button.apply(this, arguments)
     this.addClass('fullscreen-enter')
    },
    handleClick: () => {
     // 绑定点击事件
    },
    buildCSSClass: function () {
     return 'vjs-icon-custombutton vjs-control vjs-button'
    }
   })
   
   //注册
   videojs.registerComponent('myButton', myButton)
   
   this.$nextTick(() => {
    // 添加到controlBar中
    this.$refs.videoPlayer1.player.getChild('controlBar').addChild('myButton')
   })
  }
  ...
 }
}

// 在 style 中指定自定义按钮样式
<style>
.video-js{
  .vjs-control-bar{
  .vjs-icon-custombutton {
   font-family: VideoJS;
   font-weight: normal;
   font-style: normal; }
   .vjs-icon-custombutton:before {
   content: "\f108";
   font-size: 1.8em;
   line-height: 1.67;
   }
  }
 }
}
</style>

自定义的按钮图标用的还是默认的全屏图标,接着得实现按钮的点击事件

页面和弹出层中分别是俩个 播放器实例 videoPlayer1, videoPlayer2,需要考虑到的是:当自定义切换事件触发后,俩个播放器的同步( videoPlayer1播放了10s, 全屏切换后,videoPlayer2得从 10s 继续播放,而不是从头播放 )

onCustombuttonClick () {
 let _time = this.$refs.videoPlayer1.player.currentTime() //已播放时长
 this.$refs.videoPlayer2.player.currentTime(_time)
 this.$refs.videoPlayer2.player.play()
}

同理:关闭弹出层后, 也得把 videoPlayer2 的播放时长 赋值给 videoPlayer1,此处是通过 监听弹出层显示、隐藏等事件来实现

vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】 

总结

以上所述是小编给大家介绍的vue-video-player 通过自定义按钮组件实现全屏切换效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery中的height innerHeight outerHeight区别示例介绍
Jun 15 Javascript
分享20个提升网站界面体验的jQuery插件
Dec 15 Javascript
jquery实现简单的banner轮播效果【实例】
Mar 30 Javascript
js原生跨域_用script标签的简单实现
Sep 24 Javascript
Javascript 一些需要注意的细节(必看篇)
Jul 08 Javascript
ReactNative Image组件使用详解
Aug 07 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
Apr 03 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
Aug 27 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
Aug 05 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
Aug 29 Javascript
在项目vue中使用echarts的操作步骤
Sep 07 Javascript
vue 使用localstorage实现面包屑的操作
Nov 16 Javascript
vue-cli3.0使用及部分配置详解
Aug 29 #Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
Aug 29 #Javascript
Vue CLI3 如何支持less的方法示例
Aug 29 #Javascript
Vue实现美团app的影院推荐选座功能【推荐】
Aug 29 #Javascript
Vuex 使用及简单实例(计数器)
Aug 29 #Javascript
浅谈Vue.use的使用
Aug 29 #Javascript
微信小程序支付前端源码
Aug 29 #Javascript
You might like
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
ThinkPHP路由详解
2015/07/27 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
nodejs分页类代码分享
2014/06/17 NodeJs
使用PBFunc在Powerbuilder中支付宝当面付款功能
2016/10/01 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
php中and 和 &amp;&amp;出坑指南
2018/07/13 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
Python随机数random模块使用指南
2016/09/09 Python
Python pass详细介绍及实例代码
2016/11/24 Python
Python获取某一天是星期几的方法示例
2017/01/17 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
CSS3实现红包抖动效果
2020/12/23 HTML / CSS
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
Harrods美国:英国最大的百货公司
2018/11/04 全球购物
一个SQL面试题
2014/08/21 面试题
纪念建党演讲稿范文
2014/01/13 职场文书
办公室文员工作职责
2014/01/31 职场文书
实习协议书范本
2014/09/25 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android
nginx.conf配置文件结构小结
2022/04/08 Servers
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android