1. 音乐播放前进后退的实现   https://blog.csdn.net/weixin_40814356/article/details/80379606

2. 音乐进度条实现(单独一个组件) https://blog.csdn.net/weixin_40814356/article/details/80387804

思想: a. 播放进度条样式  定义高但是不定义宽度。 父组件computed: 当音乐不断变化的时候 它与总时间有个不断变化的百分比

子组件接收的时候 watch它的变化 不断去修改progress和小球的宽度

b. 实现拖动效果

给progress-bar定义触摸事件

在created中创建一个this.touch={}对象,用来保存函数中的一些数据

初始化touch事件 记录第一次触摸的位置,以及此时小球偏移的位置   在progressTouchMove方法中,记录触摸的距离(即拖动的距离),得出当前偏移距离(记录的小球偏移距离加上差值) 结束的时候把初始化置为false

然后实现拖动到指定位置,歌曲播放指定位置的功能    touch结束的时候,向父组件触发一个事件,获取bar的宽度,然后用progress的宽度/bar的宽度,得到百分比 通过$emit传递出去  父组件接收到事件 改变audio的播放点

最最后:实现点击的功能

c. 音乐环形进度条的实现

逻辑的实现:

3.如何获取歌词的数据,并解析jsonp的格式为json的格式

https://blog.csdn.net/weixin_40814356/article/details/80401989

4. 歌词左右滑动的实现  https://blog.csdn.net/weixin_40814356/article/details/80417580

给中间加一个touch事件 用一个currentShow保存歌词显示和隐藏的状态:是唱片页还是歌词页

touchstart的时候维护几个状态:记录x轴和y轴的坐标

touchmove:

 1 middleTouchMove (e) {
 2
 3       if (!this.touch.init) {
 4
 5         return
 6
 7       }
 8
 9       const touch = e.touches[0]
10
11       const deltaX = touch.pageX - this.touch.startX
12
13       const deltaY = touch.pageY - this.touch.startY
14
15       // 为什么维护纵轴,当纵轴大于横轴的偏移的时候,就不应该移动
16
17       if (Math.abs(deltaY) > Math.abs(deltaX)) {
18
19         return
20
21       }
22
23       // 首先记录歌词的起始位置
24
25       const left = this.currentShow === 'cd' ? 0 : -window.innerWidth
26
27       // 最终就两种状态,left的值有两种状态,如果是cd,就是0
28
29       const offsetWidth = Math.min(0, Math.max(-window.innerWidth, left + deltaX))
30
31       // 假如是左滑,那么dalte是负的
32
33       this.touch.percent = Math.abs(offsetWidth / window.innerWidth)
34
35       //这个percent是维护偏移的距离,>0.1和<0.9
36
37       this.$refs.lyricList.$el.style[transform] = `translate3d(${offsetWidth}px, 0, 0)`
38
39       // lyricList是一个scroll组件,是一个vue组件,通过$el可以获取dom
40
41       this.$refs.lyricList.$el.style[transitionDuration] = 0
42
43       this.$refs.middleL.style.opacity = 1 - this.touch.percent
44
45     },

touchend:

 1 middleTouchEnd () {
 2
 3       let offsetWidth
 4
 5       let opacity
 6
 7       // 定义offset和opacity
 8
 9       if (this.currentShow === 'cd') {
10
11         // 如果在cd的情况下
12
13         if (this.touch.percent > 0.1) {
14
15           // 当活动距离超出0.1,做如下操作
16
17           offsetWidth = -window.innerWidth
18
19           opacity = 0
20
21           this.currentShow = 'lyric'
22
23         } else {
24
25           offsetWidth = 0
26
27           opacity = 1
28
29           // 否则回复状态
30
31         }
32
33       } else {
34
35         if (this.touch.percent < 0.9) {
36
37           // 当活动距离小于0.9,做如下操作
38
39           offsetWidth = 0
40
41           opacity = 1
42
43           this.currentShow = 'cd'
44
45         } else {
46
47           offsetWidth = -window.innerWidth
48
49           opacity = 0
50
51         }
52
53       }
54
55       const time = 300
56
57       this.$refs.lyricList.$el.style[transform] = `translate3d(${offsetWidth}px, 0, 0)`
58
59       // 改变他的位置
60
61       this.$refs.lyricList.$el.style[transitionDuration] = `${time}ms`
62
63       // 过渡的时间,在move的时候要清零
64
65       this.$refs.middleL.style.opacity = opacity
66
67       this.$refs.middleL.style[transitionDuration] = `${time}ms`
68
69     },

解决歌词不断跳动:实际上就是清空lyric中的timer计时器

**if (this.currentLyric) {this.currentLyric.stop()}**

View Code

解决歌词和音乐同步播放:

this.setPlayingState(!this.playing)if (this.currentLyric) {this.currentLyric.togglePlay()}

View Code

解决循环播放不会到一开始的问题,在loop的代码如下:

if (this.currentLyric) {this.currentLyric.seek(0)}

View Code

拖动bar的时候,歌词跟着滚动:

播放页歌词的实现:

