今天我們要來製作一個控制影片速度的進度條,還記得在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.offsetTop
和 this.offsetHeight
,他們的 this
指向 window
。
因此我們使用.call()
來讓執行 changeSpeed()
時,changeSpeed()
的 this
還是指向 mouseDown
的 this
而不是 window
。
function mouseDown(e) {
isDown = true;
changeSpeed.call(this, e);
}