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:

 middleTouchMove (e) {

       if (!this.touch.init) {

         return

       }

       const touch = e.touches[0]

       const deltaX = touch.pageX - this.touch.startX

       const deltaY = touch.pageY - this.touch.startY

       // 为什么维护纵轴,当纵轴大于横轴的偏移的时候,就不应该移动

       if (Math.abs(deltaY) > Math.abs(deltaX)) {

         return

       }

       // 首先记录歌词的起始位置

       const left = this.currentShow === 'cd' ? 0 : -window.innerWidth

       // 最终就两种状态,left的值有两种状态,如果是cd,就是0

       const offsetWidth = Math.min(0, Math.max(-window.innerWidth, left + deltaX))

       // 假如是左滑,那么dalte是负的

       this.touch.percent = Math.abs(offsetWidth / window.innerWidth)

       //这个percent是维护偏移的距离,>0.1和<0.9

       this.$refs.lyricList.$el.style[transform] = `translate3d(${offsetWidth}px, 0, 0)`

       // lyricList是一个scroll组件,是一个vue组件,通过$el可以获取dom

       this.$refs.lyricList.$el.style[transitionDuration] = 0

       this.$refs.middleL.style.opacity = 1 - this.touch.percent

     },

touchend:

 middleTouchEnd () {

       let offsetWidth

       let opacity

       // 定义offset和opacity

       if (this.currentShow === 'cd') {

         // 如果在cd的情况下

         if (this.touch.percent > 0.1) {

           // 当活动距离超出0.1,做如下操作

           offsetWidth = -window.innerWidth

           opacity = 0

           this.currentShow = 'lyric'

         } else {

           offsetWidth = 0

           opacity = 1

           // 否则回复状态

         }

       } else {

         if (this.touch.percent < 0.9) {

           // 当活动距离小于0.9,做如下操作

           offsetWidth = 0

           opacity = 1

           this.currentShow = 'cd'

         } else {

           offsetWidth = -window.innerWidth

           opacity = 0

         }

       }

       const time = 300

       this.$refs.lyricList.$el.style[transform] = `translate3d(${offsetWidth}px, 0, 0)`

       // 改变他的位置

       this.$refs.lyricList.$el.style[transitionDuration] = `${time}ms`

       // 过渡的时间,在move的时候要清零

       this.$refs.middleL.style.opacity = opacity

       this.$refs.middleL.style[transitionDuration] = `${time}ms`

     },

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

**if (this.currentLyric) {

        this.currentLyric.stop()

      }**

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

this.setPlayingState(!this.playing)

      if (this.currentLyric) {

        this.currentLyric.togglePlay()

      }

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

if (this.currentLyric) {

          this.currentLyric.seek(0)

        }

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

播放页歌词的实现:

添加dom

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

维护一个playLric

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

Vue音乐项目笔记(三)的更多相关文章

  1. Vue音乐项目笔记(一)

    看到一位小可爱的手记,这里记录一下自己需要注意的地方的链接 1.手写轮播图(上) https://blog.csdn.net/weixin_40814356/article/details/80298 ...

  2. Vue音乐项目笔记(二)

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

  3. Vue音乐项目笔记(五)

    1.搜索列表的点击删除.删除全部的交互事件 https://blog.csdn.net/weixin_40814356/article/details/80496097 seach组件中放search ...

  4. Vue音乐项目笔记(四)(搜索页面提取重写)

    1.如何通过betterScroll组件实现上拉刷新 https://blog.csdn.net/weixin_40814356/article/details/80478440 2.搜索页面跳转单曲 ...

  5. vue 自学项目笔记

    感觉小青推荐的学习网课,  利用vue 仿制一个去哪网, 学习的东西很多, 在食用之前,需要先确保js 和css 过关 js https://www.bilibili.com/video/av3009 ...

  6. [Vue音乐项目] 第一节 环境搭建

    1.Node安装 登录官网,下载最新版本并安装: 在我的电脑内,执行以下操作:右键->属性->高级->环境变量->系统变量->path 查看是否有node的安装路径,没有 ...

  7. 从无到有构建vue实战项目(三)

    四.响应式布局的实现 elemnt-ui参考bootatrap提供了响应式布局,附上地址:https://element.eleme.cn/#/zh-CN/component/layout 以下是我的 ...

  8. ASP.Net MVC OA项目笔记<三>

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

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

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

随机推荐

  1. 连号区间数|2013年蓝桥杯B组题解析第十题-fishers

    连号区间数 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递 ...

  2. extern 用法,全局变量与头文件(重复定义)

    转自 https://www.cnblogs.com/chengmin/archive/2011/09/26/2192008.html 当你要引用一个全局变量的时候,你就要声明,extern int  ...

  3. P3239 [HNOI2015]亚瑟王

    思路 神仙概率dp 由于期望的线性性质,能够想到最后要求的期望价值就是把每个卡牌发动的概率\(g_i\)乘上伤害\(val_i\)之后加到一起 然后怎么求\(g_i\)呢,肯定是要dp的 我想了例如d ...

  4. 给大家分享两套WordPress收费主题

    主题一:No.7 – 极简 by 大当家 1.主题网址:http://qzhai.net/2016-03-546.html 2.主题预览:http://qzhai.net/000/?theme=No. ...

  5. PS与PL协同设计

    https://blog.csdn.net/Fei_Yang_YF/article/details/79676172 什么是PS和PL ZYNQ-7000是Xilinx推出的一款全可编程片上系统(Al ...

  6. Sublime Text3 插件:DocBlockr与javascript注释规范

    原:http://www.ithao123.cn/content-719950.html 1.引子 在写代码的时候,尤其是写脚本,最需要注释了.目前脚本.样式的注释格式都有一个已经成文的约定规范(这些 ...

  7. SAP月末结账年结流程

    SAP月末结账年结流程 SAP月末结账操作指南 流程描述:FI期末结帐流程包括应收帐款.应付帐款.固定资产.管理会计结帐.总帐结帐等一系列结帐过程,对于年结增加了余额结转及固定资产年度改变等动作,通过 ...

  8. HDU 5791 Two(LCS求公共子序列个数)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5791 题意: 给出两个序列,求这两个序列的公共子序列的总个数. 思路: 和LCS差不多,dp[i][ ...

  9. forEach、map、filter、find、sort、some等易错点整理

    一.常用方法解析   说起数组操作,我们肯定第一反应就是想到forEach().map().filter()等方法,下面分别阐述一下各方法的优劣. 1.forEach 1.1 基础点   forEac ...

  10. C#Listview添加数据,选中最后一行,滚屏

    this.listView.Items.Add(lvi); this.listView.EnsureVisible(this.listView.Items.Count - 1); this.listV ...