預覽地址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