视频播放速度控制器:交互式用户体验设计
本文将深入分析一个视频播放速度控制器实现,通过直观的滑块交互让用户实时调整视频播放速度。这个设计不仅功能实用,还提供了优雅的视觉反馈
核心功能解析
js:
// 1. 获取元素
var speed = document.querySelector('.speed'); // 速度控制条容器(白色背景)
var bar = document.querySelector('.speed-bar'); // 彩色速度条
var video = document.querySelector('.flex'); // 视频元素
// 2. 监听白色容器上的鼠标移动事件
speed.addEventListener('mousemove', function(e) {
// 3. 计算鼠标在白色容器内的垂直位置(相对容器顶部)
var y = e.pageY - speed.offsetTop;
// 4. 计算鼠标位置占容器高度的百分比 (0-1)
var percent = y / speed.offsetHeight;
// 5. 将百分比转换为高度值(带%单位)
var height = Math.round(percent * 100) + '%';
// 6. 设置彩色速度条的高度
bar.style.height = height;
// 7. 设置播放速度范围(最小和最大值)
var min = 0.4; // 最低播放速度
var max = 4; // 最高播放速度
// 8. 根据百分比计算实际播放速度
// 公式:速度 = 百分比 × (最大速度 - 最小速度) + 最小速度
var playbackRate = percent * (max - min) + min;
// 9. 在彩色条上显示当前速度(保留2位小数)
bar.textContent = playbackRate.toFixed(2) + 'x';
// 10. 将计算出的速度应用到视频上
video.playbackRate = playbackRate;
})
-
百分比转换:
y / speed.offsetHeight将绝对位置转换为容器高度百分比 (0-1)- 例如:容器高200px,鼠标在100px处 → 50% → 0.5
-
速度映射:
- 将线性百分比 (0-1) 映射到速度范围 (0.4-4)
- 当鼠标在顶部:percent=0 → 速度=0.4x
- 当鼠标在底部:percent=1 → 速度=4x
- 中间位置线性过渡
-
位置计算:
e.pageY获取鼠标在页面中的垂直坐标speed.offsetTop获取容器相对于文档顶部的距离- 两者相减得到鼠标在容器内部的垂直位置
-
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<div class="wrapper">
<video
class="flex"
src="https://media.w3.org/2010/05/sintel/trailer.mp4"
controls
></video>
<!-- 滑块 -->
<div class="speed">
<div class="speed-bar">1x</div>
</div>
</div>
<script src="./index.js"></script>
</body>
</html>
主体(body):
-
页面包含一个
<div>,类名为wrapper,它包裹了两个主要元素:一个视频播放器和一个速度控制条。 -
视频播放器:
- 用户可以通过视频自带的控制条播放/暂停视频
- 支持进度条拖拽、音量控制等标准功能
<video>元素,类名为flex,设置了一个视频源(src)为你的视频地址,并包含controls属性,这样浏览器会提供默认的视频控制界面(播放/暂停按钮、进度条等)。
-
速度控制条:
- 一个类名为
speed的<div>,内部有一个类名为speed-bar的<div>,初始显示文本为"1x"(表示1倍速播放)。 -
- 用户应能通过拖动
.speed-bar调整播放速度
- 用户应能通过拖动
- 滑块位置越高 → 播放速度越快
- 滑块位置越低 → 播放速度越慢
- 速度值实时显示在
.speed-bar上(如 0.5x, 1.5x 等)
- 一个类名为
- css:
*{
margin: 0;
padding: 0;
}
body{
height: 100vh;
background: #4c4c4c url('https://unsplash.it/1500/900?image=1021');
background-size: cover;
display: flex;
justify-content: center;
align-items: center;
}
.wrapper{
display: flex;
width: 850px;
}
.flex{
width: 765px;
height: 430px;
}
.speed{
flex: 1; /* 占据剩余空间 */
display: inline-block; /* 行内块显示(但这里在flex容器内,flex:1会覆盖) */
background: #fff; /* 白色背景 */
margin: 10px; /* 外边距10px */
border-radius: 50px; /* 圆角50px,形成椭圆效果 */
overflow: hidden; /* 隐藏超出部分,确保内部的.speed-bar不会超出圆角边界 */
}
.speed-bar{
width: 100%; /* 宽度与父容器相同 */
height: 16.3%; /* 初始高度,约为父容器高度的16.3% */
background: linear-gradient(to bottom, #d75d29 0%, #b0068e 100%); /* 从上到下的渐变色 */
display: flex; /* 弹性布局 */
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
color: #fff; /* 文字颜色为白色 */
}
布局效果说明:
-
整体布局:
- 页面居中显示850px宽的容器
- 容器内水平排列:左侧视频(765px) + 右侧速度条(剩余宽度)
-
速度控制条设计:
- 白色胶囊形状容器(圆角50px)
- 内部彩色渐变条初始显示16.3%高度
- 速度值文字居中显示在彩色条上
-
响应式特点:
- 速度条高度会随JavaScript交互变化(通过bar.style.height)
- 背景渐变保持固定方向(从上到下)
效果图:
快来试试看,做一个你的倍数视频播放器吧
欢迎友友们点赞评论!