@Audio

off
素材准备
点击下载素材 Alizee-La Isla Bonita.mp3或自行准备
. inline
. 播放音频文件,如.mp3、.ogg、.wav
. 默认情况下,只有src属性,元素不可见,需要通过js控制
<audio src=""></audio>
. 指定播放控制属性,则元素可视化控制
<audio src="" controls></audio>
类别 说明
src 音频的URL,推荐使用MP3格式
autoplay 自动播放;布尔属性
controls 播放控制条;布尔属性
loop 重复播放;布尔属性
muted 静音播放;布尔属性
preload 预加载;如果使用autoplay,则忽略该属性
hidden 隐藏;同display:none;隐藏后,仍然可以使用js控制!!!
[] 背景音乐
阶段1:页面加载后自动循环播放,且隐藏
. 优点:简单直接
. 缺点:用户体验差,参与度低,不方便个性化定制
<audio src="./mp3/Alizee-La Isla Bonita.mp3" autoplay loop hidden>您的浏览器不支持audio标签</audio>
. 大多和HTML标签属性一一对应;此外还有
类别 说明
autoplay 设置或返回是否在就绪(加载完成)后随即播放音频
currentTime 设置或返回音频中的当前播放位置;以秒计)
ended 返回音频的播放是否已结束
muted 设置或返回是否关闭声音
paused 设置或返回音频是否暂停
played 播放状态;返回表示音频已播放部分的 TimeRanges 对象
src 设置或返回音频的 src 属性的值
volume 设置或返回音频的音量: 0.0(静音)- 1.0(最大声)
. 媒体在加载和使用中的各种事件;更多媒体事件,请查看底部链接
类别 说明
Audio() 构造方法;创建一个不可视的音频组件,如播放背景
loadstart 开始加载
durationchange 时长发生变化触发;加载完毕后,从NaN变为实际的数值
loadedmetadata 加载元数据:时长、尺寸大小(视频)、文本轨道等等
loadeddata 当前帧的数据加载完毕,下一帧还未就绪
progress 媒体正在下载中
canplay 媒体就绪,可以播放
canplaythrough 媒体就绪,可以正常播放且无需停顿和缓冲
play 播放
pause 暂停
. <audio>的媒体事件触发顺序为
loadstart
durationchange
loadedmetadata - 可以获取duration
loadeddata
progress
canplay
canplaythrough
辅助函数
. 获取的时间通常要转化为一定的格式,如mm:ss,参考代码如下
function time(secs) {
  let min = Math.floor(secs / 60);
  let sec = Math.floor(secs % 60);
  let secRes = sec > 9 ? `${sec}` : `0${sec}`;
  let minRes = min > 9 ? `${min}` : `0${min}`;
  return `${minRes}:${secRes}`;
}
[] 背景音乐
阶段2:定制样式,采用js控制背景的播放
. 优点:用户可控
. 缺点:音频src不可调
1. H5结构:<audio>和播放控制
<span id="play">play</span>
<span id="stop">stop</span>
<audio src="Alizee.mp3"></audio>
2. CSS:自行完成UI设计
3. JS控制:在<body>区末尾添加<script>并完成js逻辑:获取元素;点击播放或暂停
<script>
  window.onload = function () {
    let playBtn = document.querySelector('#play-btn');
    let stopBtn = document.querySelector('#stop-btn');
    let audioBg = document.querySelector('#audio-bg');
    playBtn.onclick = function () {
      audioBg.play();
    }
    stopBtn.onclick = function () {
      audioBg.pause();
    }
  }
</script>
阶段3:利用Audio构造函数生成音频实例,并动态指定src,增加更多控制,如音量[后续]
[] 音乐开关
. 见顶部
. 除了显式的使用<audio>外[记得隐藏],还可以使用构造函数new一个音频对象
. 除了根据音频属性paused状态判断是否暂停外,还可以根据元素文字判断,或者根据类判断[如果使用属性played判断。。。]
. 除了文字外,还可以使用图片或字体图标设计UI
let bg = new Audio();
bg.src = '/music/Alizee-La Isla Bonita.mp3'
bg.pause();
let switch = document.querySelector('.switch')
switch.addEventListener('click', () => {
    if (bg.paused) {
        switch.innerHTML = 'on'
        bg.play();
    } else {
        switch.innerHTML = 'off'
        bg.pause();
    }
    switch.classList.toggle('active')
})
[] MINI音乐播放器1
Alizee-La Isla Bonita
00:00
00:00
[思路]
使用<audio>元素构造函数创建音频对象并指定src
根据设计创建播放列表样式,包括资源说明和控制按钮
根据播放状态切换控制按钮为播放按钮或暂停按钮
利用js事件控制<audio>的播放和暂停
根据当前播放时长currentTime和总时长duration,获取播放进度百分比,设置元素的内联变量--per属性,并由其伪元素使用,设置相应的百分比进度条
[HTML]
<div class="custom-audio">
  <audio id='audio'>您的浏览器不支持audio标签</audio>
  <span>Alizee-La Isla Bonita</span>
  <div class="cur">00:00</div>
  <div id="ctrl" class="play"></div>
  <div class="dur">00:00</div>
</div>
[CSS]
.custom-audio {
    --per: 0%;
    position: relative;
    //...
}
.custom-audio::before {
  content: '';
  position: absolute;
  left: 0;
  bottom: 0px;
  width: var(--per);
  height: 2px;
  background-color: var(--warn-color);
}
#ctrl {
    width: 20px;
    height: 20px;
    background-size: cover;
    cursor: pointer;
}
.play {
    background-image: url(../imgs/Play.png);
}
.pause {
    background-image: url(../imgs/Pause.png);
}
[JavaScript]这里利用控制按钮的类名[更改背景图片]判断播放状态,也可以通过定义bool变量判断
let audio = new Audio();
audio.src = '/music/Alizee-La Isla Bonita.mp3';
let tag = document.querySelector('.custom-audio');
let ctrl = document.querySelector('#ctrl');
let cur = document.querySelector('.cur');
let dur = document.querySelector('.dur');
audio.addEventListener('loadedmetadata', () => {
  dur.innerHTML = time(audio.duration);
})
audio.addEventListener('timeupdate', () => {
  let secs = audio.currentTime;
  cur.innerHTML = time(audio.currentTime);
  let per = (audio.currentTime / audio.duration) * 100 + '%';
  tag.style.setProperty('--per', per);
})
audio.addEventListener('click', function () {
  ctrl.click()
})
ctrl.addEventListener('click', function () {
  if (ctrl.className == 'play') {
    audio.play()
    ctrl.className = 'pause'
  } else {
    audio.pause()
    ctrl.className = 'play'
  }
})
[] MINI音乐播放器2
. player - 无CSS
总结与作业 Summary & Homework
总结
. 音频的使用和定制
1. 谨慎使用背景音乐
2. 为了首页加载速度,通常不直接在主页放置音频/视频;而是通过超链接的方式转到单独的页面播放
3. 如果坚持在首页展示,一般设置 mute(音频不可以设置mute)和 preload,同时禁止 autoplay
4. js控制时,不允许未经任何交互直接播放:play() failed because the user didn't interact with the document first.
5. 更多使用技巧,请访问 custom-audio-player
作业
. 分别使用可视化控制和js控制实现背景音乐的播放
. 定制音乐开关按钮
. 定制音乐播放列表
. 扩充并完善到个人网站