(1)H5實現音樂播放器【正在播放-歌詞篇】

来源:https://www.cnblogs.com/lihaolh/archive/2019/02/18/10394152.html
-Advertisement-
Play Games

近期閑來無事,就想著複習一下前端的東西,然後正好跟朋友搞了一個公共開放的音樂api介面,就想著寫一個音樂播放器玩玩! 話不多說,直接上圖,然後上代碼 【播放器顯示正在播放】 實現功能: 1:歌詞隨著歌單滾動! 2:背景虛擬化,跟著歌曲封面圖改變! 這個好多朋友問過我怎麼做到的,這裡可以共用出源碼。 ...


 

 

 

 

 

 

 

 

 

 

 

近期閑來無事,就想著複習一下前端的東西,然後正好跟朋友搞了一個公共開放的音樂api介面,就想著寫一個音樂播放器玩玩!

話不多說,直接上圖,然後上代碼

 

【播放器顯示正在播放】

實現功能:

1:歌詞隨著歌單滾動!

2:背景虛擬化,跟著歌曲封面圖改變!

這個好多朋友問過我怎麼做到的,這裡可以共用出源碼。

  歌詞滾動很重要一點就是需要解析歌詞,其實是我們自己想複雜了,先來看看api獲取的歌詞是什麼樣的:

  如下所示,獲取歌詞其實前面都帶著時間,所以我們要做到的就是根據歌曲播放的時間來跟歌詞前面的時間對比,然後定位到歌詞

  那一行,然後通過js設置那一行歌詞高亮,字體放大,改變字體顏色!

  [by:GoodTM]
  [00:00.00] 作曲 : 花粥
  [00:01.00] 作詞 : 花粥
  [00:10.43]
  [00:11.12]在夜半三更過天橋從來不敢回頭看
  [00:15.86]白日里是車水馬龍此時腳下是忘川
  [00:21.30]我獨自走過半山腰山間野狗來作伴
  [00:25.19]層林盡染百舸流秋風吹過鬼門關
  [00:29.81]一瞬三年五載 品粗茶 食淡飯
  [00:34.49]六界八荒四海 無人與我來叫板
  [00:39.19]人間荒唐古怪 竹林外 有書齋
  [00:43.78]匿於此地暢快 偏來者不善善者不來
    
所以獲取到歌詞之後需要js先解析歌詞,迴圈獲取!
話不多說直接上源碼:

首先ajax請求獲取歌詞!    

   $.ajax({ //非同步請求獲取歌詞

url:url,
type:"post",
success:function(data){

if(data == '暫無歌詞') {
lyricTip('LH MUSIC、給你美好的音樂');
return false;
}

lyricText = parseLyric(data); // 解析獲取到的歌詞   調取下麵解析方法

if(lyricText === '') {
lyricTip('LH MUSIC、給你美好的音樂');
return false;
}

lyricArea.html(''); // 清空歌詞區域的內容
lyricArea.scrollTop(0); // 滾動到頂部

lastLyric = -1;

// 顯示全部歌詞
var i = 0;
for(var k in lyricText){
var txt = lyricText[k];
if(txt.indexOf('純音樂') != -1){
lyricTip('LH MUSIC、給你美好的音樂');
return false;
}
if(!txt) txt = " ";
var li = $("<li data-no='"+i+"' class='lrc-item'>"+txt+"</li>");
lyricArea.append(li);
i++;
}
}      

});

