iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 29
0
Modern Web

寫JS30天系列 第 29

JS30 - 29 - Video Speed Controller

  • 分享至 

  • xImage
  •  

今天我們要來製作一個控制影片速度的進度條,還記得在Day11的時候做影片也有調整過速度吧!今天算是一個複習,那就來吧!

首先我們要拿到的東西有調整速度的 bar 和它的容器的高,這樣才能利用百分比去計算速度

關於拖曳才會有效果的做法前幾天已經有說過
這邊就不多加敘述

const video = document.querySelector('.flex');
const speed = document.querySelector('.speed');
const bar = document.querySelector('.speed-bar');
let isDown = false;

function mouseDown(e) {
    isDown = true;
}
function mouseUp() {
    isDown = false;
}
function mouseLeave() {
    isDown = false;
}
function changeSpeed(e)  {
    if(!isDown) return;
    //改變速度
}
speed.addEventListener('mousedown',mouseDown);
speed.addEventListener('mouseup',mouseUp);
speed.addEventListener('mouseleave',mouseLeave);
speed.addEventListener('mousemove', changeSpeed);

首先我們要設定最大與最小速度,接著計算點擊位置在整個進度條的位置,
那就是 e.pageY 去扣掉 this.offsetTop ,然後去除以 this.offsetHeight 計算百分比,最後用 minSpeed 來做修正,即可完成速度的計算。

function changeSpeed(e)  {
    if(!isDown) return;
    const maxSpeed = 8;
    const minSpeed = 0.25;
    const hoverSpeed = e.pageY - this.offsetTop;
    const percentage = hoverSpeed / this.offsetHeight;
    const height = `${Math.round(percentage * 100)}%`;
    const playbackRate = (maxSpeed - minSpeed) * percentage + minSpeed;
    bar.style.height = height;
    bar.textContent = `${playbackRate.toFixed(1)}x`;
    video.playbackRate = playbackRate;
}

最後將 css 樣式修改,並更新 video 的播放速度playbackRate

這時候會發現,只有在點擊且移動滑鼠的時候才會有效果
但是「點擊」那一下並不會修改播放速度
所以我們在 mouseDown 事件要做一些修改

function mouseDown(e) {
    isDown = true;
    changeSpeed();
}

在點下去的時候,也呼叫changeSpeed(),但是這樣會導致點下去時,顯示的播放速度是 NaN%
這是因為在 changeSpeed()內的this.offsetTopthis.offsetHeight,他們的 this指向 window
因此我們使用.call()來讓執行 changeSpeed() 時,changeSpeed()this還是指向 mouseDownthis 而不是 window

function mouseDown(e) {
    isDown = true;
    changeSpeed.call(this, e);
}

Demo
完整程式碼


上一篇
JS30 - 28 - Click and Drag
下一篇
JS30 - 30 - Countdown Timer
系列文
寫JS30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言