文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

vue中怎么使用SVG实现圆形进度条音乐播放

2023-06-29 20:41

关注

今天小编给大家分享一下vue中怎么使用SVG实现圆形进度条音乐播放的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

效果图:

vue中怎么使用SVG实现圆形进度条音乐播放

实现过程

一、实现步骤

二、步骤分解

这里先放一下 audio标签引入音频文件的代码:

<audio src="/static/audios/周兴哲 - 你,好不好?.mp3" @timeupdate="timeupdate" id="audio" @ended="ended"></audio>// 实时获取音频当前播放时长    timeupdate(e) {      // console.log("e===>", e.target.currentTime);      this.current = e.target.currentTime;      let duration = document.getElementsByTagName("audio")[0].duration;      let percent = Math.min(1, this.current / duration);      this.dashOffset = (1 - percent) * this.dashArray;    },    ended() {      console.log("播放结束~~~");      this.isStatus = false;      // 初始化 圆形进度条的周长      let circleWidth = document.getElementById("progressCircle").offsetWidth;      this.dashArray = Math.PI * circleWidth;      this.dashOffset = Math.PI * circleWidth;    },

圆形进度条的实现

这里通过SVG画两个一模一样的圆,设置一定的宽度,然后第二个圆使用stroke-dasharraystroke-dashoffset来动态控制进度变化情况。stroke-dashoffset的变化情况要结合音乐的时长来设置。

<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" id="mySvg">            <circle class="progress-background" cx="50%" cy="50%" r="50%" fill="transparent" />            <circle              class="progress-bar"              cx="50%"              cy="50%"              r="50%"              fill="transparent"              :stroke-dasharray="dashArray"              :stroke-dashoffset="dashOffset"            />        </svg>        computed: {            // 实时监听播放进度            getDashOffset() {              let percent = 0;              if (document.getElementsByTagName("audio")[0]) {                // 计算播放进度比例                let duration = document.getElementsByTagName("audio")[0].duration;                percent = Math.min(1, this.current / duration);                this.dashOffset = (1 - percent) * this.dashArray;              } else {                this.dashOffset = (1 - 0) * this.dashArray;              }            }          },          mounted() {            this.$nextTick(() => {              // 初始化圆角周长              let circleWidth = document.getElementById("progressCircle").offsetWidth;              this.dashArray = Math.PI * circleWidth;              this.dashOffset = Math.PI * circleWidth;            });          }

音乐播放/暂停的控制

