预览地址

2018年05月01日21:37:28 完成了主页的推荐音乐、热歌榜、搜索和播放页面。


2018年4月20日15:18:13 这是一个项目笔记,用于记录制作这个项目的点点滴滴。


明确需求

左一开始:主页(推荐音乐)、热歌榜、搜索、歌单和播放界面。

制作历程

自定义一个工作流

我选择了browser-sync,因为这个项目比较轻量(不需要引入很多的模块),所以就直接用一个browoser-sync配合开发实时刷新就行了。项目完成以后再用打包工具build一个dist就好了~~

旋转的光盘

到底是怎么实现光盘旋转?CSS动画,利用keyframes:

@keyframes circle {0% {transform: rotate(0deg);}100% {transform: rotate(360deg);}
}
.disc {animation:circle 20s infinite linear;/*选择动画,circle;时间;无限循环;线性变化*/
}
复制代码
  1. 父容器page,上半层为点唱机disc-container容器,下半层为歌曲信息song-description。(把各个img素材添加进去。)
  2. 底部为两个按钮连接,用一个div包裹links容器。(mock数据)
  3. page一个满屏的高度,100vh。三个部分由上到下列式排布,用flax吧。然后根据判断就给各个img设置宽高。

歌词

  1. 先拿到歌词请求。利用开发者工具里面的network > filter > XHR拿到请求。复制一份,用来mock一份歌词。保存为json文件。
  2. 引入jQuery,发送一个ajax请求刚刚保存的lyric.json并把响应打出来(promise)
  3. 对lyr进行处理。(lyr指的是响应里面的key为lyric的值。lyr = object.lyric) 这是一个字符串,我们通过以回车为分隔符(‘\n’)组成一个新的数组打出来。 效果如下:
  4. 用到正则,匹配中括号里面的时间和后面的歌词内容。然后利用正则的api捕获内容返回给array。注意,这里用到map,是对array里面的每一项string进行match。
  5. 把array的内容生成html的P标签插入document中,属性是时间。
  6. 高度为显示三行歌词的高度。设置好字体大小,居中。
  7. 设置好active样式,给歌词lyric设定一个固定高度,给歌词片段p设置行高。
  8. 歌词播放的时候调整lines(就是存放歌词的div)的transform的样式。

播放

  1. 拿到歌曲的src
  2. 把audio的各种api熟悉一下(播放、暂停、获取当前时间、audio的事件)
  3. 当歌曲播放的时候,上方转盘跟着旋转。
  4. 添加播放按钮(这里我使用了图片)。

暂停

  1. 点击唱片,audio.pause(),同时移除表示playing的状态class。

首页

首页的制作相对简单些。

  1. logo从官方的网页剪下来,是一个svg(透明的,加个背景色就能看见了。)
  2. 完成其CSS样式(这个就比较费时间和功夫了)
  3. 获取几首歌作为样本。可以选择放在七牛用来mock ajax请求。
  4. mock一个song.json,然后把html上写死了的节点删除。根据返回的json拼接成html并插入到dom上。
  5. 首页载入以后,在相应数据到来之前,应该显示一个loading的动画表示正在加载数据;当数据到来以后渲染页面元素,并移除loading动画,目的就是为了提升用户体验。(可以用gif,也可以旋转一个svg图标。)
  6. 发送ajax请求,根据响应对跳转链接的地址进行拼接,同时对歌曲信息进行拼接。(ES6模板字符串)
  7. 拼接完毕以后就渲染到html上,并把载入动画移除。
  8. 点击以后,就会跳转到./song.html,同时附带上歌曲的id。在song.js上,根据location.search获得歌曲的id。(需要用正则匹配)
location.search.match(/\bid=([^&]*)/)[1]
复制代码

热歌榜

其实热歌榜的难度不大,里面的歌曲载入可以服用前面首页的loadmusic,所以就略过吧。

