用H5和js写一个移动端自定义播放器
前言
由于html5自带的播放器样式不怎么好看,大多数人都是自己写一个来满足业务需求。这一次的需求如下:
1.不要上一曲下一曲
2.有进度条和播放暂停按钮
3.有时间显示
demo实现功能
1.进度条滚动
2.时间显示
3.播放控制
4.多平台播放
关键代码展示
<body>
<div class="top"></div>
<div id="containner"> <div style="width: 78px; height: 30px; border-radius: 11px; text-align: center; margin:0px auto; ">
<div><img id="icon" src="played.jpg" onclick="play()" width="" height="" /></div> </div>
<div style="width:100%; height:22px; padding-right:50px;"><span id="showtime" >:</span><span>/</span><span id="currenttime">:</span></div> <div id="barbox" class="graph" style="width:98%">
<strong id="bar" class="bar" style="width: 0%;"></strong>
</div> <div id="divplayer">
<audio id="player" src="" loop="" autostart="true" hidden="true"></audio>
</div> </div> </body>
</html>
<script language="javascript">
//成员变量
var url = 'mp3/myeye.mp3';//(设定文件路径)
var pausedimg = "paused.png";
var playedimg = "played.jpg";
var div = document.getElementById('divplayer');
var player = document.getElementsByTagName('audio')[];
player.src = url;
//文件长度(秒)
var fileseconds = ;
//定时器对象
var progressStateTimer;
//进度条父容器宽度
var barboxwidth = ;
//进度条当前宽度
var currentbarwidth = ;
//每秒追加宽度
var appendwidth = ;
//进度条对象
var bar;
//当前运行秒数
var currentseconds = ; function play() {
if (player && player.paused) { //获取文件时长
fileseconds = parseInt(player.duration);
//显示文件时长
document.getElementById("showtime").innerHTML = (formatTime(fileseconds));
//获取进度条的容器宽度
barboxwidth = document.getElementById("barbox").style.width; //获取容器变量备用
bar = document.getElementById("bar");
//开始播放
player.play();
//显示暂停按钮
document.getElementById("icon").src = pausedimg;
//执行进度条方法
progressStateTimer = setInterval(prossbar, );
} else if (player && player.played) {
//暂停并停止进度条
player.pause();
//显示播放按钮
document.getElementById("icon").src = playedimg;
//停止进度条
clearInterval(progressStateTimer);
}
else {
//进到此处说明player未实例化 或者状态不是播放和暂停
//dosomething
}
} var prossbar = function () { if (fileseconds > ) {
//重新计算新的宽度 if (currentseconds == ) {
appendwidth = ;
} else
{
appendwidth = (currentseconds / fileseconds) * ;
} bar.style.width = appendwidth + "%";
//显示当前播放的时间
document.getElementById("currenttime").innerHTML = formatTime(currentseconds);
currentseconds++;
if (currentseconds > fileseconds || currentbarwidth >= barboxwidth) {
//停止播放并清除进度条计时器
player.pause();
clearInterval(progressStateTimer);
}
}
} function formatTime(second) {
return [parseInt(second / % ), parseInt(second % )].join(":")
.replace(/\b(\d)\b/g, "0$1");
}
</script>
效果图预览
PC端运行
移动端运行
进度条实现原理
1.利用一个DIV作为容器,一个子DIV作为进度条,初始时设定子DIV宽度为0%
2.获取音频文件总时长(有属性可以直接获取(单位为秒))
3.(核心)利用timer计时器来计算当前播放了多少秒,一秒运行一次(可自由设置)
4.利用播放的秒数/文件总秒数/100 =当前的进度条的百分比
5.直接给进度条设定当前宽度
6.判断播放时长和文件时长一致就停止计时器
进度条的广泛运用
多div组成的进度条之前也曾经用该进度条来实现大文件上传,可以多任务执行
demo下载
如果我的分享能帮到你,麻烦给点个赞吧!如果发现错误,也请及时拍砖!请关注我的个人主页http://www.cnblogs.com/jingch
用H5和js写一个移动端自定义播放器的更多相关文章
- JS写一个漂亮的音乐播放器
先放上效果图: 正如图中所展示的播放器那样,我们用HTML+CSS+JS将这个效果实现出来. HTML页面布局 <div class="music"> <div ...
- 如何用vue打造一个移动端音乐播放器
写在前面 没错,这就是慕课网上的那个vue音乐播放器,后台是某音乐播放器的线上接口扒取,虽然这类项目写的人很多,但不得不说这还是个少有的适合vue提升的好项目,做这个项目除了想写一个比较大并且功能复杂 ...
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
- JS写一个简单日历
JS写一个日历,配合jQuery操作DOM <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...
- 前端与编译原理——用JS写一个JS解释器
说起编译原理,印象往往只停留在本科时那些枯燥的课程和晦涩的概念.作为前端开发者,编译原理似乎离我们很远,对它的理解很可能仅仅局限于"抽象语法树(AST)".但这仅仅是个开头而已.编 ...
- 如何使用 js 写一个正常人看不懂的无聊代码
如何使用 js 写一个正常人看不懂的无聊代码 代码质量, 代码可读性, 代码可维护性, clean code WAT js WTF https://www.destroyallsoftware.com ...
- 用原生js写一个"多动症"的简历
用原生js写一个"多动症"的简历 预览地址源码地址 最近在知乎上看到@方应杭用vue写了一个会动的简历,觉得挺好玩的,研究一下其实现思路,决定试试用原生js来实现. 会动的简历实现 ...
- 单片机裸机下写一个自己的shell调试器(转)
源: 单片机裸机下写一个自己的shell调试器
- Hide-Music-Player 一个完整的音乐播放器《IT蓝豹》
Hide-Music-Player 一个完整的音乐播放器 Hide-Music-Player 一个完整的音乐播放器,本例子主要包括几个点 (1)摇一摇进入播放器 (2)下拉展开新视图(扫描音乐) (3 ...
随机推荐
- Java设计模式 工厂模式概念解析
定义:工厂模式专门负责将大量有共同接口的类实例化.工厂模式可以动态决定将哪一个类实例化,而不必事先知道每次要实例化哪一个类. 三种形态: 简单工厂模式:又称静态工厂方法 工厂方法模式:又称多态性工厂模 ...
- PHP字符串处理函数
/* * 确定字符串长度 * int strlen(string str) * 比较两个字符串 * 1.strcmp函数对两个字符串进行二进制安全的比较,并区分大小写 * int strcmp(str ...
- bzoj4213: 贪吃蛇
题意:给定一个网格,有一些格子是障碍不用管,剩余的是空地,你要用一些起点和终点在边界上的路径或环来完全覆盖掉空地,如果使用第一种,会付出1的代价,求最小代价,不能覆盖则输出-1. 现在看到网格而且数据 ...
- Java中使用二重循环打印沙漏图形
1.首先判断外层,A .B.C.D都符合条件 2.那么再看内层 A :int i=0;i<5;i++ 当i=1时;带入到第二个内层循环中 int j=0;j<Math.abs(i)*2+1 ...
- SpringMVC 文件上传&拦截器&异常处理
文件上传 Spring MVC 为文件上传提供了直接的支持,这种支持是通过即插即用的 MultipartResolver 实现的.Spring 用 Jakarta Commons FileUpload ...
- 关于Thinkphp Upload类
$this->uploads($picurl); public function uploads($picurl) { $config = array( 'maxSize' => 3145 ...
- Windows 通用应用尝试开发 “51单片机汇编”总结
一.前言 终于完成windows通用应用“51单片机汇编”,半年前开始玩WindowsPhone开发的第一个真正意义上的App(还很多缺点=_=).开发从1月中旬考完试到今天,期间实习了半个月,玩了几 ...
- Microsoft Word 段前距设置和页眉设置
在毕设论文整理中,段前距的设置和页眉的设置不起作用,这着实让我脑袋疼.网上搜索了几种方式,搭配一下还是起了作用. 一. 段前距设置 1. 各级标题在首页,段前距设置不起作用. 选择要段前分页的段落,右 ...
- Permutations II 再分析
记得第一遍做这题的时候其实是没什么思路的,但是第二次的时候,我已经有"结果空间树"的概念了.这时候再看https://oj.leetcode.com/problems/permut ...
- c# 第一个实例 通哥
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...