Skip to content

Commit ba1f966

Browse files
authored
fix: add big pause button for mobile browsers
1 parent 367302e commit ba1f966

File tree

4 files changed

+102
-1
lines changed

4 files changed

+102
-1
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import videojs from 'video.js';
2+
import './big-pause-button.scss';
3+
4+
const BigPlayButton = videojs.getComponent('BigPlayButton');
5+
6+
class BigPauseButton extends BigPlayButton {
7+
constructor(player, options) {
8+
super(player, options);
9+
this.boundUpdate = this.handleUpdate.bind(this);
10+
const playerInstance = this.player();
11+
playerInstance.on('play', this.boundUpdate);
12+
playerInstance.on('pause', this.boundUpdate);
13+
this.handleUpdate();
14+
}
15+
16+
buildCSSClass() {
17+
return `${super.buildCSSClass()} vjs-big-pause-button`;
18+
}
19+
20+
handleClick() {
21+
const player = this.player();
22+
!player.paused() && player.pause();
23+
}
24+
25+
handleUpdate() {
26+
const player = this.player();
27+
if (!player) {
28+
return;
29+
}
30+
const paused = player.paused();
31+
(!paused && player.hasStarted()) ? this.show() : this.hide();
32+
this[paused ? 'removeClass' : 'addClass']('vjs-playing');
33+
this.controlText('Pause');
34+
}
35+
36+
dispose() {
37+
if (this.boundUpdate) {
38+
const player = this.player();
39+
player.off('play', this.boundUpdate);
40+
player.off('pause', this.boundUpdate);
41+
}
42+
super.dispose();
43+
}
44+
}
45+
46+
videojs.registerComponent('BigPauseButton', BigPauseButton);
47+
48+
export default BigPauseButton;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
@use 'sass:map';
2+
@use '../../assets/styles/icons';
3+
4+
.cld-video-player {
5+
&.cld-fluid .vjs-big-pause-button {
6+
max-width: 15%;
7+
}
8+
9+
.vjs-big-pause-button .vjs-icon-placeholder {
10+
@extend .vjs-icon-pause;
11+
display: flex;
12+
align-items: center;
13+
justify-content: center;
14+
top: 0;
15+
left: 0;
16+
width: 100%;
17+
height: 100%;
18+
overflow: hidden;
19+
container-type: inline-size;
20+
21+
&:before {
22+
position: static;
23+
border: none;
24+
margin: 0;
25+
width: auto;
26+
height: auto;
27+
font-size: clamp(0.35em, 50cqw, 0.8em);
28+
}
29+
}
30+
31+
32+
&.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-big-pause-button {
33+
transition: visibility 1s, opacity 1s;
34+
visibility: hidden;
35+
opacity: 0;
36+
}
37+
38+
&.vjs-has-started.vjs-user-active.vjs-playing .vjs-big-pause-button,
39+
&.vjs-has-started.vjs-playing .vjs-big-pause-button {
40+
transition: visibility 0.1s, opacity 0.1s;
41+
visibility: visible;
42+
opacity: 1;
43+
}
44+
}

src/components/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import LogoButton from './logoButton/logo-button';
44
import ProgressControlEventsBlocker from './progress-control-events-blocker/progress-control-events-blocker';
55
import TitleBar from './title-bar/title-bar';
66
import SourceSwitcherButton from './source-switcher-button/source-switcher-button';
7+
import BigPauseButton from './bigPauseButton/big-pause-button';
78

89
export {
910
JumpForwardButton,
1011
JumpBackButton,
1112
LogoButton,
1213
ProgressControlEventsBlocker,
1314
TitleBar,
14-
SourceSwitcherButton
15+
SourceSwitcherButton,
16+
BigPauseButton
1517
};

src/video-player.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ class VideoPlayer extends Utils.mixin(Eventable) {
9393
this._initPlugins();
9494
this._initJumpButtons();
9595
this._initPictureInPicture();
96+
this._initBigPauseButton();
9697
this._setVideoJsListeners(ready);
9798
}
9899

@@ -406,6 +407,12 @@ class VideoPlayer extends Utils.mixin(Eventable) {
406407
}
407408
}
408409

410+
_initBigPauseButton() {
411+
if (videojs.browser.IS_IOS || videojs.browser.IS_ANDROID) {
412+
this.videojs.addChild('BigPauseButton');
413+
}
414+
}
415+
409416
_initCloudinary() {
410417
const cloudinaryConfig = this.playerOptions.cloudinary;
411418
cloudinaryConfig.chainTarget = this;

0 commit comments

Comments
 (0)