HTML5 中怎么用 JavaScript 实现一个完全自定义样式的视频播放控制器

千敏酱_8097

千敏酱_8097

2026-09-30

590人浏览

原创

通过移除video的controls属性并用controlslist限制默认行为,包裹自定义容器,结合video api实现播放控制、进度拖拽、静音等功能,并用css完全重写ui样式。

html5 中怎么用 javascript 实现一个完全自定义样式的视频播放控制器

直接用 JavaScript 替换原生控件,隐藏默认 UI,再用 HTML+CSS 构建新控制器,并通过 Video API 控制播放状态和进度。

1. 隐藏原生控件并准备自定义容器

在 <video></video> 标签中去掉 controls 属性,用 controlsList="nodownload nofullscreen noremoteplayback" 进一步限制默认行为。包裹一个带自定义类的容器,方便定位和样式控制:

<div class="custom-video-player">
  <video id="myVideo" controlslist="nodownload nofullscreen noremoteplayback"><source src="video.mp4" type="video/mp4"></source></video><div class="custom-controls">
    <button class="play-btn">▶</button>
    <input type="range" class="progress-bar" min="0" max="100" value="0"><span class="time-current">00:00</span>/<span class="time-duration">00:00</span>
    <button class="mute-btn">?</button>
  </div>
</div>

2. 绑定核心事件与基础控制逻辑

获取 video 元素和各控制器节点,监听关键事件(如 loadedmetadata、timeupdate、ended),并实现播放/暂停、音量、静音、进度拖拽等操作:

const video = document.getElementById('myVideo');
const playBtn = document.querySelector('.play-btn');
const progressBar = document.querySelector('.progress-bar');
const timeCurrent = document.querySelector('.time-current');
const timeDuration = document.querySelector('.time-duration');
const muteBtn = document.querySelector('.mute-btn');
<p>// 播放/暂停切换
playBtn.addEventListener('click', () => {
if (video.paused) {
video.play().catch(e => console.warn('Play failed:', e));
} else {
video.pause();
}
});</p><p>// 更新播放时间显示
video.addEventListener('timeupdate', () => {
const current = Math.floor(video.currentTime);
const duration = Math.floor(video.duration || 0);
timeCurrent.textContent = formatTime(current);
timeDuration.textContent = formatTime(duration);
progressBar.value = video.duration ? (video.currentTime / video.duration) * 100 : 0;
});</p><p>// 进度条拖动
progressBar.addEventListener('input', () => {
const newTime = (progressBar.value / 100) * video.duration;
video.currentTime = newTime;
});</p><p>// 静音切换
muteBtn.addEventListener('click', () => {
video.muted = !video.muted;
muteBtn.textContent = video.muted ? '?' : '?';
});</p>

注意:需补充 formatTime(seconds) 辅助函数(如 Math.floor(s / 60) + ':' + (s % 60).toString().padStart(2, '0'))。

html-deploy
html-deploy

使用 htmlcode.fun 将 HTML 内容或文件部署到网页,适用于用户要求“部署到网页”“托管此 HTML”“生成此前端...的实时链接”等场景。

下载

3. 处理加载与交互细节

视频元数据加载完成前,时长可能为 NaN;用户拖拽时需防止未就绪就设置 currentTime;还要处理播放失败、网络中断等异常:

  • 监听 loadedmetadata 再初始化进度条最大值和总时长显示
  • 拖拽 input 事件触发时,先检查 video.readyState >= 1 再执行跳转
  • 给 video.play() 加 .catch() 避免自动播放被浏览器拦截时报错阻塞逻辑
  • 可监听 waiting 和 canplay 来显示加载状态(如旋转图标)

4. CSS 实现真正“完全自定义”外观

所有按钮、滑块、文字都可自由设计。关键是重置原生 <input type="range"> 样式(不同浏览器需分别处理):

.custom-controls {
  display: flex;
  align-items: center;
  padding: 8px;
  background: rgba(0,0,0,0.7);
  border-radius: 4px;
}
.play-btn, .mute-btn {
  background: none;
  border: none;
  color: white;
  font-size: 18px;
  cursor: pointer;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  transition: background 0.2s;
}
.play-btn:hover { background: rgba(255,255,255,0.1); }
<p>.progress-bar {
-webkit-appearance: none;
height: 4px;
flex: 1;
margin: 0 12px;
background: #333;
border-radius: 2px;
}
.progress-bar::-webkit-slider-thumb {
-webkit-appearance: none;
width: 16px;
height: 16px;
border-radius: 50%;
background: #fff;
cursor: pointer;
}</p>

其他样式(如全屏按钮、音量条、画中画开关)按需添加即可,结构与逻辑保持一致。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2183

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4663

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5810

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5238

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

743

5

js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

4346

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1089

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

4264

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

860

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB 17.2 官方文档集合
GDB 17.2 官方文档集合

共0课时 | 0人学习

Bootstrap 入门安装配置
Bootstrap 入门安装配置

共0课时 | 0人学习

38+ PhpStorm 提示和技巧
38+ PhpStorm 提示和技巧

共1课时 | 216人学习