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 相关文章推荐
简单实用的全选反选按钮例子
Oct 18 Javascript
js setTimeout opener的用法示例详解
Oct 23 Javascript
JavaScript对象学习小结
Sep 02 Javascript
jQuery实现自动切换播放的经典滑动门效果
Sep 12 Javascript
Jquery中map函数的用法
Jun 03 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
Jun 08 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
Sep 28 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
Jan 13 Javascript
AngularJS service之select下拉菜单效果
Jul 28 Javascript
webpack 2.x配置reactjs基本开发环境详解
Aug 08 Javascript
vue-infinite-loading2.0 中文文档详解
Apr 08 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
Apr 23 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
是否存在第一台收音机的说法
2021/03/01 无线电
php常用ODBC函数集(详细)
2013/06/24 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
js获取php变量的实现代码
2013/08/10 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
Javascript中判断对象是否为空
2015/06/10 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
Python类的用法实例浅析
2015/05/27 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
浅谈Python基础之I/O模型
2017/05/11 Python
python logging日志模块的详解
2017/10/29 Python
python重试装饰器的简单实现方法
2019/01/31 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
浅谈pycharm导入pandas包遇到的问题及解决
2020/06/01 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
Python基于locals返回作用域字典
2020/10/17 Python
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
英国皇家邮政海外旗舰店:Royal Mail
2018/02/21 全球购物
全球性的在线婚纱礼服工厂:27dress.com
2019/03/21 全球购物
为什么要用EJB
2014/04/17 面试题
最新大学生创业计划书写作攻略
2014/04/02 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
文明单位申报材料
2014/12/23 职场文书
初婚未育证明样本
2015/06/18 职场文书
如何优化vue打包文件过大
2022/04/13 Vue.js