HTML5 页面上任意数量视频的视频自定义控件
HTML5 video custom controls for any number of videos on the page
朋友们!
我需要一个简单的文本按钮 – "Play"。如果正在播放视频,它应该是隐藏的,当视频结束时应该是可见的。一切正常,但只有当我在页面上有一个具有唯一 ID 的视频时它才有效。
HTML:
<video id="main-video" width="640" height="480">
<source src="media//mp4/video.mp4" type="video/mp4">
</video>
<span id="custom-play-button">Play</span>
这是 JS:
window.onload = function() {
var video = document.getElementById("main-video");
var playButton = document.getElementById("custom-play-button");
playButton.addEventListener("click", function() {
document.getElementById('main-video').addEventListener('ended',myHandler,false);
video.play();
playButton.style.visibility = "hidden";
function myHandler(e) {
playButton.style.visibility = "visible";
}
});
}
但是页面上会有4,5,6...100个视频(而且会有)怎么办?我无法处理 100 个唯一 ID...
您可以将每个视频和按钮放在父 div 标签中,如下所示。
<div class="video-container">
<video id="main-video" width="640" height="480">
<source src="media//mp4/video.mp4" type="video/mp4">
</video>
<span id="custom-play-button">Play</span>
</div>
我正在使用 jQuery 代码,您可以轻松地将其转换为纯 JS。
这应该有效。
$(".video-container").each(function () {
var video = $(this).find("video");
var plainVideo = video.get(0);/*DOM video object, unwrapped from jQuery*/
var playBtn = $(this).find("span");
playBtn.click(function () {
video.get(0).addEventListener('ended',myHandler,false);
plainVideo.play();
playBtn.css("visibility", "hidden");
function myHandler(e) {
playBtn.css("visibility", "visible");
}
});
});
至少这会让您对解决此问题的方法有所了解。
有纯Javascript(无jQuery)
你应该依赖 id
,使用标签作为参考,并获得最近的 span
。请参阅下面的代码。
function closest(el, sel) {
if (el != null) return el.matches(sel) ? el : (el.querySelector(sel) || closest(el.parentNode, sel));
}
var videos = document.getElementsByTagName("video");
for (i = 0; i < videos.length; i++) {
var video = videos[i];
var playButton = closest(video, "span");
playButton.addEventListener("click", function () {
document.getElementById('main-video').addEventListener('ended', myHandler, false);
video.play();
playButton.style.visibility = "hidden";
function myHandler(e) {
playButton.style.visibility = "visible";
}
});
}
<video width="640" height="480">
<source src="media//mp4/video1.mp4" type="video/mp4">
</video>
<span class="custom-play-button">Play</span>
<video width="640" height="480">
<source src="media//mp4/video2.mp4" type="video/mp4">
</video>
<span class="custom-play-button">Play</span>
您必须使用 CSS class
而不是 id
,并且您必须使用 JavaScript 来监听视频事件并进行自定义播放暂停按钮切换等控件。 JavaScript 的 event.target
告诉您哪个视频在做什么。 MDN 有一篇很棒的文章 Creating a cross-browser video player,其中包含有关单个视频的自定义控件的详细说明。
自动化
我花了几天时间创建了一个 JavaScript 可以为您 HTML页。
可读的源代码在 github at rhroyston/material-controls-for-html-video。
做起来相当复杂,但如您所见,这是可以做到的。实时工作演示在 https://hightechtele.com/articles/material-controls-for-html-video
最后,就像我说的,这花了我几天时间。手工制作单个视频很容易,但我想 automate/script 它。 ...因此请查看脚本(以及附带的小 CSS)以了解它是如何完成的。
朋友们!
我需要一个简单的文本按钮 – "Play"。如果正在播放视频,它应该是隐藏的,当视频结束时应该是可见的。一切正常,但只有当我在页面上有一个具有唯一 ID 的视频时它才有效。
HTML:
<video id="main-video" width="640" height="480">
<source src="media//mp4/video.mp4" type="video/mp4">
</video>
<span id="custom-play-button">Play</span>
这是 JS:
window.onload = function() {
var video = document.getElementById("main-video");
var playButton = document.getElementById("custom-play-button");
playButton.addEventListener("click", function() {
document.getElementById('main-video').addEventListener('ended',myHandler,false);
video.play();
playButton.style.visibility = "hidden";
function myHandler(e) {
playButton.style.visibility = "visible";
}
});
}
但是页面上会有4,5,6...100个视频(而且会有)怎么办?我无法处理 100 个唯一 ID...
您可以将每个视频和按钮放在父 div 标签中,如下所示。
<div class="video-container">
<video id="main-video" width="640" height="480">
<source src="media//mp4/video.mp4" type="video/mp4">
</video>
<span id="custom-play-button">Play</span>
</div>
我正在使用 jQuery 代码,您可以轻松地将其转换为纯 JS。 这应该有效。
$(".video-container").each(function () {
var video = $(this).find("video");
var plainVideo = video.get(0);/*DOM video object, unwrapped from jQuery*/
var playBtn = $(this).find("span");
playBtn.click(function () {
video.get(0).addEventListener('ended',myHandler,false);
plainVideo.play();
playBtn.css("visibility", "hidden");
function myHandler(e) {
playBtn.css("visibility", "visible");
}
});
});
至少这会让您对解决此问题的方法有所了解。
有纯Javascript(无jQuery)
你应该依赖 id
,使用标签作为参考,并获得最近的 span
。请参阅下面的代码。
function closest(el, sel) {
if (el != null) return el.matches(sel) ? el : (el.querySelector(sel) || closest(el.parentNode, sel));
}
var videos = document.getElementsByTagName("video");
for (i = 0; i < videos.length; i++) {
var video = videos[i];
var playButton = closest(video, "span");
playButton.addEventListener("click", function () {
document.getElementById('main-video').addEventListener('ended', myHandler, false);
video.play();
playButton.style.visibility = "hidden";
function myHandler(e) {
playButton.style.visibility = "visible";
}
});
}
<video width="640" height="480">
<source src="media//mp4/video1.mp4" type="video/mp4">
</video>
<span class="custom-play-button">Play</span>
<video width="640" height="480">
<source src="media//mp4/video2.mp4" type="video/mp4">
</video>
<span class="custom-play-button">Play</span>
您必须使用 CSS class
而不是 id
,并且您必须使用 JavaScript 来监听视频事件并进行自定义播放暂停按钮切换等控件。 JavaScript 的 event.target
告诉您哪个视频在做什么。 MDN 有一篇很棒的文章 Creating a cross-browser video player,其中包含有关单个视频的自定义控件的详细说明。
自动化
我花了几天时间创建了一个 JavaScript 可以为您 HTML页。
可读的源代码在 github at rhroyston/material-controls-for-html-video。
做起来相当复杂,但如您所见,这是可以做到的。实时工作演示在 https://hightechtele.com/articles/material-controls-for-html-video
最后,就像我说的,这花了我几天时间。手工制作单个视频很容易,但我想 automate/script 它。 ...因此请查看脚本(以及附带的小 CSS)以了解它是如何完成的。