搜索

  1. 需要对api进行修改,把搜索建议的目标地址改一下,改为suggest/keyword 如果响应里面的code===200,说明成功了。
  2. 搜索提示可点击、热搜tag可点击。

歌词滚动

  1. 首先要获取当前歌曲的进度时间:audio.currentTime得到的是当前播放进度的秒数(注意,需要设置定时每隔500毫秒获取一次)
  2. 转换为正常的时间显示01:25,实质是把分钟数和秒数拼接一起,需要解决的就是数字的取整,判断是否需要加0
setInterval(()=>{let  nowScends  =  audio.currentTime;let  minutes  =  ~~(nowScends/60)let  scends  =  ~~(nowScends%60)let  currentTime  = `${padTime(minutes)}:${padTime(scends)}`;},300)
function  padTime(number)  {return  number>10?number+'':'0'+number}
复制代码
  1. 实现歌词滚动的代码:
let  $lrcArray  =  $('.lyric .lines>p'); //这里取的是每一段歌词的集合。
let  lrcLength  =  $lrcArray.length;
for(let  i=0;  i<lrcLength;  i++){let  $whitchLines  =  $lrcArray.eq(i); //指应当显示的歌词行let  $nextLines  =  $lrcArray.eq(i+1); //指接下来要显示的歌词行//当没有下一段歌词的时候,意味歌曲播放到最后,return。if($nextLines.length  ===  0){            return;}else if($whitchLines.attr('data-time')  <  currentTime  &&  $nextLines.attr('data-time')>currentTime){//遍历所有歌词,针对其属性`data-time`与当前的`currentTime`进行比较,如果当前时间比`i`的`data-time`大,比`i+1`的小,说明此时歌词应该是在`i`与`i+1`之间,应该显示$whitchLines的内容。$whitchLines.addClass('active').siblings().removeClass('active')let  gap  =  $whitchLines.offset().top  -  $('.lines').offset().top  ;log('gap ='+  gap)//因为歌词显示区域的高度是显示五行歌词,那么中间的高度就是总高度的五分之三let  middle  =  $('.lyric').height()  /  5  *  2$('.lines').css('transform',`translateY(-${gap-middle}px)`)}
}
复制代码

难点记录与解决历程

1. `处理歌词data,需要会用正则来对字符串进行分割。`
解决:可以利用在线正则网站好好设计一遍你的正则表达式。2. `对播放动画进行设计,实现播放暂停的时候唱片旋转角度不会归零。`
解决:使用 `animation-play-state: paused `
3. `mock数据会很繁琐。`
解决:七牛存储/自建api4. `搜索框提示`和`搜索显示内容的节流`5. `歌词滚动`
解决:要想好好歌词显示的逻辑:- 确定歌曲时间戳(`audio.currentTime`)- 根据时间戳匹配歌词(遍历歌词节点,根据歌词节点的`data-time`属性与时间戳进行比较,当时间戳位于两行歌词的`data-time`之间,高亮上一条歌词)- 滚动歌词(`transform:translateY`)
复制代码

待更新

转载于:https://juejin.im/post/5af4674c5188251b8015b13f