音乐的暂停和播放状态可以通过document.getElementById("audio").paused来判断,如果返回false则说明当前是播放状态,我们需要触发 document.getElementById("audio").pause()方法实现暂停操作,反之,触发document.getElementById("audio&quot;).play()方法实现播放操作。

// 操作音乐播放/暂停  let audio = document.getElementById("audio");  console.log("this.audio.paused===>", audio.paused);  if (audio.paused) {    audio.play();  } else {    audio.pause();  }

下面方法全部的代码,大家可直接复制到自己的编辑器中运行(记得修改音频路径)

<template>  <div class="playmusic">    <div class="bottom-music">      <div class="music-lt">        <div class="lt-avator">          <img src="/static/img/avator.jpg" alt />        </div>        <div class="lt-title">          <span class="title">你,好不好?</span>          <span class="name">周兴哲</span>        </div>      </div>      <div class="music-rt">        <div class="progress-circle" id="progressCircle" @click="operation">          <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" id="mySvg">            <circle class="progress-background" cx="50%" cy="50%" r="50%" fill="transparent" />            <circle              class="progress-bar"              cx="50%"              cy="50%"              r="50%"              fill="transparent"              :stroke-dasharray="dashArray"              :stroke-dashoffset="dashOffset"            />          </svg>          <span            :class="isStatus?'iconfont icon-bofang3 icons':'iconfont icon-bofang2 icons icons1'"          ></span>        </div>        <span class="iconfont icon-yinleliebiao menu"></span>        <audio src="/static/audios/周兴哲 - 你,好不好?.mp3" @timeupdate="timeupdate" id="audio" @ended="ended"></audio>      </div>    </div>  </div></template><script>export default {  data() {    return {      dashArray: 0,      current: 0,      dashOffset: 0,      isStatus: false // 播放状态  false 暂停  true 播放    };  },  computed: {    // 实时监听播放进度条    getDashOffset() {      let percent = 0;      if (document.getElementsByTagName("audio")[0]) {        // 计算播放进度比例        let duration = document.getElementsByTagName("audio")[0].duration;        percent = Math.min(1, this.current / duration);        this.dashOffset = (1 - percent) * this.dashArray;      } else {        this.dashOffset = (1 - 0) * this.dashArray;      }    }  },  methods: {    // 实时获取音频当前播放时长    timeupdate(e) {      // console.log("e===>", e.target.currentTime);      this.current = e.target.currentTime;      let duration = document.getElementsByTagName("audio")[0].duration;      let percent = Math.min(1, this.current / duration);      this.dashOffset = (1 - percent) * this.dashArray;    },    ended() {      console.log("播放结束~~~");      this.isStatus = false;      // 初始化 圆形进度条的周长      let circleWidth = document.getElementById("progressCircle").offsetWidth;      this.dashArray = Math.PI * circleWidth;      this.dashOffset = Math.PI * circleWidth;    },    // 操作音乐播放/暂停    operation() {      console.log("播放/暂停音乐");      let audio = document.getElementById("audio");      console.log("this.audio.paused===>", audio.paused);      if (audio.paused) {        audio.play();        this.isStatus = true;      } else {        audio.pause();        this.isStatus = false;      }    }  },  mounted() {    this.$nextTick(() => {      // 初始化圆的周长      let circleWidth = document.getElementById("progressCircle").offsetWidth;      this.dashArray = Math.PI * circleWidth;      this.dashOffset = Math.PI * circleWidth;    });  }};</script><style lang="css" scoped>.font {  font-family: PingFangSC-Regular, PingFang SC;  font-weight: 400;}.playmusic {  position: relative;  height: 100vh;  width: 100%;}.playmusic .bottom-music {  box-sizing: border-box;  padding: 0 0.64rem;  z-index: 999;  box-shadow: 5px 5px 5px 5px #efefef, -5px 5px 5px 5px rgba(255, 255, 255, 0.5);}.playmusic .bottom-music {  height: 3.41333333rem;  width: 100%;  position: fixed;  left: 0;  bottom: 0;  display: flex;  justify-content: space-around;  align-items: center;  background-color: #ffffff;}.playmusic .bottom-music .music-lt {  flex: 1;  display: flex;  align-items: center;  justify-content: start;  width: 70%;  overflow: hidden;}.playmusic .bottom-music .music-lt .lt-avator {  width: 2.13333333rem;  height: 2.13333333rem;  border-radius: 50%;  overflow: hidden;}.playmusic .bottom-music .music-lt .lt-avator img {  width: 100%;  height: 100%;  display: block;}.playmusic .bottom-music .music-lt .lt-title {  padding: 0 0.42666667rem;  width: 80%;}.playmusic .bottom-music .music-lt .lt-title span {  display: block;  overflow: hidden;  white-space: nowrap;  text-overflow: ellipsis;  font-family: PingFangSC-Regular, PingFang SC;  font-weight: 400;}.playmusic .bottom-music .music-lt .lt-title .title {  font-size: 0.59733333rem;  font-weight: 600;  color: #333;}.playmusic .bottom-music .music-lt .lt-title .name {  font-size: 0.46933333rem;  color: #666;}.playmusic .bottom-music .music-rt {  display: flex;  justify-content: end;  align-items: center;}.playmusic .bottom-music .music-rt .progress-circle {  width: 1.92rem;  height: 1.92rem;  position: relative;}.playmusic .bottom-music .music-rt .progress-circle circle {  stroke-width: 0.14933333rem;  transform-origin: center;}.playmusic .bottom-music .music-rt .progress-circle .progress-background {  transform: scale(0.9);  stroke: rgba(212, 68, 57, 0.5);}.playmusic .bottom-music .music-rt .progress-circle .progress-bar {  transform: scale(0.9) rotate(-90deg);  stroke: #d44439;}.playmusic .bottom-music .music-rt .progress-circle .icons {  position: absolute;  top: 50%;  left: 50%;  transform: translate(-50%, -50%);  color: #d44439;}.playmusic .bottom-music .music-rt .progress-circle .icons {  font-size: 1.17333333rem;}.playmusic .bottom-music .music-rt .progress-circle .icons1 {  font-size: 0.96rem;}.playmusic .bottom-music .music-rt .menu {  font-size: 1.70666667rem;  color: #d44439;  font-weight: 500;}.playmusic .bottom-music .music-rt .menu {  padding-left: 0.85333333rem;}</style>

以上就是“vue中怎么使用SVG实现圆形进度条音乐播放”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