VUE移动端音乐APP学习【十二】:播放器播放时间获取和更新

播放器播放时间的dom结构:

 <div class="progress-wrapper">
    <span class="time time-l"></span>
   <div class="progress-bar-wrapper">
     </div>
     <span class="time time-r"></span>
 </div>

data里需要有个变量表示当前时间 currentTime

 

data() {
    return {
      songReady: false,
      currentTime: 0,
    };
  },

 

有了变量之后如何修改呢?当歌曲播放的时候,audio标签会派发一个事件timeupdate,这个事件的回调函数起名为updateTime。

然后在method里定义这个updateTime,它的参数是一个event对象,它的target就是audio标签。audio标签有一个叫currentTime的属性,表示的是audio当前播放的时间,是一个可读写的属性。将audio的currentTime赋值给data里的currentTime

 

updateTime(e) {
      this.currentTime = e.target.currentTime;
    },

 

有了currentTime以后,如果直接把它写到上dom上的话,它是一串数字,也就是时间戳。需要把它转化成分和秒的形式

写一个函数来完成时间戳格式化:

 

format(interval) {
      // 向下取整,想等于Math.floor()
      interval |= 0;
      // 获取分的部分
      const minute = interval / 60 | 0;
      // 获取秒的部分
      const second = this._pad(interval % 60);
      return `${minute}:${second}`;
    },

 

然后在插值里调用这个函数,总时长也需要调用这个函数

 

 

          <div class="progress-wrapper">
            <span class="time time-l">{{format(currentTime)}}</span>
            <div class="progress-bar-wrapper">
            </div>
            <span class="time time-r">{{format(currentSong.duration)}}</span>
          </div>

 

这里有个小小的问题 秒为个位数时它也显示个位数,需要补零

 

 

_pad(num, n = 2) {
      // 这个函数的功能就是补到几位,用0去补位
      let len = num.toString().length;
      while (len < n) {
        num = `0${num}`;
        len++;
      }
      return num;
    },

 

运行效果:

currentTime是不断变化的,因为audio会调用timeupdate事件,这个事件里又去设置了currentTime,这个currentTime映射到dom上,所以它是个不断变化的过程。

 

posted @ 2021-04-23 20:38  小风车吱呀转  阅读(390)  评论(0编辑  收藏  举报