使用jQuery仿制网易云音乐移动端相关推荐

  1. 网易云音乐移动端项目实战(分解下)

    网易云音乐移动端项目实战(分解下) 一.搜索页面与历史搜索记录 <template><div class="listviewTop"><div cla ...

  2. HTML5+CSS3+JS小实例:仿制网易云音乐网站的轮播图

    实例:仿制网易云音乐网站的轮播图 技术栈:HTML+CSS+JS 字体图标库:font-awesome 效果: 源码: <!DOCTYPE html> <html><he ...

  3. 仿网易云音乐Android端歌手资料页面的实现

    最近项目首页需要用到Banner + tab + ViewPager切换的效果,在思考实现的过程中我突然发现,这个效果与网易云音乐Android端的歌手资料页面十分相似,因此好好把玩了一下网易云音乐, ...

  4. 网易云音乐PC端刷曲快捷键

    文章首发于szhshp的第三边境研究所(szhshp.org), 转载请注明 网易云音乐PC端刷曲快捷键 好吧我承认我特别懒 云音乐其实做的还不错,FM推荐的算法明显比虾米好. 虾米可以听的曲子都被我 ...

  5. 网易云音乐移动端项目实战(分解上)

    网易云音乐后台API服务搭建 步骤一 windows系统安装git //傻瓜式安装,可以一直next 步骤二 网易云音乐 NodeJS 版 API 下载好后,在vscode下新建一个文件夹 右击打开g ...

  6. 网易云音乐移动端项目实战(分解中)

    网易云音乐移动端项目实战(分解中) 一.底部全局播放控件制作 play-control.vue <template><div class="playcontrolor&qu ...

  7. 【抓包】网易云音乐WEB端歌曲评论接口分析

    不想看分析的,可以直接跳到最下面看总结,我给出了整个Api接口. 文章目录 抓包流程+分析 总结 抓包流程+分析 随便找首歌,然后打开chrome的开发助手,看看调用了哪些请求. 先猜测是用异步的方式 ...

  8. 前端项目网易云音乐移动端经验总结

    HTML: audio标签控制音乐播放,有个原生play()方法控制播放 marquee这个标签可以实现滑动,类似于动画一样 marquee(文字滚动)标签_别The Crossing的博客-CSDN ...

  9. 通过Promise和JQuery获取网易云音乐热评

    方法一: function createPromise(url){//在Promise对象中封装好ajax请求然后返回出去return new Promise(function(resolve,rej ...

最新文章

  1. Ubuntu 12.04下玩转终端管理器Byobu
  2. 【单片机】时钟周期 器械周期 指令周期的关系
  3. 一款遥控器拆解之后可利用的元器件
  4. 雷军博客1999:互联网创业的黄金年代,2009年移动互联网黄金年,太准了
  5. 我们相信加密! 教程
  6. python版本回退_Python爬虫之BeautifulSoup解析之路
  7. socket 编程入门教程(一)TCP server 端:3、sockaddr与sockaddr_in
  8. Lambda 表达式详解~Stream Pipelines
  9. C/C++函数的本质以及多线程函数的调用过程
  10. 关注LoadRunner脚本回放日志中的Warning信息
  11. java中$和 的区别详解_MyBatis中#{}和${}的区别详解
  12. 从零开始学习Android开发
  13. windows xp输入法设置空白解决的方法
  14. 函数调用中的堆栈平衡
  15. R语言使用aov函数建立单因素方差分析模型、使用TukeyHSD函数采用Tukey法对各组均值的差异进行成对检验、使用plot函数可视化TukeyHSD函数的事后分析的结果、并获得的95%置信区间
  16. java json日期格式化_JSON格式化日期方法
  17. 元数据是什么?如何管理元数据?
  18. 什么是共享设备,对共享设备如何分配?
  19. 前端开发练习——包含了计时功能的动画时钟
  20. 建立“知识共享”生态圈,培养塔尔斯基数学小后代,不是说假话、放空炮

热门文章

  1. 数据挖掘思维和实战06 数据建模:该如何选择一个适合我需求的算法?
  2. 电脑系统修复之--Windows系统开机蓝屏 EFI Network 0 for IPv4(XX-XX-XX-XX-XX)boot failed.
  3. 文件下载(解决中文文件名下载乱码问题)(二)
  4. SAP JCo 3.0 下载
  5. 3NF的无损连接和保持函数依赖的分解、BCNF的无损连接的分解
  6. java jtextarea.setfont_如何在JTextArea中更改文本颜色?
  7. Linux常用命令——sysctl命令
  8. 逻辑地址与物理地址的转换
  9. Mysql中的索引原理
  10. [work] 什么是对抗攻击