最近公司的產品上線,一些高級功能在基礎版本中不對用戶開發,經過視頻的形式展現。vue
產品開發用的是 vue, 經同事介紹使用了 vue-video-player 視頻播放插件,經過 demo案例很快實現了視頻播放效果git
<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> 複製代碼
老闆看了以後說: '不須要全屏切換,不須要讓用戶看的那麼仔細',github
經過配置項 controlBar: {fullscreenToggle: false},
關閉全屏切換後,因爲視頻標清、展現區域大小 483px X 303px,根本看不清視頻裏內容,老闆又說:"實現全屏不鋪滿整個屏幕,而是經過固定大小的彈出層展現"bash
首先想到的是: 開啓全屏切換,監聽全屏切換的事件,在事件中強制退出全屏,顯示固定大小的彈出層markdown
<video-player ... :events="events" @fullscreenchange="onPlayerFullScreenchange($event)" ... > </video-player> // 須要在 events 中指定全屏切換事件,否則沒法監聽 data () { return { videoDialogVisible: false, // 控制彈出層 events: ['fullscreenchange'] } }, methods: { ... onPlayerFullScreenchange (player) { player.exitFullscreen() //強制退出全屏,恢復正常大小 this.videoDialogVisible = true } ... } 複製代碼
這種辦法,雖然能實現,但在強制退出全屏那一下,整個頁面會跳一下,碰到網速慢,或電腦卡的狀況,效果更差...app
沒辦法,繼續想辦法,在該插件 GitHub 庫中,有網友提過相關 issues, 經過 註冊一個自定義按鈕組件,添加到播放器的 controlBar中,替換默認的全屏切換按鈕ide
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> 複製代碼
自定義的按鈕圖標用的仍是默認的 全屏圖標,接着得實現按鈕的點擊事件oop
頁面和彈出層中分別是倆個 播放器實例 videoPlayer1, videoPlayer2,須要考慮到的是:當自定義切換事件觸發後,倆個播放器的同步( videoPlayer1播放了10s, 全屏切換後,videoPlayer2得從 10s 繼續播放,而不是從頭播放 )ui
onCustombuttonClick () { let _time = this.$refs.videoPlayer1.player.currentTime() //已播放時長 this.$refs.videoPlayer2.player.currentTime(_time) this.$refs.videoPlayer2.player.play() } 複製代碼
同理:關閉彈出層後, 也得把 videoPlayer2 的播放時長 賦值給 videoPlayer1,此處是經過 監聽彈出層顯示、隱藏等事件來實現this