HTML5音频(自定义mp3播放器源码)
audio对象
src兼容.ogg .wav .mp3
- <audio controls src='data/imooc.wav'></audio>
width autoplay loop muted静音
- <audio controls src='data/imooc.wav' autoplay loop width='500' height='500' muted></audio>
播放play()
- var myAudio = new Audio();
- myAudio.src = 'data/imooc.wav';
- myAudio.play();
- btn.onclick = function(){
- myAudio.play();
- };
暂停pause()
- pauseNode.onclick = function(){
- myAudio.pause();
- };
当前播放的时间currentTime
音频总时长duration
- //返回音频的总长度
- myAudio.addEventListener('canplay',function(){
- durationNode.innerHTML = myAudio.duration;
- });
- //更新当前播放的时间
- setInterval(function(){
- currentNode.innerHTML = myAudio.currentTime;
- },100);
音频源currentSrc
- var myAudio = new Audio();
- myAudio.src = 'data/imooc.mp3';
- console.log(myAudio.currentSrc);
loop循环
- myAudio.loop = true;
音频播放结束ended
- myAudio.addEventListener('ended',function(){
- console.log('音频播放结束');
- console.log(myAudio.ended)
- });
重新加载
- loadBtn.onclick = function(){
- myAudio.load();
- };
跳转到新的播放位置seeked / seeking
- myAudio.addEventListener('seeked',function(){
- console.log('seeked');
- });
- myAudio.addEventListener('seeking',function(){
- console.log('seeking');
- sekingNum++;
- seekingNum.innerHTML = sekingNum;
- });
playbackRate设置当前播放速度
- myAudio.playbackRate = '15';
- console.log(myAudio.playbackRate)
全屏requestFullScreen
- btnScreen.onclick = function(){
- myAudio.webkitRequestFullScreen();
- }
loop 循环
- myAudio.loop = true;
volumechange音量改变
- myAudio.addEventListener('volumechange',function(){
- console.log('音频的声音改变了')
- });
timeupdate音频正在播放状态
- myAudio.addEventListener('timeupdate',function(){
- console.log('音频正在播放中...')
- })
自定义mp3播放器
放图
- <!doctype html>
- <html>
- <head>
- <meta charset="utf-8">
- <title></title>
- <style type="text/css">
- *{margin: 0;padding: 0;list-style: none;}
- .outerNode{width: 505px;height: 406px;position: absolute;left: 50%;top: 50%;margin: -204px 0 0 -253.5px;border: 1px solid #a6a18d;border-radius:8px;box-shadow: 0 0 16px #a6a18d; }
- .innerNode{width: 503px;height: 405px;border-top:1px solid #e1d1b9;border-left:1px solid #ceccbf;border-radius: 8px;overflow: hidden;border-right:1px solid #ceccbf; }
- .topNode{width: 100%;height: 198px;border-bottom: 1px solid #787463;background: url(music/pic/fmt01.jpg) center center;background-size:cover; transition:.7s;position: relative;}
- .lineNode{
- width: 100%;height: 46px;border-top: 1px solid #f9f7ee;border-bottom: 1px solid #a29d8a;background: url(musicimage/linebg.jpg) repeat-x;
- }
- .progressNode{width: 440px;height: 18px;float: left;margin:13px 0 0 28px;background: url(musicimage/progressbg.jpg) repeat-x;position: relative; }
- .progressNode .progressleft{
- width: 7px;height: 100%;position: absolute;left: 0;
- background: url(musicimage/leftNode.jpg);
- }
- .progressNode .progressright{
- width: 7px;height: 100%;position: absolute;right: 0;
- background: url(musicimage/rightNode.jpg);
- }
- .bottomNode{
- width: 100%;height: 157px;border-top: 1px solid #a29d8a;
- background: url(musicimage/bottombg.jpg) repeat-x;position: relative;
- }
- .lastNode{width: 75px;height: 74px;position: absolute;background: url(musicimage/lastBg.png) no-repeat;left: 118px;top: 39px;cursor: pointer;}
- .playNode{width: 95px;height: 94px;position: absolute;background: url(musicimage/playNode.png) no-repeat;left: 202px;top: 29px;cursor: pointer;}
- .nextNode{width: 75px;height: 74px;background: url(musicimage/rightbg.png) no-repeat;position: absolute;left: 306px;top: 39px;cursor: pointer;}
- .volumeNode{width: 37px;height: 32px;background: url(musicimage/volume.png) no-repeat; position: absolute;right: 43px;top: 58px;cursor: pointer;}
- .no_volumeNode{width: 37px;height: 32px;background: url(musicimage/no_volume.png) no-repeat; position: absolute;right: 43px;top: 58px;cursor: pointer;}
- .trueLine{position: absolute;left: 3px;top: 2px;height: 12px;width: 0%;
- background: url(musicimage/green_bg.png) repeat-x;border-radius: 6px;
- border-right: 1px solid #787463;
- }
- .musicName{color: white;position: absolute;bottom: 2px;left: 5px;}
- </style>
- </head>
- <body>
- <!-- outerNode 最外层的元素 -->
- <div class='outerNode'>
- <!-- innerNode 内层元素 -->
- <div class='innerNode'>
- <!-- topNode 封面图元素 -->
- <div class='topNode'>
- <!-- 音乐名称 -->
- <div class='musicName'></div>
- </div>
- <!-- lineNode 进度条元素 -->
- <div class='lineNode'>
- <!-- 进度条-->
- <div class='progressNode'>
- <div class='progressleft'></div>
- <div class='progressright'></div>
- <!-- 真正的进度条 -->
- <div class='trueLine'></div>
- </div>
- </div>
- <!-- bottomNode 空间元素 -->
- <div class='bottomNode'>
- <!-- lastNode 上一曲的按钮-->
- <div class='lastNode'></div>
- <!-- playNode 播放暂停的按钮 -->
- <div class='playNode'></div>
- <!-- nextNode 下一曲的按钮 -->
- <div class='nextNode'></div>
- <!-- volumeNode 静音或非静音的按钮-->
- <div class='volumeNode'></div>
- </div>
- </div>
- </div>
- <script type="text/javascript">
- //播放暂停的按钮
- //playBln 控制播放暂停的布尔值
- var playBtn = document.querySelector('.playNode'),
- playBln = true,
- //控制声音的按钮
- //volumeBln 控制声音的布尔值
- volumeNode = document.querySelector('.volumeNode'),
- volumeBln = true,
- //进度条的选择器
- trueLine = document.querySelector('.trueLine'),
- //进度条外层的元素
- progressNode = document.querySelector('.progressNode'),
- //最外层元素
- outerNode = document.querySelector('.outerNode'),
- //选择一下封面背景
- topNode = document.querySelector('.topNode'),
- //下一首歌的按钮
- nextNode = document.querySelector('.nextNode'),
- //上一首歌的按钮
- lastNode = document.querySelector('.lastNode'),
- //音乐名称
- musicName = document.querySelector('.musicName');
- //给播放器添加js
- //创建audio对象
- var myAudio = new Audio();
- //给audio对象一个 src
- //所有的数据存在数组里面
- let allMusic = [{
- 'MusicSrc':'music/mus/AcousticGuitar1.mp3',
- 'MusicPic':'music/pic/fmt01.jpg',
- 'MusicName':'AcousticGuitar1'
- },{
- 'MusicSrc':'music/mus/AmazingGrace.mp3',
- 'MusicPic':'music/pic/fmt02.png',
- 'MusicName':'AmazingGrace'
- },{
- 'MusicSrc':'music/mus/FeelsGood2B.mp3',
- 'MusicPic':'music/pic/fmt03.jpg',
- 'MusicName':'FeelsGood2B'
- },{
- 'MusicSrc':'music/mus/FunBusyIntro.mp3',
- 'MusicPic':'music/pic/fmt04.jpg',
- 'MusicName':'FunBusyIntro'
- },{
- 'MusicSrc':'music/mus/GreenDaze.mp3',
- 'MusicPic':'music/pic/fmt05.jpg',
- 'MusicName':'GreenDaze'
- },{
- 'MusicSrc':'music/mus/Limosine.mp3',
- 'MusicPic':'music/pic/fmt06.jpg',
- 'MusicName':'Limosine'
- }],Index = 0;
- myAudio.src = allMusic[Index].MusicSrc;
- //给封面赋值
- topNode.style.backgroundImage = 'url('+allMusic[Index].MusicPic+')';
- //给音乐名称
- musicName.innerHTML = allMusic[Index].MusicName;
- //谷歌浏览器不允许直接play
- //myAudio.play();
- //播放暂停的事件
- playBtn.onclick = function(){
- //myAudio.play();
- playBln = !playBln;
- if(playBln == false){
- myAudio.play();
- }
- else{
- myAudio.pause();
- }
- };
- //声音的事件
- volumeNode.onclick = function(){
- volumeBln = !volumeBln;
- if(volumeBln == false){
- myAudio.volume = 0;
- this.className = 'no_volumeNode';
- }
- else{
- myAudio.volume = 1;
- this.className = 'volumeNode';
- }
- };
- //播放时 进度条的长度控制计算
- myAudio.addEventListener('timeupdate',function(){
- trueLine.style.width = myAudio.currentTime / myAudio.duration * 100 + '%';
- });
- //点击progressNode元素 让进度条直接到达这个位置
- progressNode.onclick = function(e){
- var ev = e || event;
- //算法 就是 算出 点击的位置 在 外层进度条的 多少像素
- //需要一个鼠标坐标点 减去 外层元素的 offsetLeft 和 最外层元素的offsetLeft
- // 320秒 * 0.50 = 160秒
- myAudio.currentTime = myAudio.duration * ((ev.clientX - (this.offsetLeft + outerNode.offsetLeft))/this.offsetWidth);
- trueLine.style.width = ((ev.clientX - (this.offsetLeft + outerNode.offsetLeft))/this.offsetWidth) * 100 + '%';
- };
- //下一首歌的事件
- nextNode.onclick = function(){
- Index ++;
- if(Index == allMusic.length){
- Index = 0;
- }
- MusicPlayFn();
- };
- //音乐播放的函数
- function MusicPlayFn(){
- myAudio.src = allMusic[Index].MusicSrc;
- myAudio.currentTime = 0;
- trueLine.style.width = '0%';
- if(playBln == false){
- myAudio.play();
- }
- else{
- myAudio.pause();
- }
- //给封面赋值
- topNode.style.backgroundImage = 'url('+allMusic[Index].MusicPic+')';
- //给音乐名称
- musicName.innerHTML = allMusic[Index].MusicName;
- }
- //上一首歌的点击事件
- lastNode.onclick = function(){
- Index --;
- if(Index == -1){
- Index = allMusic.length-1;
- }
- MusicPlayFn();
- };
- </script>
- </body>
- </html>
HTML5音频(自定义mp3播放器源码)的更多相关文章
- 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)
一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 源码下载:http://code.66 ...
- 一款非常简单的android音乐播放器源码分享给大家
一款非常简单的android音乐播放器源码分享给大家,该应用虽然很小,大家常用的播放器功能基本实现了,可能有点还不够完善,大家也可以自己完善一下,源码在源码天堂那里已经有了,大家可以到那里下载学习吧. ...
- 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...
- 项目源码--Android3D影音播放器源码
下载源码 技术要点: 1.本地音乐管理 2.音频流的解码 3. UI控件的综合使用 4. 视频流的解码 5. 动态更换皮肤 6. 3D效果的实现 7. 源码带详细的中文注释 ...... 详细 ...
- 实例源码--Android简单音乐播放器源码
下载源码 技术要点: 1.本地音乐管理 2.在线音乐听歌.下载 3.音频流的解码 4. HTTP通信模块 5. Sqlite数据库 6. 源码带详细的中文注释 ...... 详细介绍: 1.本 ...
- H5音乐播放器源码地址
源码获取 https://pan.baidu.com/s/1pR_bhIFFQWU6TK9ZvrRWIA 安卓安装包下载地址 https://pan.baidu.com/s/1Z8HF5LY ...
- H5音乐播放器源码共享
由于博客云后台管理工具写起东西来实在难受,所以直接共享源码了! https://pan.baidu.com/s/1XeRxlk7iv5qt1f16s64F9w H5源码!暂时只支持手机适配,电脑端 ...
随机推荐
- Actix-web Rust连接Postgres数据库
Actix-web Rust连接Postgres数据库 Rust1.39支持了异步async,await,Actix-web在2.0.0-alpha支持了原生异步写法,所以本文中使用的Actix- ...
- Codevs 1205 单词反转(Vector以及如何输出string)
题意:倒序输出句子中的单词 代码: #include<cstdio> #include<iostream> #include<string> #include< ...
- 基于 HTML5 WebGL 的智慧楼宇三维可视化监控
前言 可视化的智慧楼宇在 21 世纪是有急迫需求的,中国被世界称为"基建狂魔",全球高层建筑数量位居首位,所以对于楼宇的监控是必不可少.智慧楼宇可视化系统更多突出的是管理方面的功能 ...
- 使用Java8 Files类读写文件
Java8 Files类的newBufferedReader()和newBufferedWriter()方法 这两个方法接受Path类型的参数.Path 类是Java8 NIO中的接口.可以由Path ...
- kubernetes集合
kubernetes集合 kubernetes(1):kubernetes简介和组件 kubernetes(2):yum安装kubernetes kubernetes(3):kubeadm安装k8s1 ...
- ELK 记录 java log4j 类型日志
ELK 记载 java log4j 时,一个报错会生成很多行,阅读起来很不方便. 类似这样 解决这个问题的方法 1.使用多行合并 合并多行数据(Multiline) 有些时候,应用程序调试日志会包含 ...
- React之JSX的语法细节
带注释 import React, { Component, Fragment } from 'react' import './style.css' class TodoList extends C ...
- asp.net MVC项目开发之统计图echarts后台数据的处理(三)
前台显示的东西,有相应的文档很容易修改,后台传递数据方式才是我们最关心的 首先要记住,我们一步数据使用的是post,那么后台代码我们要给方法加上 [HttpPost]注解 不然异步没有效果 下面上代码 ...
- redis教程-redis环境搭建安装(qq:1324981084)
需要整套redis缓存高可用集群教学视频的加qq:1324981084,本套视频从安装到集群的搭建和源码的解析,从零基础讲解. 1.利用命令将redis下载到/usr/local/文件夹下: wget ...
- 分形的奥秘!分形着色器!shader 编程入门实战 ! Cocos Creator!
极致的数学之美! 什么是分形? "一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状" 简单来说,分形(fractal)就像这个doge表情包 ...