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 相关文章推荐
IE6下opacity与JQuery的奇妙结合
Mar 01 Javascript
jquery的flexigrid无法显示数据提示获取到数据
Jul 19 Javascript
面向切面编程(AOP)的理解
May 01 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
Aug 05 Javascript
详解Jquery的事件操作和文档操作
Dec 19 Javascript
vue用addRoutes实现动态路由的示例
Sep 15 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
Mar 01 Javascript
详解webpack编译速度提升之DllPlugin
Feb 05 Javascript
解决vue打包后vendor.js文件过大问题
Jul 03 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
Oct 09 Javascript
vue中三级导航的菜单权限控制
Mar 31 Vue.js
一篇文章弄清楚Ajax请求的五个步骤
Mar 17 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中神奇的fastcgi_finish_request
2011/05/02 PHP
php去掉文件前几行的方法
2015/07/29 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
浅谈Javascript 执行顺序
2013/12/18 Javascript
javascript获取flash版本号的方法
2014/11/20 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
jquery实现左右滑动菜单效果代码
2015/08/27 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
Seajs源码详解分析
2019/04/02 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
微信小程序实现聊天室
2020/08/21 Javascript
ES6中的类(Class)示例详解
2020/12/09 Javascript
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
python实现朴素贝叶斯算法
2018/11/19 Python
python http基本验证方法
2018/12/26 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
三个python爬虫项目实例代码
2019/12/28 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
基于jupyter代码无法在pycharm中运行的解决方法
2020/04/21 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
database面试题
2013/03/28 面试题
十一个高级MySql面试题
2014/10/06 面试题
交通事故委托书范本精选
2014/10/04 职场文书
业务内勤岗位职责
2015/04/13 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS