|
|

楼主 |
发表于 2023-2-18 17:36
|
显示全部楼层
原始代码
- <style>
- #papa {
- margin: auto;
- padding: 20px;
- width: 700px;
- height: 400px;
- box-shadow: 3px 3px 20px #000;
- position: relative;
- }
- #lrc {
- --motion: cover2;
- --tt: 2s;
- --state: paused;
- --bg: linear-gradient(180deg, hsla(60, 50%, 50%, .45), hsla(80, 70%, 50%, .65));
- position: absolute;
- font: bold 2em sans-serif;
- color: snow;
- white-space: pre;
- -webkit-background-clip: text;
- filter: drop-shadow(1px 1px 2px hsla(0, 0%, 0%, .95));
- }
- #lrc::before {
- position: absolute;
- content: attr(data-lrc);
- width: 20%;
- height: 100%;
- color: transparent;
- overflow: hidden;
- white-space: pre;
- background: var(--bg);
- filter: inherit;
- -webkit-background-clip: text;
- animation: var(--motion) var(--tt) linear forwards;
- animation-play-state: var(--state);
- }
- @keyframes cover1 { from { width: 0; } to { width: 100%; } }
- @keyframes cover2 { from { width: 0; } to { width: 100%; } }
- @keyframes rot { to { transform: rotate(1turn); } }
- </style>
- <div id="papa">
- <audio id="aud" src="https://music.163.com/song/media/outer/url?id=2021373243.mp3" controls loop autoplay></audio>
- <div id="lrc" data-lrc="HCPlayer">HCPlayer</div>
- </div>
- <script>
- /*原始lrc歌词*/
- let lrcStr = `[00:02.00]Kirsty刘瑾睿 - 若把你\n[00:03.99]总有一些话来不及说了\n[00:09.51]总有一个人是心口的朱砂\n[00:16.02]想起那些话那些傻眼泪落下\n[00:22.98]只留一句你现在好吗\n[00:30.60]如果爱忘了泪不想落下\n[00:37.14]那些幸福啊让她替我到达\n[00:43.59]如果爱懂了承诺的代价\n[00:50.10]不能给我的请完整给她\n[01:08.86]总有些牵挂旧的像伤疤\n[01:14.49]越是不碰它越隐隐的痛在那\n[01:21.61]想你的脸颊你的发我不害怕\n[01:27.78]就让时间给我们回答\n[01:34.00]如果爱忘了泪不想落下\n[01:40.35]那些幸福啊让她替我到达\n[01:46.06]如果爱懂了承诺的代价\n[01:53.37]不能给我的请完整给她\n[02:01.87]我说我忘了不痛了\n[02:05.68]那是因为太爱太懂了\n[02:07.86]笑了原谅了为你也值得\n[02:13.98]用你的快乐告诉我\n[02:17.43]现在放开双手是对的\n[02:20.55]别管我多舍不得\n[02:25.83]如果爱忘了就放他走吧\n[02:32.28]那些幸福啊让她替我到达\n[02:38.79]如果爱懂了承诺的代价\n[02:45.30]不能给我的请完整给她`;
- /*变量 :mKey - 当前歌词索引;mFlag :调用关键帧动画索引*/
- let mKey = 0, mFlag = true;
- /*函数 :获取每句歌词用时,歌词用时若超过平均值则取平均值,最后一句歌词则取平均值*/
- let lrcTime = (ar) => {
- let tmpAr = [];
- for(j = 0; j <ar.length - 1; j ++) {
- if(j !== ar.length - 1) tmpAr[j] = parseFloat((ar[j+1][0] - ar[j][0]).toFixed(1));
- }
- let aver = parseInt(tmpAr.reduce((a,b) => a + b) / (tmpAr.length - 1));
- tmpAr.push(aver);
- tmpAr.forEach((item,key) => {
- ar[key][2] = item > aver ? aver : item;
- });
- return ar;
- };
- /*函数 :从原始lrc歌词获取信息并存入 n*2 数组*/
- let getLrcAr = (str) => {
- let lines = [], lrcAr = [];
- let reg = /\[(\d{2,}:\d{2,}.\d{2,})\](.*)/g;
- if(!str.match(reg)) return;
- lines = str.replace(reg,'$1-{}-$2').split('\n');
- for(k = 0; k < lines.length; k ++) {
- lrcAr[k] = [];
- for(j = 0; j < 3; j ++) {
- let tmpAr = lines[k].split('-{}-');
- lrcAr[k][j] = j === 0 ? toSecs(tmpAr[0]) : tmpAr[1];
- }
- }
- return lrcTime(lrcAr); /* 数组变为 n*3 */
- };
- /*函数 :原始lrc时间转为秒数*/
- let toSecs = (lrcTime) => {
- let reg = /\d{2,}/g;
- let ar = lrcTime.match(reg);
- return parseInt(ar[0])*60 + parseInt(ar[1]) + parseInt(ar[2])/1000;
- };
- /*函数 :模拟显示同步歌词*/
- let showLrc = (time) => {
- let name = mFlag ? 'cover1' : 'cover2';
- lrc.innerHTML = lrcAr[mKey][1];
- lrc.dataset.lrc = lrcAr[mKey][1];
- lrc.style.setProperty('--motion', name);
- lrc.style.setProperty('--tt', time + 's');
- lrc.style.setProperty('--state', 'running');
- mKey += 1;
- mFlag = !mFlag;
- };
- /*函数 :处理当前歌词索引 mKey*/
- let calcKey = () => {
- for (j = 0; j < lrcAr.length; j++) {
- if (aud.currentTime <= lrcAr[j][0]) {
- mKey = j - 1;
- break;
- }
- }
- if (mKey < 0) mKey = 0;
- if (mKey > lrcAr.length - 1) mKey = lrcAr.length - 1;
- let time = lrcAr[mKey][2] - (aud.currentTime - lrcAr[mKey][0]);
- showLrc(time);
- };
- /*格式化时间信息*/
- let toMin = (val) => {
- if (!val) return '00:00';
- val = Math.floor(val);
- let min = parseInt(val / 60),
- sec = parseFloat(val % 60);
- if (min < 10) min = '0' + min;
- if (sec < 10) sec = '0' + sec;
- return min + ':' + sec;
- }
- /*函数 :歌词同步状态切换*/
- let mState = () => lrc.style.setProperty('--state', aud.paused ? 'paused' : 'running');
- /*监听播放进度*/
- aud.addEventListener('timeupdate', () => {
- for (j = 0; j < lrcAr.length; j++) {
- if (aud.currentTime >= lrcAr[j][0]) {
- cKey = j;
- if (mKey === j) showLrc(lrcAr[j][2]);
- else continue;
- }
- }
- });
- aud.addEventListener('pause', () => mState());/*监听暂停事件*/
- aud.addEventListener('play', () => mState());/*监听播放事件*/
- aud.addEventListener('seeked', () => calcKey());/*监听查询事件*/
- let lrcAr = getLrcAr(lrcStr); /*获得歌词数组*/
- </script>
复制代码
|
评分
-
| 参与人数 1 | 威望 +50 |
金钱 +100 |
经验 +50 |
收起
理由
|
红影
| + 50 |
+ 100 |
+ 50 |
赞一个! |
查看全部评分
|