videojs全屏弊端

  • 在移动端全屏播放9:16的视频效果不好 ,如下图

  • 9:16的视频全屏播放合适竖屏
  • 16:9的视频全屏播放合适横屏

移动端9:16我想要的效果如下图↓,全屏播放时铺满竖屏

需求

  1. 移动端全屏播放9:16视频时,呈现竖屏播放
  2. 16:9的视频无需更改

解决需求

  • 需要考虑以下几点:

    1. 获取视频原始比例
    // 获取视频宽高const vW = video.videoWidthconst vH = video.videoHeight
    
    1. 移动端9:16视频全屏播放,需要自定义videojs菜单
    2. 移动端16:9的视频使用原生videojs效果
    3. 使用videojs的vjs-fill类,调整父级宽高,使视频撑满父级

创建视频组件

src/components/VideoPlay.vue

<template><!-- class 作用vjs-matrix 自定义皮肤 vjs-show-big-play-button-on-pause 暂停视频时显示大按钮 --><div :class="vpClass"><!-- vjs-16-9 | vjs-fill --><video ref="videoPlayer" :class="vClass"class="vjs-styles-dimensions vjs-matrix vjs-show-big-play-button-on-pause video-js"></video></div>
</template><script>
import videojs from 'video.js';
// 加载中文
import lang_zhcn from "video.js/dist/lang/zh-CN.json"
// 加载css
import 'video.js/dist/video-js.min.css'
// 使用中文
videojs.addLanguage('zh-CN', lang_zhcn);export default {name: 'VideoPlayer',props: {videoSrc: {type: Object,default() {return {};}}},data() {return {player: null,hr: '16-9',//比例vClass: 'vjs-16-9',//video的class> vjs-fill | vjs-16-9vpClass: '',//video父级class  >  my-vdieo-16-9 | my-vdieo-9-16 videoOptions: {autoplay: true,controls: true,preload: 'auto',playbackRates: [0.2, 0.5, 1, 1.5, 2, 2.5, 3],//视频播放速度// aspectRatio: '16:9',//宽高比,9:16 16:9 4:3等等  设置后width和height属性无效// fluid: true,//自动计算宽高 ,若设置了aspectRatio,则失效// liveui: true,//不知userActions: {doubleClick: false,// 双击全屏 boolean|function // 热键//     hotkeys(event) {//         // 'x'  键 - 暂停//         if (event.which === 88) {//             this.pause();//         }//         // `y` 键 - 播放//         if (event.which === 89) {//             this.play();//         }//     },//热键},language: 'zh-CN',controlBar: {children: [{ name: 'playToggle' }, // 播放按钮{ name: 'currentTimeDisplay' }, // 当前已播放时间{ name: 'progressControl' }, // 播放进度条{ name: 'durationDisplay' }, // 总时间{ name: 'audioTrackButton' },{ // 倍数播放name: 'playbackRateMenuButton',},// {//     name: 'volumePanel', // 音量控制//     inline: false, // 不使用水平方式// },],// PictureInPictureToggle: true,  //画中画// 是否显示全屏按钮fullscreenToggle: true,// 音量是否在一行上显示// volumePanel: {//     // true 同一行显示音量调整//     // false 竖直显示音量调整//     inline: false// },// 视频播放完时触发// true 显示回放图标// false 显示暂停图标playToggle: {replay: true}},sources: this.videoSrc,}}},mounted() {this.player = videojs(this.$refs.videoPlayer, this.videoOptions, () => {const p = this.player;// 自定义全屏按钮 // 获取videoconst video = p.el_.children[0];let hr = null// 监听视频加载video.addEventListener('canplay', full);const _this = this;function full() {// 获取视频宽高const vW = video.videoWidthconst vH = video.videoHeight// 确认视频比例if ((vW - vH) >= 0) {// vjs-16-9      hr = '16-9'} else {hr = '9-16'p.el_.classList.remove(_this.vClass)// vjs-9-16 p.getChild('ControlBar').removeChild('FullscreenToggle')_this.vClass = 'vjs-fill'p.el_.classList.add(_this.vClass)_this.vpClass = 'my-vdieo-16-9'}// 9-16 添加自定义全屏按钮if (hr === '9-16') {/* vjs-icon-fullscreen-enter 全屏图标classvjs-icon-fullscreen-exit  非全屏图标class*/// 创建按钮组件 , 并添加到菜单栏p.getChild('ControlBar').addChild('button', {className: 'vjs-button my-full-btn vjs-icon-fullscreen-enter',clickHandler: event => {const videoPar = p.el_;const videoBox = videoPar.parentNode;//video最外面的元素// 图标切换const isFull = event[0].target.classList.toggle('vjs-icon-fullscreen-exit')videoBox.classList.remove(_this.vpClass)// 全屏if (isFull === true) {_this.vpClass = 'my-vdieo-9-16'} else {// 小屏_this.vpClass = 'my-vdieo-16-9'}videoBox.classList.toggle(_this.vpClass)}});}video.removeEventListener('canplay', full)}});},beforeDestroy() {if (this.player) {this.player.dispose();}}
}
</script><style scoped>
/* 播放器尺寸 */
.my-vdieo-9-16 {width: 100vw;height: 100vh;position: fixed;left: 0;top: 0;
}.my-vdieo-16-9 {width: 100vw;height: 35vh;
}/* 、、、、、、、、、、显示当前时间+所有时间、、、、、、、、、、、、、、、。。 */
.vjs-styles-dimensions>>>.vjs-control-bar .vjs-duration,
.vjs-styles-dimensions>>>.vjs-control-bar .vjs-current-time {display: block;padding: 0;
}/* 、、、、、、、、、、、播放器按钮大小+自定义全屏图标大小、、、、、、、、、、、、、、、、、、、 */
.vjs-styles-dimensions>>>.vjs-control-bar button .vjs-icon-placeholder::before,
.vjs-styles-dimensions>>>.vjs-control-bar .my-full-btn::before {font-size: 3em;line-height: 1.1;
}/* 自定义播放器颜色 */
/* Change all text and icon colors in the player. */
.vjs-matrix.video-js {color: skyblue;
}/* Change the border of the big play button. */
.vjs-matrix .vjs-big-play-button {border-color: skyblue;
}/* Change the color of various "bars". */
.vjs-matrix .vjs-volume-level,
.vjs-matrix .vjs-play-progress,
.vjs-matrix .vjs-slider-bar {background: skyblue;
}
</style>

使用视频播放器组件

src/views/HomeVieew.vue

<template><video-player :videoSrc="videoSrc" />
</template><script setup>
import { reactive } from 'vue';// 视频播放器
const videoSrc = reactive([{src: '/public/video/1.mp4',type: 'video/mp4'}]
)
</script>

推荐

videojs基本使用


End
2023/3/6 18:34


2023/3/6 20:13 一改

【videojs】videojs自定义全屏按钮 | videojs全屏移动端弊端 | 创建videojs菜单相关推荐

  1. 移动端echarts点击全屏按钮横屏全屏展示

    在遮罩层显示全屏图表 <div class="fullScreen"><van-overlay lock-scroll :show="isFull&qu ...

  2. android应用点全屏按钮无法全屏,安卓手机软件显示不全屏的解决办法

    不知道大家有没有遇到这样的情况,当我们使用一些分辨率较高的安卓手机,有时候会发现很多网页以及软件等界面全屏显示.面对这样的问题,传统的解决办法无外乎两种,其一为使用Spare Parts的兼容模式来实 ...

  3. html复选框全选按钮代码,全选复选框JavaScript编写小结(附代码)

    var oChkAll = document.getElementById("checkAll"); //全选 oChkAll.onclick = function() { for ...

  4. 电脑录屏怎么录全屏?win10电脑如何录屏

    随着互联网的发展,线上办公以及网课越来越频繁:线上办公或者网课都是使用电脑来完成工作和学习的:那Win10电脑如何录屏以及电脑录屏怎么录屏全屏呢?接下来给大家分享三个电脑录制全屏的教程方法给大家: w ...

  5. web端原生js实现全屏和退出全屏(F11功能)

    一.在项目中使用按钮进行控制全屏功能 1. 选中要实现全屏功能的元素(一般是一个按钮) var $fullBtn = document.querySelector('.fullBtn') //全屏按钮 ...

  6. esc键退出全屏 vue_vue中实现浏览器全屏与退出全屏功能

    在 标签中主要是放一个全屏与退出全屏的按钮,并绑定上点击事件 fullScreenClick .全屏与退出全屏的按钮显示切换是通过变量 fullScreen 控制的. :content="f ...

  7. 浏览器 全屏 html,浏览器全屏.html

    Document *{padding: 0;margin: 0;} 全屏按钮 退出全屏 function fullScreen(el) { var rfs = el.requestFullScreen ...

  8. 点击button按钮实现全选_全选按钮的实现及事件的处理

    这种全选的效果在后台是很需要的,因为有时候数据很多,如果想删除全部的数据,没有全选按钮岂不是很麻烦,所以很有必要实现这种全选的效果,并执行相关的事件,下面就来看看如何实现 先来看看第一种方法: 首先先 ...

  9. android自定义播放器按钮,android – 使用exo播放器添加全屏视频按钮

    如果您使用的是SimpleExoPlayerView,则可以自定义播放器的视图,尤其是Control的视图.查看SimpleExoPlayerView的文档: Attributes The follo ...

最新文章

  1. vue 前端框架 (三)
  2. 收藏 | 因果推断书籍代码合集
  3. 免费下载田志刚《呼叫中心知识库心得》电子书
  4. 逆水寒服务器新消息,游戏新消息:逆水寒太火爆服务器爆满王思聪都挤不进去...
  5. JS循环精灵图背景-遍历背景图片
  6. 分布式的信息处理需要利用计算机的,计算机应用基础(离线作业1)
  7. python存储和读取数据时出现错误_python读取json文件存sql及codecs读取大文件问题...
  8. 计算机网络基础 第4章 龚娟,计算机网络基础 人民邮电 龚娟 第4章习题答案
  9. 电商促销类插画素材,适合各种活动banner设计
  10. root启动php报错,php使用root用户启动
  11. Linux 学习作业:认识bash shell
  12. 在MFC中获取窗口\视图句柄 &获取当前活动的CView .
  13. RG Magic Bullet
  14. Win2008 Server R2 服务器拒绝共享访问
  15. ROS学习笔记8 —— 状态机在ROS中的实现
  16. 邮箱发送材料服务器连接错误,发送邮件常见的错误和解决方法
  17. 这100佳创新互联网公司值得你去
  18. 程序员如何应对年龄这样的职场瓶颈?
  19. Android一键加QQ群
  20. 使用visualvm远程监控服务器状态(图形化界面)

热门文章

  1. 双链表(double_linked_list):(增、删、改、查、逆置)的C++的例子,稍微改一下,就成C。
  2. 一份诚恳的互联网找工作总结和感想(附:怎样花两年时间去面试一个人)
  3. final修饰符,修饰的变量、方法、类、还有一些相关注意事项
  4. mulesoft Module 10 quiz 解析
  5. 常见的IM开源服务器
  6. 用 Electron 打造 Win/Mac 应用,从「代码」到可下载的「安装包」,可能比你想得麻烦一点...
  7. 制作网站价格是多少呢?制作网站要花多少钱?
  8. Python入门习题----进制转换
  9. 如何准备才能提高面试的通过率拿到offer?
  10. oracle数据库添加序列