|
|
- <style>
- #papa {
- position: absolute;
- left: 50%;
- transform: translateX(-50%);
- width: clamp(800px, 75vw, 1280px);
- height: clamp(450px, 75vh, 750px);
- background: #eee url('https://pic.imgdb.cn/item/668a84acd9c307b7e9437ddf.jpg') no-repeat center/cover;
- z-index: 1;
- }
- .zw {
- height: clamp(450px, 75vh, 750px);
- margin: 30px;
- --state: paused;
- z-index: 1;
- }
- #lrcDiv {
- writing-mode: vertical-rl;
- --hlcolor: #FF44AA;
- position: absolute;
- top: 1%;
- right: 10%;
- display: flex;
- flex-direction: column;
- gap: 6px;
- width: 145px;
- height: 650px;
- overflow: hidden;
- font: normal 18px/24px 'Microsoft YaHei', sans-serif;
- text-align: center;
- color: #FFBB66;
- background: none;
- z-index: 5;
- }
- #lrcDiv>p {
- margin: 0;
- padding: 0;
- transition: .95s;
- }
- #lrcDiv>p.hlight {
- color: var(--hlcolor);
- font-size: 28px;
- font-weight: bold;
- }
- #mplayer {
- z-index: 5;
- --track: silver;
- --prog: red;
- --percent: 0;
- display: flex;
- left: 300px;
- top: 580px;
- gap: 15px;
- flex-direction: column;
- align-items: center;
- width: 650px;
- background: none;
- color: white;
- padding: 15px;
- position: absolute;
- }
- #btns-area {
- width: 100%;
- display: flex;
- justify-content: space-between;
- margin-top: 15px;
- }
- #btn-play {
- width: 20px;
- height: 20px;
- cursor: pointer;
- position: relative;
- }
- #btn-play:hover::after {
- opacity: .7;
- filter: alpha(opacity:.5);
- }
- #btn-play::after {
- position: absolute;
- content: '';
- width: 100%;
- height: 100%;
- background: var(--prog);
- clip-path: var(--clip);
- }
- #progDiv {
- z-index: 5;
- width: 100%;
- height: 10px;
- background: linear-gradient(to right, var(--prog) var(--percent), var(--track) var(--percent), var(--track) 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);
- }
- .vid {
- position: absolute;
- width: 100%;
- height: 100%;
- opacity: .8;
- object-fit: cover;
- mask: radial-gradient(transparent 20%, red);
- -webkit-mask: radial-gradient(transparent 20%, red);
- pointer-events: none;
- left: 0px;
- top: 0px;
- }
- </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>
- <video class="vid " src="https://bpic.588ku.com/video_listen/588ku_video/22/11/03/14/51/00/video636364d43e50d.mp4" loop muted autoplay=""></video>
- <audio src="https://cccimg.com/view.php/d05d8a08510c3c47ab212b4fa6668f52.mp3" autoplay loop></audio>
- </div>
- <div class="zw"></div>
- <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 = [], isFScreen = false;
- let lineHeight = 40, showLines = 5; // 滚动需要的关键参数
- lrcDiv.style.width = lineHeight * showLines + 'px'; // 根据行数计算容器的宽度
-
- const getLrcAr = (text) => {
- const ar = text.trim().split(/[\r\n]+/g);
- var reg = /\[(\d+)[.:](\d+)[.:](\d+)\](.*)/;
- ar.forEach(item => {
- let result = item.match(reg);
- let tmsg = parseInt(result[1]) * 60 + parseInt(result[2]) + parseInt(result[3]) / 1000;
- lrcAr.push([tmsg, result[4].trim()]);
- let p = document.createElement('p');
- p.textContent = result[4].trim();
- lrcDiv.appendChild(p);
-
- });
- lrcAr.sort((a, b) => a[0] - b[0]);
- };
- const updatePlayerDatas = () => {
- const percent = (aud.currentTime / aud.duration) * 100;
- time1.innerText = formatTime(aud.currentTime);
- time2.innerText = formatTime(aud.duration);
- mplayer.style.setProperty('--percent', percent + '%');
- for (let i = 0; i < lrcAr.length; i ++) {
- const lrc = {time: lrcAr[ i ][0], text: lrcAr[ i ][1]};
- const next = i < lrcAr.length - 1 ? lrcAr[i + 1][0] : null;
- const p = lrcDiv.children[ i ];
- if (aud.currentTime >= lrc.time && (!next || aud.currentTime < next)) {
- p.classList.add('hlight');
- //lrcDiv.scroll({left: 0, top: p.offsetLeft - lrcDiv.offsetHeight / 2 + 12, behavior: 'smooth'});
- // 滚动的关键代码,与原来的比较下就知道为什么不动了。
- lrcDiv.scroll({left: p.offsetLeft - (Math.ceil(showLines / 2) * lineHeight) + lineHeight, top: 0, 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);
- papa.style.setProperty('--state', 'paused');
- } else {
- btnPlay.className = 'pause';
- btnPlay.title = '点击暂停';
- playvids(true);
- papa.style.setProperty('--state', 'running');
- }
- };
- 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 = `
- [00:00.00]时光匆匆如流水(Live 合唱版)-付飞社
- [00:03.83]词:未子夫
- [00:07.66]曲:李勇军
- [00:11.49]编曲:姜凯升
- [00:15.32]后期:鲁晓锋
- [00:19.15]和声:凌菲
- [00:22.98]制作人:李勇军工作室
- [00:26.81]OP:新创焦桐文化
- [00:30.64]【曲库专用】
- [00:34.47]来到人世间受苦又受累
- [00:42.00]尝尽了人生百般滋味
- [00:49.53]一路坎坷雨打又风吹
- [00:57.03]回首这半生我太过狼狈
- [01:04.50]春去秋来 花开花枯萎
- [01:11.97]转眼我青丝 已经成了灰
- [01:19.47]想找个地方 好好醉一回
- [01:27.06]又害怕醉了没人可依偎
- [01:34.50]时光匆匆 岁月如流水
- [01:42.00]往事随风 一去不再回
- [01:49.56]不知不觉容颜已憔悴
- [01:57.06]我这辈子遭了太多罪
- [02:04.47]时光匆匆 岁月如流水
- [02:12.03]人到了中年 没路可以退
- [02:19.53]看遍了人间是是与非非
- [02:27.06]我若心碎 谁给我安慰
- [02:32.43]谁给我安慰
- [03:12.00]春去秋来 花开花枯萎
- [03:19.47]转眼我青丝 已经成了灰
- [03:26.97]想找个地方 好好醉一回
- [03:34.53]又害怕醉了没人可依偎
- [03:41.94]时光匆匆 岁月如流水
- [03:49.47]往事随风 一去不再回
- [03:57.03]不知不觉容颜已憔悴
- [04:03.69]我这辈子遭了太多罪
- [04:11.91]时光匆匆 岁月如流水
- [04:19.50]人到了中年 没路可以退
- [04:27.00]看遍了人间是是与非非
- [04:34.53]我若心碎 谁给我安慰
- [04:40.08]谁给我安慰
- `;
- getLrcAr(lrc);
- aud.addEventListener('timeupdate', updatePlayerDatas);
- aud.addEventListener('playing', mState);
- aud.addEventListener('pause', mState);
- btnPlay.addEventListener('click', () => aud.paused ? aud.play() : aud.pause());
- </script>
复制代码
|
|