Navigate back to the homepage

Day11: Custom Video Player

JavaScript30
July 3rd, 2021 · 1 min read

專案介紹: 客製化 player 播放器,功能包含播放、暫停、音量、速度、快進、快退、全螢幕。

作品頁面:https://iris1114.github.io/javascript30/11_Custom-Video-Player/

Code

1/* Get Our Elements */
2const player = document.querySelector(".player");
3const video = player.querySelector(".viewer");
4const progress = player.querySelector(".progress");
5const progressBar = player.querySelector(".progress__filled");
6const toggle = player.querySelector(".toggle");
7const skipButtons = player.querySelectorAll("[data-skip]");
8const ranges = player.querySelectorAll(".player__slider");
9const fullscreenBtn = player.querySelector(".screen__button");
10const iconBtn = player.querySelector(".icon__button");
11
12/* Build out functions */
13
14// 影片播放或暫停
15function togglePlay() {
16 const method = video.paused ? "play" : "pause";
17 video[method]();
18}
19
20//依據影片播放或暫停去改變icon ui
21function updateButton() {
22 const icon = this.paused
23 ? ` <i class="fas fa-play"></i>`
24 : `<i class="fas fa-pause"></i>`;
25 toggle.innerHTML = icon;
26
27 const iconVideo = this.paused ? ` <i class="fas fa-play"></i>` : ``;
28 iconBtn.innerHTML = iconVideo;
29}
30
31//快進及快退, 讓video的curentTime =+ data-skip 的時間
32function skip() {
33 video.currentTime += parseFloat(this.dataset.skip);
34}
35
36//video 的 volume 及 playbackRate 的值進行修改
37function handleRangeUpdate() {
38 video[this.name] = this.value;
39}
40
41//進度條ui及顏色調整
42function handleProgress() {
43 const percent = (video.currentTime / video.duration) * 100;
44 progressBar.style.flexBasis = `${percent}%`;
45 progressBar.style.background = "#ff0000";
46}
47
48//更改影片播放位置
49function scrub(e) {
50 const scrubTime = (e.offsetX / progress.offsetWidth) * video.duration;
51 video.currentTime = scrubTime;
52}
53
54//request fullscreen
55function fullscreen() {
56 video.requestFullscreen();
57}
58
59/* Hook up the event listeners */
60
61//針對影片播放暫停做處理
62video.addEventListener("click", togglePlay); //點擊影片執行togglePlay
63toggle.addEventListener("click", togglePlay); //下方toggle點擊執行togglePlay
64video.addEventListener("play", updateButton); //監聽影片播放執行按鈕畫面
65video.addEventListener("pause", updateButton); //監聽影片暫停執行按鈕畫面
66
67//當影片current time 有更新時,則出發timeupdate事件,進行進度條ui呈現
68video.addEventListener("timeupdate", handleProgress);
69
70//針對快進/慢進做處理
71skipButtons.forEach((button) => button.addEventListener("click", skip));
72
73//針對音量、速度滑動條進行處理
74ranges.forEach((range) => range.addEventListener("change", handleRangeUpdate));
75ranges.forEach((range) =>
76 range.addEventListener("mousemove", handleRangeUpdate)
77);
78
79//針對進度條做處理,按著滑鼠 mousedown 時是 true,放開滑鼠 mouseup 則為 false
80let mousedown = false;
81progress.addEventListener("click", scrub); //點擊進行條執行scrub
82progress.addEventListener("mousemove", (e) => mousedown && scrub(e)); //如果mousedown=true,則執行scrub
83progress.addEventListener("mousedown", () => (mousedown = true));
84progress.addEventListener("mouseup", () => (mousedown = false));
85
86//針對全螢幕做處理
87fullscreenBtn.addEventListener("click", fullscreen);

補充

video.play()

開始播放。

video.pause()

暫停播放。

video.currentTime

會以秒為單位返回當前媒體元素的播放時間。設置這個屬性會改變媒體元素當前播放位置。

video.volume

可設置媒體播放時的音量。值從 0.0(靜音)到 1.0(最大音量)。

video.playbackRate

屬性設置媒體文件播放時的速率。這用於實現讓用戶控制快放、慢放等。正常播放速率乘以該值表示當前的播放速率,所以 1.0 表示一個正常的播放速率。將 playbackRate 設為負值不可以實現倒播。

video.duration

屬性以秒為單位給出媒體的長度,如果沒有媒體數據可用,則為零。

video timeupdate event

當 currentTime 更新時會觸發 timeupdate 事件。

這個事件的觸發頻率由系統決定,但是會保證每秒觸發 4-66 次(前提是每次事件處理不會超過 250ms)。

mousedown & mouseup & mousemove

  • mousedown: 任一滑鼠按鍵按下時觸發,相當於手機上的 touchstart。
  • mouseup: 任一滑鼠按鍵放開時觸發,相當於手機上的 touchend。
  • mousemove:滑鼠移動時觸發,通常在需要用到時才綁定,避免不斷觸發。

參考資料

https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLMediaElement https://medium.com/@shizukuichi/mouse-event-%E5%B0%8F%E7%AD%86%E8%A8%98-feb5dd866b0

More articles from Iris Blog

Day10: Hold Shift and Check Checkboxes

按住 Shift 鍵對多個 checkbox 進行勾選。

July 1st, 2021 · 1 min read

Day9: Dev Tools Domination

DOM break on & 練習 console 用法

June 29th, 2021 · 1 min read
© 2020–2021 Iris Blog
Link to $mailto:qweichew@gmail.comLink to $https://github.com/iris1114Link to $https://www.instagram.com/iris.justdoit/Link to $https://www.linkedin.com/in/iris-chew