video player - currentTime / duration / input ėīëēĪíļ / fullscreen
mouse events - mousemove / mouseleave / mouse stop
div
span#currentTime 00:00
span /
span#totalTime 00:00
ėī ëĻėëĨž ëŠŦęģž ëëĻļė§ ė
ė ėīėĐíī ëķ·ėī ëĻėëĄ ë°ęūž í padStart()
ëĨž ėīėĐíī ėëĶŽėëĨž ë§ėķ°ėĢžėëĪ. (ëīę° ėŽėĐí ë°Đëē)
const currentTime = document.getElementById("currentTime");
const totalTime = document.getElementById("totalTime");
const makeVideoTime = (seconds) => {
const min = Math.floor(seconds / 60); // ëŠŦ
const second = seconds % 60; // ëëĻļė§
return `${String(min).padStart(2, "0")}:${String(second).padStart(2, "0")}`;
};
const handleLoadedMetaData = () => {
totalTime.innerText = makeVideoTime(Math.floor(video.duration));
};
const handleTimeUpdate = () => {
currentTime.innerText = makeVideoTime(Math.floor(video.currentTime));
};
video.addEventListener("loadedmetadata", handleLoadedMetaData);
video.addEventListener("timeupdate", handleTimeUpdate);
ë°ëĶŽėī ëĻėëĨž date ę°ėēī
ëĄ ë§ë í substr()
ëĨž ėīėĐíī ëķ·ėī ëĻėë§ ėëžëëĪ. (ę°ėėė ėŽėĐí ë°Đëē)
const currentTime = document.getElementById("currentTime");
const totalTime = document.getElementById("totalTime");
const formatTime = (seconds) => new Date(seconds * 1000).toISOString().substr(14, 5);
const handleLoadedMetaData = () => {
totalTime.innerText = formatTime(Math.floor(video.duration));
};
const handleTimeUpdate = () => {
currentTime.innerText = formaTime(Math.floor(video.currentTime));
};
video.addEventListener("loadedmetadata", handleLoadedMetaData);
video.addEventListener("timeupdate", handleTimeUpdate);
max ę°ė videoë§ëĪ ęļļėīę° ëĪëĨīëŊëĄ ėŽė ė ėĪė íė§ ėëëĪ.
input(type="range", step="1", value="0", min="0")#timeline
ëĻžė , videoė metadataę° ëĄëëëĐī videoė ęļļėīëĨž ë°ėėė ėīëĨž inputė max ę°ėžëĄ ėĪė íīėĪëĪ.
videoę° ėŽėė ėėíëĐī video ėę°ė ë§ėķ° íėëžėļ ėė íŽėļí°ę° ėīëíëëĄ video.currentTimeėī timeline.valueė ę°ėī ëëëĄ íëĪ.
const timeline = document.getElementById("timeline");
const handleLoadedMetaDate = () => {
totalTime.innerText = formatTime(Math.floor(video.duration));
timeline.max = Math.floor(video.duration); // ėķę° â
};
const handleTimeUpdate = () => {
currentTime.innerText = formatTime(Math.floor(video.currentTime));
timeline.value = Math.floor(video.currentTime); // ėķę° â
};
video.addEventListener("loadedmetadata", handleLoadedMetaData);
video.addEventListener("timeupdate", handleTimeUpdate);
input ėīëēĪíļ
ëĨž ėīėĐíī íėëžėļ ėėė íŽėļí°ëĨž ėīëėíŽ ëë§ëĪ timeline.valueę° video.currentTimeė ę°ėī ëëëĄ íëĪ.
const timeline = document.getElementById("timeline");
const handleTimelineChange = (event) => {
const { target: { value} } = event;
video.currentTime = value;
};
timeline.addEventListener("input", handleTimelineChange);
MDN - Using fullscreen mode ė°ļęģ
div
button#fullScreen Enter Full Screen
element.requestFullscreen()
ė ėīėĐíī íīëđ ėėëĨž ė ėēī íëĐīėžëĄ ë§ëĪęģ , document.exitFullscreen()
ė ėīėĐíī ė ėēī íëĐīė ėëëëĄ ëëëĶī ė ėëĪ.
ėīë video.requestFullscreen()ė ėŽėĐíëĐī videoë§ ė ėēī íëĐīėī ëëĪ.
ėŧĻíļëĄĪëŽęđė§ ė ėēīíëĐīėžëĄ ë§ëĪë ĪëĐī watch.pug íėžė ė―ëëĨž ėė íīėž íëĪ.
ëđëėĪëĨž íŽíĻíėŽ ėė ë§ëĪėīë ëŠĻë ëđëėĪ íë ėīėī ęīë Ļ ė―ëëĨž div#videoContainer ėė ëĢėīėĪŽëĪ.
document.fullscreenElement
ë ė ėēī íëĐī ėíėž ëë ę·ļ ėėëĨž ë°ííęģ , ė ėēī íëĐī ėíę° ėë ëë nullė ë°ííëĪ.
const fullScreenBtn = document.getElementById("fullScreenBtn");
const handleFullscreen = () => {
const fullscreen = document.fullscreenElement;
if (fullscreen) {
videoContainer.requestFullscreen();
fullScreenBtn.innerText = "Exit Full Screen";
} else {
document.exitFullscreen();
fullScreenBtn.innerText = "Enter Full Screen";
}
};
fullScreenBtn.addEventListener("click", handleFullscreen);
ë§ė°ėĪ ėŧĪėëĨž ëđëėĪ ėė ėŽëĶŽëĐī ëđëėĪ ėŧĻíļëĄĪëŽëĨž ëģīėŽėĢžęģ , ë§ė°ėĪ ėŧĪėëĨž ëđëėĪ ë°ėžëĄ ėīë í 3ėīę° ė§ëëĐī ëđëėĪ ėŧĻíļëĄĪëŽëĨž ėĻęēĻėĪ ęēėīëĪ.
ëđëėĪ ėėėë ë§ė°ėĪę° ęģė ėė§ėļëĪëĐī ëđëėĪ ėŧĻíļëĄĪëŽëĨž ëģīėŽėĢžęģ , ë§ė°ėĪ ėŧĪėę° 3ėī ëė ėė§ėīė§ ėëëĪëĐī ëđëėĪ ėŧĻíļëĄĪëŽëĨž ėĻęēĻėĪ ęēėīëĪ.
div#videoContainer
video(src="/" + video.fileUrl, widht="800")
div#videoControls
button#playBtn Play
button#muteBtn Mute
div
span#currentTime 00:00
span /
sapn#totalTime 00:00
input(type="range", step="0.1", value="0.3", min="0", max="1")
input(type="range", step="1", value="0", min="0")
div
button#fullScreenBtn Enter Full Screen
classëĨž ėīėĐíī css ėĪíėžė ė ėĐėíĪë Īęģ íëĪ.
ėžëĻ ë§ė°ėĪ ėŧĪėëĨž ëđëėĪ ėëĄ ėŽëĶŽëĐī 'showing' classę° ėķę°ëëëĄ íęģ , ë°ėžëĄ ėīë í 3ėīę° ė§ëëĐī ėė ëëëĄ íëĪ.
const videoControls = document.getElementById("videoControls");
// ë§ė°ėĪ ėŧĪėëĨž ëđëėĪ ėëĄ ėŽëĶŽëĐī
const handleMouseMove = () => {
videoControls.classList.add("showing");
};
// ë§ė°ėĪ ėŧĪėëĨž ëđëėĪ ë°ėžëĄ ėīëíëĐī
const handleMouseLeave = () => {
setTimeout(() => {
videoControls.classList.remove("showing");
}, 3000);
};
video.addEventListener("mousemove", handleMouseMove);
video.addEventListener("mouseleave", handleMouseLeave);
ę·ļëŽë ėīë ęēë§ ėėąíëĐī ë§ė°ėĪ ėŧĪėëĨž ëđëėĪ ėëĄ ėŽë ļëĪę° ë°ėžëĄ ëę° í ëĪė ëĪėīėë 'showing' classę° ëģīėīė§ ėęģ ėŽëžė§ë ëŽļė ę° ë°ėíëĪ.
ë§ė°ėĪ ėŧĪėëĨž ëđëėĪ ėëĄ ëĪė ėŽë ļė ë 'showing' classę° ëĻėėëëĄ íë ĪëĐī, ë§ė°ėĪ ėŧĪėëĨž ëđëėĪ ėëĄ ëĪė ėŽë ļė ë clearTimeout()
ė ėīėĐíī setTimeout()ė ė·Ļėíīėž íëĪ.
ėīëĨž ėíīėë timerëĨž ęģĩė íīėž íëĪ.
const videoControls = document.getElementById("videoControls");
let controlsTimeout = null;
const handleMouseMove = () => {
videoControls.classList.add("showing");
if (controlsTimeout) {
clearTimeout(controlsTimeout);
controlsTimeout = null;
}
};
const handleMouseLeave = () => {
controlsTimeout = setTimeout(() => {
videoControls.classList.remove("showing");
}, 3000);
};
video.addEventListener("mousemove", handleMouseMove);
video.addEventListener("mouseleave", handleMouseLeave);
ëđëėĪ ėėė ë§ė°ėĪę° ęģė ėė§ėļëĪëĐī ëđëėĪ ėŧĻíļëĄĪëŽëĨž ęģė ëģīėŽėĢžëĐī ëė§ë§, ëđëėĪ ėėėë ë§ė°ėĪ ėŧĪėę° 3ėī ëė ėė§ėīė§ ėëëĪëĐī
ëđëėĪ ėŧĻíļëĄĪëŽëĨž ėĻęēĻėĪėž íëĪ.
mousestopėīëžë ėīëēĪíļë ėęļ° ëëŽļė mousemove ėīëēĪíļ ëĶŽėĪë ėėė setTimeout()ęģž clearTimeout()ė ėīėĐíīėž íëĪ.
const hideControls = () => videoControls.classList.remove("showing");
// 1. ë§ė°ėĪ ėŧĪėëĨž ëđëėĪ ėëĄ ėŽëĶŽëĐī
const handleMouseMove = () => {
// ėĪëĩ
if (mouseMoveTimer) { // 4. ę·ļëŽë 3ėīę° ëęļ° ė ė ë§ė°ėĪëĨž ėė§ėīëĐī
clearTimeout(mouseMoveTimer); // 5. showing classëĨž ėė íë 3ėī íėīëĻļę° ė·Ļėëęģ
mouseMoveTimer = null;
}
videoControls.classList.add("showing"); // 2. showing classę° ėķę°ëĻ // 6. ėŽė í showing classę° ëķėŽë ėí
mouseMoveTimer = setTimeout(hideControls, 3000); // 3. ë§ė°ėĪ ėŧĪėëĨž ėė§ėīė§ ėęģ 3ėīę° ė§ëëĐī showing classę° ėė ëĻ
};
ėĶ, ëđëėĪ ėėė ë§ė°ėĪëĨž ėė§ėž ëë§ëĪ ėŧĻíļëĄĪëŽëĨž ėė íë setTimeout íĻėëĨž ë§ëĪęģ ėė§ë§, ë§ė°ėĪę° ęģė ėė§ėīëĐī ë°ëĄ ė ė ë§ë ę·ļ íĻėëĨž ęģė ėė íęļ° ëëŽļė ėŧĻíļëĄĪëŽę° ė ė§ëë ęēėīëĪ.
ë§ė°ėĪę° ęģė ėė§ėīëĐī hideControls íĻėę° ėą ėĪíëęļ° ė ė setTimeout íĻėę° ėė ëëĪ.
ėŧĻíļëĄĪëŽëĨž ėė íë ĪëĐī 3ėī ëė ë§ė°ėĪ ėŧĪėę° ėė§ėīė§ ėėėž íëĪ.