28 - Video Speed Controller
俗話說的好,一天一蘋果,醫生遠離我
一天一 JS,What the f*ck JavaScript?
small steps every day - 記錄著新手村日記
完成目標
- 功能
- 畫面
- 拖拉 Range 可以顯示目前的速度倍率(格式:nx)
 
index_START.html
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | <!DOCTYPE html><html lang="en">
 <head>
 <meta charset="UTF-8">
 <title>Video Speed Scrubber</title>
 <link rel="stylesheet" href="style.css">
 </head>
 <body>
 
 <div class="wrapper">
 <video class="flex" width="765" height="430" src="http://clips.vorwaerts-gmbh.de/VfE_html5.mp4" loop controls></video>
 <div class="speed">
 <div class="speed-bar">1×</div>
 </div>
 </div>
 
 <script>
 </script>
 </body>
 </html>
 
 | 
Style.css
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 
 | body {margin: 0;
 display: flex;
 justify-content: center;
 align-items: center;
 min-height: 100vh;
 background: #4C4C4C url('https://unsplash.it/1500/900?image=1021');
 background-size: cover;
 font-family: sans-serif;
 }
 
 .wrapper {
 width: 850px;
 display: flex;
 }
 
 video {
 box-shadow: 0 0 1px 3px rgba(0,0,0,0.1);
 }
 
 .speed {
 background: #efefef;
 flex: 1;
 display: flex;
 align-items: flex-start;
 margin: 10px;
 border-radius: 50px;
 box-shadow: 0 0 1px 3px rgba(0,0,0,0.1);
 overflow: hidden;
 }
 
 .speed-bar {
 width: 100%;
 background: linear-gradient(-170deg, #2376ae 0%, #c16ecf 100%);
 text-shadow: 1px 1px 0 rgba(0,0,0,0.2);
 display: flex;
 align-items: center;
 justify-content: center;
 padding: 2px;
 color: white;
 height: 16.3%;
 }
 
 | 
JS - step by step
首先,我們先將需要的元素選取起來,分別要整個調整速度的元件、調整速度內的Bar及當調整Bar的數值會影響到左側Video的播放速度
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | <script>const speed = document.querySelector('.speed');
 const bar = speed.querySelector('.speed-bar');
 const video = document.querySelector('.flex');
 
 console.log(speed)
 
 
 
 
 console.log(bar)
 
 
 console.log(video)
 
 
 
 </script>
 
 | 
再來加上個監聽事件吧~每當滑鼠調整Bar的數值會觸發事件 handleMove
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | <script>const speed = document.querySelector('.speed');
 const bar = speed.querySelector('.speed-bar');
 const video = document.querySelector('.flex');
 
 function handleMove(e) {
 console.log(e);
 }
 speed.addEventListener('mousemove', handleMove);
 
 </script>
 
 | 
現在來取得控制器背景元素中的 Y 軸位置、整體高度吧!
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | <script>const speed = document.querySelector('.speed');
 const bar = speed.querySelector('.speed-bar');
 const video = document.querySelector('.flex');
 
 function handleMove(e) {
 const y = e.pageY - this.offsetTop;
 const percent = y / this.offsetHeight;
 const min = 0.4;
 const max = 4;
 const playbackRate = percent * (max - min) + min;
 }
 speed.addEventListener('mousemove', handleMove);
 
 </script>
 
 | 
最後只要指定控制器的顯示高度、文字內容,還有左側的影片的播放速度就可以調整惹w
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | <script>const speed = document.querySelector('.speed');
 const bar = speed.querySelector('.speed-bar');
 const video = document.querySelector('.flex');
 
 function handleMove(e) {
 const y = e.pageY - this.offsetTop;
 const percent = y / this.offsetHeight;
 const min = 0.4;
 const max = 4;
 const playbackRate = percent * (max - min) + min;
 
 bar.style.height = height;
 const height = Math.round(percent * 100) + '%';
 
 bar.textContent = playbackRate.toFixed(2) + '×';
 
 video.playbackRate = playbackRate;
 }
 
 speed.addEventListener('mousemove', handleMove);
 
 </script>
 
 | 
就大功告成啦!
JS - final
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | <script>const speed = document.querySelector('.speed');
 const bar = speed.querySelector('.speed-bar');
 const video = document.querySelector('.flex');
 
 function handleMove(e) {
 const y = e.pageY - this.offsetTop;
 const percent = y / this.offsetHeight;
 const min = 0.4;
 const max = 4;
 const playbackRate = percent * (max - min) + min;
 
 bar.style.height = height;
 const height = Math.round(percent * 100) + '%';
 bar.textContent = playbackRate.toFixed(2) + '×';
 video.playbackRate = playbackRate;
 }
 speed.addEventListener('mousemove', handleMove);
 
 </script>
 
 | 
本刊同步於個人網站:http://chestertang.site/
本次範例程式碼原作者來源:https://tinyurl.com/yavm5f5n