原生LRC歌词播放器[修改马老播放器]
本帖最后由 亚伦影音工作室 于 2025-3-23 20:18 编辑 <br /><br /><style>#papa {
margin: 80px 0 0 calc(50% - 721px);
width: 1280px;
height: 680px;
box-shadow: 4px 8px 28px gray;
background:radial-gradient(circle,transparent, rgba(10,40,18)100%),url('https://pic1.imgdb.cn/item/671d8d6ed29ded1a8cbe9b99.jpg') no-repeat center/cover;
overflow: hidden;
z-index: 1;
position: relative;
--state: paused;
}
#mplayer { --prg: 0%; margin: 600px 820px auto; padding: 6px;width: 350px; position: absolute; color: #fff;}
#lrcDiv { padding: 0px 0; width: 550px; height: 130px; overflow: hidden; text-align: center; box-sizing: border-box; position: absolute;top: 200px;left: 92px;filter:drop-shadow(#000 1px 0 0)drop-shadow(#000 0 1px 0)}
#lrcDiv > p { margin:20px auto; padding: 0; color: #eee;font: normal 22px 华文行楷; transition: .1s; }
#lrcDiv p.hlight {color: transparent;font: normal 30px 华文行楷;background: linear-gradient(45deg, #fff202 31%,#5BF61A 50%,#fff000 77%);-webkit-background-clip: text; }
#btns-area { width: 100%; display: flex; justify-content: space-between; }
#btn-play { width: 20px; height: 20px; cursor: pointer; position: relative; }
#btn-play::after { position: absolute; content: ''; width: 100%; height: 100%; background: red; clip-path: var(--clip); }
#progDiv { width: 100%; height: 10px; background: linear-gradient(to right, red var(--prg), gray var(--prg), gray 0) no-repeat 0 50% / 100% 2px; cursor: pointer; }
.play { --clip: polygon(10% 0, 100% 50%, 10% 100%); }
.pause { --clip: polygon(40% 0, 40% 100%, 20% 100%, 20% 0, 80% 0, 80% 100%, 60% 100%, 60% 0); }
</style>
<div id="papa">
<div id="lrcDiv"></div>
<div id="mplayer">
<div id="btns-area">
<div id="time1">00:00</div>
<div id="btn-play" class="pause"></div>
<div id="time2">00:00</div>
</div>
<div id="progDiv"></div>
</div>
</div>
<audio src="https://s2.ananas.chaoxing.com/sv-w9/audio/aa/86/1c/0b67d75bfbc0fd65f67e601491c458ef/audio.mp3" autoplay loop></audio>
<script>
const mplayer = document.querySelector('#mplayer');
const aud = document.querySelector('audio');
const lrcDiv = document.querySelector('#lrcDiv');
const progDiv = document.querySelector('#progDiv');
const btnPlay = document.querySelector('#btn-play');
const vids = document.querySelectorAll('video');
let lrcAr = [];
//处理LRC歌词
const getLrcAr = (text) => {
const ar = text.trim().split('\n');
ar.sort();
var reg = /\[(\d+)[.:](\d+)[.:](\d+)\](.*)/;
ar.forEach(item => {
let result = item.match(reg);
let tmsg = parseInt(result) * 60 + parseInt(result) + parseInt(result) / 1000;
lrcAr.push(.trim()]);
let p = document.createElement('p');
p.innerText = result.trim();
lrcDiv.appendChild(p);
});
};
//渲染播放器
const updatePlayerDatas = () => {
const hh = lrcDiv.offsetHeight / 5 + 20;
const prg = (aud.currentTime / aud.duration) * 100;
time1.innerText = formatTime(aud.currentTime);
time2.innerText = formatTime(aud.duration);
mplayer.style.setProperty('--prg', prg + '%');
for (let i = 0; i < lrcAr.length; i ++) {
const lrc = {time: lrcAr, text: lrcAr};
const next = i < lrcAr.length - 1 ? lrcAr : null;
const p = lrcDiv.children;
if (aud.currentTime >= lrc.time && (!next || aud.currentTime < next)) {
p.classList.add('hlight');
lrcDiv.scroll({left: 0, top: p.offsetTop - hh, behavior: 'smooth'});
} else {
p.classList.remove('hlight');
}
}
};
//时间格式化输出
const formatTime = (seconds) => {
const mins = Math.floor(seconds / 60);
const secs = Math.floor(seconds % 60);
return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
};
//联动管控机制
const mState = () => {
if (aud.paused) {
btnPlay.className = 'play';
btnPlay.title = '点击播放';
playvids(false);
} else {
btnPlay.className = 'pause';
btnPlay.title = '点击暂停';
playvids(true);
}
};
//播放视频
const playvids = (flag) => {
if(!vids) return;
vids.forEach(vid => flag ? vid.play() : vid.pause());
};
//进度条操作
progDiv.addEventListener('click', (e) => aud.currentTime = e.offsetX / progDiv.offsetWidth * aud.duration);
progDiv.addEventListener('mousemove', (e) => progDiv.title = formatTime(e.offsetX / progDiv.offsetWidth * aud.duration));
const lrc = `陪你千山万水 (DJ何鹏版) - 樊少华&唐薇
词:樊少华
曲:樊少华
(未经许可,不得翻唱或使用)
女:
微微的风儿 轻轻吹
吹的我呀心儿醉
男:
一路美景有你陪
远行万里也不觉累
女:
满山的花儿 那么美
蝴蝶起舞翩翩飞
男:
一路幸福的滋味
只因有你在相随
女:
我陪你呀跨千山
男:
我陪你呀走万水
合:
紧紧牵着你的手
无论天亮到天黑
女:
我陪你呀走西东
男:
我们一起闯南北
合:
只要陪在你身边
今生我决不后悔
女:
微微的风儿 轻轻吹
吹的我呀心儿醉
男:
一路美景有你陪
远行万里也不觉累
女:
满山的花儿 那么美
蝴蝶起舞翩翩飞
男:
一路幸福的滋味
只因有你在相随
女:
我陪你呀跨千山
男:
我陪你呀走万水
合:
紧紧牵着你的手
无论天亮到天黑
女:
我陪你呀走西东
男:
我们一起闯南北
合:
只要陪在你身边
今生我决不后悔
女:
微微的风儿 轻轻吹
吹的我呀心儿醉
男:
一路美景有你陪
远行万里也不觉累
女:
满山的花儿 那么美
蝴蝶起舞翩翩飞
男:
一路幸福的滋味
只因有你在相随
女:
我陪你呀跨千山
男:
我陪你呀走万水
合:
紧紧牵着你的手
无论天亮到天黑
女:
我陪你呀走西东
男:
我们一起闯南北
合:
只要陪在你身边
今生我决不后悔`;
getLrcAr(lrc);
aud.addEventListener('timeupdate', updatePlayerDatas);
aud.addEventListener('playing', mState);
aud.addEventListener('pause', mState);
btnPlay.addEventListener('click', () => aud.paused ? aud.play() : aud.pause());
</script>
欣赏佳作,问候亚伦。 简洁、大气、灵敏!谢谢马老师,谢谢亚伦老师{:4_191:} 漂亮,黑黑也做了歌词和播放器的分离呢。
亚伦老师的这个歌词同步也好看{:4_187:}
页:
[1]