预览地址css
2018年05月01日21:37:28 完成了主页的推荐音乐、热歌榜、搜索和播放页面。html
2018年4月20日15:18:13 这是一个项目笔记,用于记录制做这个项目的点点滴滴。ajax
我选择了browser-sync,由于这个项目比较轻量(不须要引入不少的模块),因此就直接用一个browoser-sync配合开发实时刷新就好了。项目完成之后再用打包工具build一个dist就行了~~正则表达式
究竟是怎么实现光盘旋转?CSS动画,利用keyframes:json
@keyframes circle {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.disc {
animation:circle 20s infinite linear;
/*选择动画,circle;时间;无限循环;线性变化*/
}
复制代码
page
,上半层为点唱机disc-container
容器,下半层为歌曲信息song-description
。(把各个img素材添加进去。)links
容器。(mock数据)page
一个满屏的高度,100vh。三个部分由上到下列式排布,用flax吧。而后根据判断就给各个img设置宽高。audio.pause()
,同时移除表示playing的状态class。首页的制做相对简单些。api
./song.html
,同时附带上歌曲的id。在song.js
上,根据location.search
得到歌曲的id。(须要用正则匹配)location.search.match(/\bid=([^&]*)/)[1]
复制代码
其实热歌榜的难度不大,里面的歌曲载入能够服用前面首页的loadmusic,因此就略过吧。数组
code===200
,说明成功了。
audio.currentTime
获得的是当前播放进度的秒数(注意,须要设置定时每隔500毫秒获取一次)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
}
复制代码
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数据会很繁琐。`
解决:七牛存储/自建api
4. `搜索框提示`和`搜索显示内容的节流`
5. `歌词滚动`
解决:要想好好歌词显示的逻辑:
- 肯定歌曲时间戳(`audio.currentTime`)
- 根据时间戳匹配歌词(遍历歌词节点,根据歌词节点的`data-time`属性与时间戳进行比较,当时间戳位于两行歌词的`data-time`之间,高亮上一条歌词)
- 滚动歌词(`transform:translateY`)
复制代码
待更新promise