添加dom

  1. <div class="playing-lyric-wrapper">
  2. <div class="playing-lyric">{{playingLyric}}</div>
  3. </div>

维护一个playLric

然后:在lyric回调的时候设置playingLric

转载于:https://www.cnblogs.com/aimeeblogs/p/9489608.html

Vue音乐项目笔记(三)相关推荐

  1. Vue.js 学习笔记三,一些基础指令,v-bind,v-on

    在笔记二的基础上继续写 v-bind指令,为属性绑定数据 <!--v-bind指令可以绑定属性--><div v-html="msg2" v-bind:title ...

  2. vue音乐笔记_Vue音乐项目笔记(三)

    1. 音乐播放前进后退的实现   https://blog.csdn.net/weixin_40814356/article/details/80379606 2. 音乐进度条实现(单独一个组件) h ...

  3. vue音乐笔记_Vue音乐项目笔记(二)

    1. Vuex https://blog.csdn.net/weixin_40814356/article/details/80347366 编写: 然后,在main.js中引入 在组件中改变stat ...

  4. Vue2 - 网易云音乐项目笔记(基于Vant UI组件库)

    目录 一.项目技术 二.准备工作 1.初始化Vue项目 2.配置Vant UI组件库 3.下载并使用vue-router库 4.接口API 5.postcss插件 三.分析页面实现功能 1.路由页面准 ...

  5. vue音乐项目歌手详情页小结

    技术栈 1,vue 2,vuex 3,vue-router(子路由) 需求分析 1)歌手列表点击歌手会跳转到下级页面歌手详情页,歌手详情页由四个部分组成 歌手图片 返回按钮:点击返回歌手tab页 随机 ...

  6. vue音乐项目歌手页面滚动、吸顶效果

    总结singer页面: 1.api中去获取 ['热',A-Z] 以及根据['热',A-Z]获取的所有歌手的数据 2.渲染数据 2.1 渲染左边 字母title ['热',A-Z] + 该字母开头的歌手 ...

  7. Vue3 vue-cli、create-react-app、vite 创建vue/react项目(笔记)

    文章目录 1. vue-cli vue2/3 项目 2. create-react-app react 项目 3. 使用 vite 安装 vue3 项目 3.1 方式一,框架选择配置安装 3.2 方式 ...

  8. cocos2dx打飞机项目笔记三:HeroLayer类和坐标系

    HeroLayer类主要是处理hero的一些相关东西,以及调用bulletLayer的一些方法,因为子弹是附属于hero的~~ HeroLayer 类的成员如下: 1 class HeroLayer ...

  9. 树莓派魔镜项目——笔记三 第三方库

    介绍几个第三方模块 由于部分module使用了api,则可能涉及以下情况: 1:直接可用的 2:需要科学上网的 3:需要申请api key的 主要修改mouts/config/config.js文件, ...

  10. ASP.Net MVC OA项目笔记三

    1.1.1 业务层和数据层之间加一个数据会话层,封装所有数据操作类实例的创建(工厂类) 工厂类是负责对象的创建 作用:将BLL和DAL解耦了,提供一个数据访问的统一访问点 数据会话层DBSession ...

最新文章

  1. 近期活动盘点:高级机器学习训练营、基于神经网络的代码自动生成” “开放学术图谱”、西山金融科技产业创新论坛...
  2. 任务调度利器:Celery
  3. 如何评估互阻抗放大器(第 1 部分)
  4. ADOQuery的LockType
  5. python从数据库取数据保存为excel_python读取数据库表数据并写入excel
  6. java oop_Java实现OOP(面向对象编程)
  7. [剑指offer]面试题第[65]题[JAVA][不用加减乘除做加法][位运算]
  8. delphi gui编辑工具源码_Python 快速构建一个简单的 GUI 应用
  9. 巧妙mybatis避免Where 空条件的尴尬
  10. 设计模式学习总结(一)——设计原则与UML统一建模语言
  11. Eureka-zookeeper的服务发现替代方案
  12. mysql pconnect_mysql_pconnect()
  13. C#连接Oracle中文乱码问题解决方法
  14. 深入理解android 博客,深入理解Android中ViewGroup
  15. 深度学习入门之猫vs狗(超简单)
  16. LTE通信系统的网络拓扑结构(4G)
  17. git文件标识添加绿色和红色图标
  18. 唯品会收购第三方支付牌照正式落槌 浙江贝付完成更名
  19. 期末C语言不挂科之选择题
  20. MySQL Audit 审计

热门文章

  1. 单调队列:temperature
  2. body标签子级被默认client width截断的解决方法
  3. 编程也讲禅,您读过《金刚经》吗?——ADO.NET核心类的灭度与SQLHelper的诞生——十八相送(上)...
  4. HTML DOM教程 23-HTML DOM Frame 对象
  5. 移动端最小字体限制测试
  6. Lucene全文检索(一)
  7. 玉伯 对 前端的 金玉良言
  8. 网络语音视频技术浅议(附多个demo源码下载)
  9. .NET Framework版本解析
  10. easyui弹出加载遮罩层(转)