1+ const player = document . querySelector ( '.player' ) ;
2+ const video = player . querySelector ( '.viewer' ) ;
3+ const progress = player . querySelector ( '.progress' ) ;
4+ const progressBar = player . querySelector ( '.progress__filled' ) ;
5+ const toggle = player . querySelector ( '.toggle' ) ;
6+ const skipButtons = player . querySelectorAll ( '[data-skip]' ) ;
7+ const ranges = player . querySelectorAll ( '.player__slider' ) ;
8+ const fullscreen = player . querySelector ( '.fullscreen' ) ;
9+
10+ // play/pause
11+ function toggleVideo ( ) {
12+ if ( video . paused ) {
13+ video . play ( ) ;
14+ } else {
15+ video . pause ( ) ;
16+ }
17+ }
18+ video . addEventListener ( 'click' , toggleVideo ) ;
19+ toggle . addEventListener ( 'click' , toggleVideo ) ;
20+
21+ function updateButton ( ) {
22+ if ( video . paused ) {
23+ toggle . innerHTML = '🎭' ;
24+ } else {
25+ toggle . innerHTML = '✋' ;
26+ }
27+ }
28+ updateButton ( ) ;
29+ video . addEventListener ( 'pause' , updateButton ) ;
30+ video . addEventListener ( 'play' , updateButton ) ;
31+
32+ // skip buttons
33+ function skip ( ) {
34+ video . currentTime += parseFloat ( this . dataset . skip ) ;
35+ }
36+ skipButtons . forEach ( e => e . addEventListener ( 'click' , skip ) ) ;
37+
38+ // progress bar
39+ function handleProgress ( ) {
40+ const pct = video . currentTime / video . duration ;
41+ progressBar . style . flexBasis = ( pct * 100 ) . toString ( ) + '%' ;
42+ }
43+ video . addEventListener ( 'timeupdate' , handleProgress ) ;
44+
45+ let scrollOn = false ;
46+ function scrubTo ( e ) {
47+ if ( scrollOn ) {
48+ const pct = e . offsetX / progress . offsetWidth ;
49+ video . currentTime = pct * video . duration ;
50+ }
51+ }
52+ progress . addEventListener ( 'mousedown' , ( ) => { scrollOn = true ; } ) ;
53+ progress . addEventListener ( 'mouseup' , ( ) => { scrollOn = false ; } ) ;
54+ progress . addEventListener ( 'mouseout' , ( ) => { scrollOn = false ; } ) ;
55+ progress . addEventListener ( 'mousemove' , scrubTo ) ;
56+ progress . addEventListener ( 'click' , scrubTo ) ;
57+
58+ // range slider (volume & speed)
59+ function rangeUpdate ( ) {
60+ video [ this . name ] = this . value ;
61+ }
62+ ranges . forEach ( e => e . addEventListener ( 'change' , rangeUpdate ) ) ;
63+
64+ // fullscreen
65+ function toggleFullscreen ( ) {
66+ video . classList . toggle ( 'player__video__fullscreen' ) ;
67+ }
68+ fullscreen . addEventListener ( 'click' , toggleFullscreen ) ;
0 commit comments