// 解析歌詞
  // 參數:原始歌詞文件
  function parseLyric(lrc) {    //傳入歌詞,解析參數   lrc
    if(lrc === '') return '';  //判斷非空
    var lyrics = lrc.split("\n");  //去除空格
    var lrcObj = {};
    for(var i=0;i<lyrics.length;i++){
    var lyric = decodeURIComponent(lyrics[i]);
    var timeReg = /\[\d*:\d*((\.|\:)\d*)*\]/g;
    var timeRegExpArr = lyric.match(timeReg);
    if(!timeRegExpArr)continue;
    var clause = lyric.replace(timeReg,'');
    for(var k = 0,h = timeRegExpArr.length;k < h;k++) {
    var t = timeRegExpArr[k];
    var min = Number(String(t.match(/\[\d*/i)).slice(1)),
    sec = Number(String(t.match(/\:\d*/i)).slice(1));
    var time = min * 60 + sec;
    lrcObj[time] = clause;
    }
  }
  return lrcObj;
}

 強制刷新當前時間點歌詞

// 強制刷新當前時間點的歌詞
// 參數:當前播放時間(單位:秒)
function refreshLyric(time) {
  if(lyricText === '') return false;

  time = parseInt(time); // 時間取整
  var i = 0;
  for(var k in lyricText){
  if(k >= time) break;
  i = k; // 記錄上一句的
  }

  scrollLyric(i); //滾動歌詞到自定語句方法下麵
}

滾動歌詞都指定語句

// 滾動歌詞到指定句
// 參數:當前播放時間(單位:秒)
function scrollLyric(time) {
  if(lyricText === '') return false;

  time = parseInt(time); // 時間取整

  if(lyricText === undefined || lyricText[time] === undefined) return false; // 當前時間點沒有歌詞

  if(lastLyric == time) return true; // 歌詞沒發生改變

  var i = 0; // 獲取當前歌詞是在第幾行
  for(var k in lyricText){
  if(k == time) break;
  i ++;
  }
  lastLyric = time; // 記錄方便下次使用
  $(".lplaying").removeClass("lplaying"); // 移除其餘句子的正在播放樣式
  $(".lrc-item[data-no='" + i + "']").addClass("lplaying"); // 加上正在播放樣式

  var scroll = (lyricArea.children().height() * i) - ($(".lyric").height() / 2);
  lyricArea.stop().animate({scrollTop: scroll}, 1000); // 平滑滾動到當前歌詞位置(更改這個數值可以改變歌詞滾動速度,單位:毫秒)
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言: 如果你是個前端開發人員,你肯定知道線上環境要把js,css,圖片等壓縮,儘量減少文件的大小,提升響應速度,特別是對移動端,這個非常重要。常用的前端性能優化方法有如下幾種 一、減少http請求 二、CSS Sprites 三、使用CDN加速 四 、css,js代碼壓縮 五、將樣式表放在頭部,將 ...
  • 前端工程本質上是軟體工程的一種。軟體工程化關註的是性能、穩定性、可用性、可維護性等方面,註重基本的開發效率、運行效率的同時,思考維護效率。一切以這些為目標的工作都是"前端工程化"。工程化是一種思想而不是某種技術。 本篇文章你可以學到: 如何使小程式支持scss; 怎樣通過gulp編譯你的項目; 項目 ...
  • 由於博客雲後臺管理工具寫起東西來實在難受,所以直接共用源碼了! https://pan.baidu.com/s/1XeRxlk7iv5qt1f16s64F9w H5源碼!暫時只支持手機適配,電腦端需要後續優化! https://pan.baidu.com/s/1eNOWb0wgIbloPzzqE0a ...
  • 本文由雲+社區發表 作者:QQ音樂前端團隊 在識別和描述核心元素的過程中,我們分享了構建SessionStack時使用的一些經驗法則,這是一個輕量級但健壯且高性能的JavaScript應用程式,以幫助用戶實時查看和重現其Web應用程式的缺陷。 這次我們來分析WebAssembly的工作原理,以及在如 ...
  • 問題 相信很多人在用Vue使用別人的組件時,會用到 Vue.use() 。例如:Vue.use(VueRouter)、Vue.use(MintUI)。但是用 axios時,就不需要用 Vue.use(axios),就能直接使用。那這是為什麼吶? 答案 因為 axios 沒有 install。 什麼意 ...
  • 上篇詳細描述了播放頁歌詞如何實現跟隨跟單滾動,如何解析歌詞,那麼歌單頁又是如何生成的呢,話不多說,直接上圖上代碼! 首先需要獲取數據,具體獲取數據api請轉到我跟我大兄弟博客去觀看學習去,同時也感謝我大兄弟無私跟我們共用介面! www.bzqll.com 我大兄弟博客! 歌單列表生成 首先需要獲取數 ...
  • 效果截圖 HTML結構為: JS代碼為: ...
  • 這樣寫即可, 如果請求中沒有額外的頭信息,只需要加img標簽src=請求介面地址即可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...