这篇是昨天写的,可是思否的文本编辑器太反人类了,昨天懒得改,因此今天才发。我没有中断个人连续水博客计划哦~html
这两天弄了个基于Vue的音乐播放器,由于最近好多人作我也就跟着学了学。尚未很完善,在audio这里玩了好久。之前都没用过audio标签。vue
audio标签是HTML5中新增的标签之一。能够看看HTML5以前怎么导入音频。git
网页内播放能够用embed导入,可是embed标签过不了HTML4的validation。下面这个用了vue绑定src。github
<embed height="50" width="100" :src="songUrl"\>
用来定义声音。promise
下面看看属性们。测试的时候手上没有音乐的话src能够用个人浏览器
https://tianyitimothy.github.io/resources/arcs.mp3dom
src
用来指定音乐的路径。Demo:编辑器
<audio src="song.mp3"> 能看到说明不支持 </audio>
但你会发现用了上面的代码,并不会显示。这是由于没有自定义界面,也没有加上controls
属性。ide
controls
用来指定是否显示默认的音乐面板。Demo:oop
<audio src="song.mp3" controls></audio>
这样浏览器会显示audio标签的默认播放面板。也能够写做:
<audio src="song.mp3" controls="controls"></audio>
controls
默认是没有的,而后值又只有一个"controls",不加他就不会显示面板。可是如今autoplay
属性都已经禁止使用了,只有本身自定义的话才会不须要controls。
loop
存在此属性则开启循环。值只有"loop"。Demo:
<audio src="song.mp3" controls loop></audio>
muted
存在此属性则静音。值只有"muted"。Demo:
<audio src="song.mp3" controls muted></audio>
preload
设定音频的预加载方式。
="auto":自动加载,页面加载后载入整个音频
="metadata":自动加载,页面加载后只载入元数据
="none":不自动加载
PS 手机端的preload会被无视,具体默认值是什么没测试~盲猜全部内核都是none吧~
Demo:
<audio src="song.mp3" controls preload="none"></audio>
就是得到DOM。Demo:
const audioDOM = document.getElementById("audio");
currentTime属性可读可写。返回当前播放时长,单位是秒。能够经过修改它来实现倒退or前进x秒,倒退5秒Demo:
const audioDOM = document.getElementById("audio"); if (audioDOM.currentTime > 5) { audioDOM.currentTime -= 5; } else { audioDOM.currentTime = 0; }
duration属性是可读属性。返回音频总时长,单位是秒。要注意在load()方法以前,duration的值为NaN。用法伪代码:
const audioDOM = document.getElementById("audio"); if (isNaN(audioDOM.duration)) { // 未加载时的操做 } else { // 已加载时的操做 }
volume属性可读可写。返回当前音量,最小是0(静音),最大音量是1。能够经过修改它来实现音量增长or减小的按钮。加10%音量Demo:
const audioDOM = document.getElementById("audio"); if (audioDOM.volume < 0.9) { audioDOM.volume += 0.1; } else { audioDOM.volume = 1; }
音量有时候会变成7.99999999这样的奇葩数字...很奇葩,可是用户来讲没有任何影响。
playbackRate就是播放速率,可读可写,返回播放速度,值是速度的倍率,最大播放速度根据内核的不一样而有所不一样,可是正常来讲2倍已经够用了。选择速度Demo:
// 拿到dom const audioDOM = document.getElementById("audio"); // 不是数字 if(isNaN(rate)){ return; } rate = parseInt(rate); const minRate = 0.5; const maxRate = 2; if (rate <= maxRate && rate >= minRate) { audioDOM.playbackRate = rate; } else if (rate < minRate) { audioDOM.playbackRate = minRate; } else { audioDOM.playbackRate = maxRate; }
使用播放方法让暂停了的音频播放。Demo:
// 拿到dom const audioDOM = document.getElementById("audio"); audioDOM.play();
诶看到这个是否是很心动,autoplay属性被取缔了,那我直接在window.onload里面用play()开始播放不就行了吗?不。若是用户没有“跟页面互动”就会报错!
"Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first."
使用暂停方法让正在播放的音频暂停。Demo:
// 拿到dom const audioDOM = document.getElementById("audio"); audioDOM.pause();
paused属性是可读属性,返回boolean值:若音频是暂停状态,返回true;反之返回false。经过paused实现播放/暂停Demo:
// 拿到dom const audioDOM = document.getElementById("audio"); if (audioDOM.paused === true) { audioDOM.play(); } else { audioDOM.pause(); }
使用播放方法让暂停了的音频播放。Demo:
// 拿到dom const audioDOM = document.getElementById("audio"); audioDOM.play();
若是前面没设置preload或者设置了preload为none,能够用这个方法来触发加载。
实际上是能够被监听的事件们,监听伪代码:
myAudio.addEventListener("loadstart", function() { // 当这个事件触发的时候干吗呢~ });
开始加载音频了。
音频的时长改变了。
能够用做判断“音频初始化”的方法。固然初始化也能够用duration属性是否为NaN或者durationchange来判断,看需求了。
"The loadeddata
event is fired when the first bit of media arrives."在加载了第一位(bit)的文件时触发。我感受这个名字取得很差,loadeddata更像是数据已经加载完了。然而加载完了的事件是canplaythrough`。
音频还在加载中。loader能够在这里部署。
音频能够播放了。能够在这个事件触发以后再把controls设置为能够操做的。
音频加载彻底完成了!
这个time指的是currentTime
,最频繁是“每250毫秒触发一次”。
因为没有数据而致使暂停时触发。
从waiting状态转换到能够播放的状态时触发。
play()方法被调用时触发。
pause()方法被调用时触发。
音频播放完毕后触发。
音量改变时触发。