查看: 1172|回复: 24

[代码教程] 音画代码(与大家共享)

[复制链接]
千年灵狐
开卷有益 雪花精灵 版主勋章 海洋之心 蝴蝶精灵 花漫千山 江湖之上 江湖靓女 音画同行 一生安柠 樱果相依 红狐狸
发表于 2023-8-22 11:28 | 显示全部楼层 |阅读模式
本帖最后由 婴宁 于 2023-8-22 11:28 编辑


对于音画,本人还是个门外汉,只会简单地按照代码套。
以下的代码,可以说是最简单的,亲们只需要更换自己喜欢的图片和音乐,以及特效即可。
本人班门弄斧了,如有哪位高手能不吝赐教,当倍感荣幸。学而时习之,不亦乐乎!
喜欢音画的新人朋友们,一起来吧

一、《梦里水乡》地址:http://qslt.net/forum.php?mod=viewthread&tid=3450  ,代码如下:
  1. <style>
  2. #papa { margin: 0 0 0 calc(50% - 593px); width: 1300px; height: 850px; background: #000 url('https://s1.ax1x.com/2023/08/05/pPAkpPe.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; overflow: hidden; position: relative; z-index: 1; --state: paused; }
  3. #papa::before { position: absolute; left: calc(50% - 30px); bottom: 20px; content: ''; width: 60px; height: 60px; background: radial-gradient(darkred,red); clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%); cursor: pointer; animation: rot 6s infinite linear var(--state); }
  4. .lizi { display: block; position: absolute; width: 20px; height: 20px; background: white; clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%); }
  5. .boat { position: absolute; left: 0; top: 410px; width: 100px; height: 100px; background: url('https://638183.freep.cn/638183/t23/2/boat.jpg') no-repeat center/cover; offset-path: path('M0,420 Q400,200 800,170'); offset-distance: 100%; mix-blend-mode: multiply; animation: boating 20s var(--delay) infinite linear var(--state); --delay: 0s; }
  6. .boat:nth-of-type(2) { --delay: -7s; }
  7. .boat:nth-of-type(3) { --delay: -14s; }
  8. svg {position: absolute; left: 0; top:200px; border: 1px solid tan;}
  9. @keyframes boating { to { offset-distance: 0%; } }
  10. @keyframes rot { to { transform: rotate(360deg); } }
  11. </style>

  12. <div id="papa">
  13.         <div class="boat"></div>
  14.         <div class="boat"></div>
  15.         <div class="boat"></div>
  16. </div>
  17. <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1868174075" autoplay="autoplay" loop="loop"></audio>

  18. <script>
  19. (function() {
  20.         let stars = [], total = 30, canMove = false;
  21.         let lSteps = Array.from({length: total}, (v) => Math.random() * 1.5 - .6);
  22.         let tSteps = Array.from({length: total}, (v) => Math.random() * 1.2 - .6);

  23.         Array.from({length: total}).forEach((item,key) => {
  24.                 item = document.createElement('span');
  25.                 item.className = 'lizi';
  26.                 let ww = 10 + Math.round(Math.random() * 20),
  27.                         lPos = Math.round(Math.random() * (papa.offsetWidth - ww)),
  28.                         tPos = Math.round(Math.random() * (papa.offsetHeight / 3 - ww));
  29.                 item.style.cssText += `
  30.                         left: ${lPos}px;
  31.                         top: ${tPos}px;
  32.                         width: ${ww}px;
  33.                         height: ${ww}px;
  34.                         background: rgba(${200 + Math.floor(Math.random() * 55)},0,0,.7);
  35.                         animation: rot 4s infinite linear var(--state);
  36.                 `;
  37.                 let ar = [item,lPos,tPos,ww];
  38.                 stars.push(ar);
  39.                 papa.appendChild(item);
  40.         });
  41.         let move = () => {
  42.                 if(canMove) {
  43.                         stars.forEach((item,key) => {
  44.                                 item[1] += lSteps[key];
  45.                                 item[2] += tSteps[key];
  46.                                 if(item[1] > papa.offsetWidth - item[3] || item[1] < 0) lSteps[key] = -lSteps[key];
  47.                                 if(item[2] > papa.offsetHeight / 3 - item[3] || item[2] < 0) tSteps[key] = -tSteps[key];
  48.                                 item[0].style.left = item[1] + 'px';
  49.                                 item[0].style.top = item[2] + 'px';
  50.                         });
  51.                 }
  52.                 setTimeout(move,17);
  53.         };
  54.         let mState = () => aud.paused ? (papa.style.setProperty('--state','paused'),canMove = false) : (papa.style.setProperty('--state','running'),canMove = true);
  55.         aud.addEventListener('play', mState, false);
  56.         aud.addEventListener('pause', mState, false);
  57.         papa.onclick = () => aud.paused ? aud.play() : aud.pause();
  58.         move();
  59. })();
  60. </script>
复制代码

二、《芙蓉出水》地址:http://qslt.net/forum.php?mod=viewthread&tid=3477 ,代码如下:
  1. <style>
  2. #papa {
  3.         --state: paused;
  4.         left: calc(50% - 150px);
  5.         transform: translateX(-50%);
  6.         width: 1200px;
  7.         height: 650px;
  8.         background: teal url('https://s1.ax1x.com/2023/08/06/pPAN4Z6.jpg') no-repeat center/cover;
  9.         box-shadow: 8px 4px 18px hsla(0,0%,0%,.28);
  10.         display: grid;
  11.         place-items: center;
  12.         position: relative;
  13.         z-index: 1;
  14. }
  15. #papa::before, #papa::after {
  16.         position: absolute;
  17.         content: '';
  18.         left: -8px;
  19.         top: -8px;
  20.         right: -8px;
  21.         bottom: -8px;
  22.         border: 8px solid green;
  23.         border-radius: 6px;
  24.         pointer-events: none;
  25.         clip-path: inset(90% 0% 0% 0%);
  26.         animation: clip 12s infinite linear;
  27.         animation-play-state: var(--state);
  28. }
  29. #papa::after {
  30.         animation-delay: -6s;
  31. }
  32. #mplayer {
  33.         position: absolute;
  34.         bottom: 30px;
  35.         width: 100px;
  36.         height: 100px;
  37.         background: url('https://s1.ax1x.com/2023/07/06/pC6B2Wj.jpg') no-repeat center/cover;
  38.         border-radius: 50%;
  39.         cursor: pointer;
  40.         animation: spin 10s infinite linear;
  41.         animation-play-state: var(--state);
  42. }
  43. @keyframes spin { to { transform: rotate(-1turn); } }
  44. @keyframes clip {
  45.         25% { clip-path: inset(0% 0% 0% 90%); border-color: green; }
  46.         50% { clip-path: inset(0% 0% 90% 0%); border-color: lightgreen; }
  47.         75% { clip-path: inset(0% 90% 0% 0%); border-color: orange; }
  48.         100% { clip-path: inset(90% 0% 0% 0%); border-color: darkgreen; }
  49. }
  50. </style>

  51. <div id="papa">
  52.         <div id="mplayer"></div>
  53.         <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1866419548.mp3" autoplay loop></audio>
  54. </div>

  55. <script>
  56. (function() {
  57.         (function(mkFS) {let setFullScreen = (user_set) => {let pa = user_set.pa;if(typeof(pa) !== 'object') return false;if(!user_set.set) user_set.set = 'color: snow; background: black; border: 2px solid snow; left: 40px; bottom: 40px;';btnMsg = document.createElement('span');btnMsg.style.cssText = `position: absolute; border-radius: 8px; padding: 4px; cursor: pointer; z-index:998; ${user_set.set}`;btnMsg.innerText = '全屏观赏';btnMsg.style.display = 'none';pa.appendChild(btnMsg);let timerId, fs = false;btnMsg.onclick = () => fs ? document.exitFullscreen() : pa.requestFullscreen();pa.addEventListener('mousemove', (e) => {clearTimeout(timerId);btnMsg.style.display = 'block';timerId = setTimeout('btnMsg.style.display = "none"', 3000);});document.addEventListener('fullscreenchange', () => {if (document.fullscreenElement !== null) {fs = true;btnMsg.innerText = '退出全屏';} else {fs = false;btnMsg.innerText = '全屏观赏';}});};mkFS.FS = setFullScreen;})(this);
  58.         let mState = () => papa.style.setProperty('--state', aud.paused ? 'paused' : 'running');
  59.         aud.addEventListener('pause', () => mState());
  60.         aud.addEventListener('play', () => mState());
  61.         mplayer.addEventListener('click', () => {
  62.                 aud.paused ? aud.play() : aud.pause();
  63.         });

  64.         FS({
  65.                 pa: papa,
  66.                 set: 'color: green; background: transparent; border: 2px solid green; bottom: 6px;',
  67.         });
  68. })();
  69. </script>
复制代码

三、《萤火虫》地址:http://qslt.net/forum.php?mod=viewthread&tid=3455,代码如下:
  1. <style>
  2. #papa { margin-left: calc(50% - 681px); margin-top:100px; width: 1250px; height: 750px; display: grid; place-items: center; background: #000 url('https://s1.ax1x.com/2023/08/06/pPA2brT.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; perspective: 1000px; overflow: hidden; user-select: none; position: relative; z-index: 1; }
  3. #papa::after { position: absolute; content: '萤火虫'; top: 30px; font: bold 2.6em sans-serif; color: gold; text-shadow: 2px 2px 3px #000; opacity: .6; }
  4. #mplayer { position: absolute; bottom: 10px; z-index: 1000; }
  5. #btnwrap { display: block; fill: hsla(30, 20%, 80%, .9); cursor: pointer; }
  6. #btnwrap:hover { fill: hsla(90, 100%, 100%, .9); }
  7. #tmsg { fill: hsla(30, 100%, 90%, .9); stroke: none; font: bold 1em sans-serif; }
  8. .firefly { position: absolute; width: 2px; height: 2px; border-radius: 50%; background: silver; transform-style: preserve-3d; }
  9. @keyframes move { to { transform: rotate(0) translate3d(0, 0, 0); } }
  10. @keyframes flash { from {opacity: .95; } to { opacity: 1; } }
  11. </style>

  12. <div id="papa">
  13.         <svg id="mplayer" width="0" height="0">
  14.                 <g id="mama" transform="rotate(-90, 60, 60)" style="cursor: pointer;">
  15.                         <circle id="track" cx="60" cy="60" r="50" fill="none" stroke-width="10" stroke="hsla(60, 20%, 80%, .77)" />
  16.                         <circle id="prog" cx="60" cy="60" r="50" fill="none" stroke-width="10" stroke="hsla(60,100%,40%,.65)" />
  17.                 </g>
  18.                 <g id="btnwrap">
  19.                         <path id="btnplay" d="M 50 50,50 70,70, 60 z"></path>
  20.                         <path id="btnpause" d="M 52 50,52 70,57 70,57 50,52 50 z M 60 50,60 70,65 70,65 50,60 50 z" style="display: none;"></path>
  21.                         <path d="M 57 50,60 50,60 70,57 70 z" fill="transparent" />
  22.                 </g>
  23.                 <path id="curPath" d="M 20 70 Q 60 0 100 70" fill="none" stroke="none"/>
  24.                 <path id="durPath" d="M 20 55 Q 60 110 100 55" fill="none" stroke="none"/>
  25.                 <g id="tmsg">
  26.                         <text x="34" y="0"><textPath id="curMsg" xlink:href="#curPath" dominant-baseline="text-after-edge">00:00</textPath></text>
  27.                         <text x="29" y="0"><textPath id="durMsg" xlink:href="#durPath" dominant-baseline="text-before-edge">00:00</textPath></text>
  28.                 </g>
  29.         </svg>
  30. </div>
  31. <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1856019282.mp3" loop autoplay></audio>

  32. <script>
  33. (function() {
  34.         (function() {for(j=0; j<500; j++) {let ele = document.createElement('span');ele.className = 'firefly';ele.style.cssText += `left: ${Math.random() * 1100}px;top: ${Math.random() * 600}px;background: hsl(${Math.random() * 10 + 50}, ${Math.random() * 50 + 40}%,${Math.random() * 40 + 20}%);box-shadow: 0 0 5px hsla(0,10%,100%,.25);transform: rotate(${Math.random() * 360 + 360}deg) translate3d(${Math.random() * 400 + 100}px,${Math.random() * 300}px,${Math.random() * 1000}px);animation: move 60s infinite ${-10 - Math.random() * 20}s linear;`;papa.appendChild(ele);}})();
  35.         let cc = { x: 1*track.getAttribute('cx'), y: 1*track.getAttribute('cy'), len: track.getTotalLength(),};
  36.         prog.style.strokeDasharray = prog.style.strokeDashoffset =cc.len;
  37.         btnwrap.onclick = () => aud.paused ? aud.play() : aud.pause();
  38.         mama.onclick = (e) => {let deg = Math.atan2(e.offsetY - cc.y, e.offsetX - cc.x) * 180 / Math.PI;deg += (e.offsetX < cc.x && e.offsetY < cc.y) ? 450 : 90;aud.currentTime = aud.duration * deg / 360;};
  39.         aud.addEventListener('pause', () => mState());
  40.         aud.addEventListener('play', () => mState());
  41.         aud.addEventListener('seeked', () => aud.play());
  42.         aud.addEventListener('timeupdate', () => {prog.style.strokeDashoffset = cc.len - cc.len * aud.currentTime / aud.duration;curMsg.textContent = toMin(aud.currentTime);durMsg.textContent = toMin(aud.duration);});
  43.         let mState = () => aud.paused ? (btnplay.style.display = 'block', btnpause.style.display = 'none') : (btnplay.style.display = 'none', btnpause.style.display = 'block');
  44.         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;};
  45.         document.title = '萤火虫  翻唱:婴宁';
  46. })();

  47. </script>
复制代码



评分

4

查看全部评分

点评
回复 使用道具

千年灵狐
开卷有益 雪花精灵 版主勋章 海洋之心 蝴蝶精灵 花漫千山 江湖之上 江湖靓女 音画同行 一生安柠 樱果相依 红狐狸
 楼主| 发表于 2023-8-22 11:28 | 显示全部楼层
本帖最后由 婴宁 于 2023-8-22 11:27 编辑

四、《江南》地址:http://qslt.net/forum.php?mod=viewthread&tid=3571,代码如下:
  1. <style>
  2. #papa { margin: auto; width: 1200px; height: 660px; background: url('https://s1.ax1x.com/2023/08/08/pPVYxn1.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; position: relative; display: grid; place-items: center; user-select: none; z-index: 1; --opt: .25;  }
  3. #mplayer { position: absolute; bottom: 20px; display: grid; grid-template-columns: auto auto auto; place-items: center; gap: 6px; user-select: none; }
  4. #btnplay { width: 40px; height: 40px; text-align: center; font: normal 40px/40px sans-serif; color: snow; cursor: pointer; animation: rot linear 4s infinite; }
  5. #prog { --ww: 0px; width: 300px; height: 12px; border: 1px solid green; border-radius: 6px; background: snow; opacity: .65; position: relative; }
  6. #prog::before { position: absolute; content: ''; width: var(--ww); height: 12px; border-radius: 6px; background: snow linear-gradient(90deg, orange, green); opacity: .75; }
  7. #audtime { font: normal 14px sans-serif; color: snow; }
  8. #lrc { --motion: cover1; --tt: 5s; --state: paused; position: absolute; top: 30px; font: bold 2.4em sans-serif; color: hsl(0,10%,90%); -webkit-background-clip: text; filter: drop-shadow(1px 1px 2px hsla(0,0%,0%,.95)); }
  9. #lrc::before { position: absolute; content: attr(data-lrc); width: 20%; height: 100%; color: transparent; overflow: hidden; white-space: nowrap; background: linear-gradient(180deg,hsla(0,50%,20%,.45),hsla(140,100%,50%,.75)); filter: inherit; -webkit-background-clip: text; animation: var(--motion) var(--tt) linear forwards; animation-play-state: var(--state); }
  10. #fish { offset-path: path('M310 195a93.5 62 0 1 0 187 0a93.5 62 0 1 0 -187 0z'); offset-distance: 100%; animation: swim 50s infinite; }
  11. @keyframes cover1 { from { width: 0; } to { width: 100%; } }
  12. @keyframes cover2 { from { width: 0; } to { width: 100%; } }
  13. @keyframes rot { to { transform: rotate(1turn); } }
  14. @keyframes swim { to { offset-distance: 0%; } }
  15. </style>

  16. <div id="papa">
  17.         <img id="fish" src="https://wj1.zp68.com:812/lxx/yunhua/2022/10/02/gnyu.jpg" alt="" />
  18.         <div id="lrc" data-lrc="江南">演唱 婴宁</div>
  19.         <div id="mplayer">
  20.                 <span id="btnplay">❁</span>
  21.                 <span id="prog"></span>
  22.                 <span id="audtime">00:00 | 00:00</span>
  23.         </div>
  24. </div>
  25. <script>
  26. (function() {
  27.         let aud = new Audio(), mKey = 0, mFlag = true;
  28.         let lrcAr = [];
  29.         aud.src = 'https://music.163.com/song/media/outer/url?id=1863362726.mp3';
  30.         aud.loop = true;
  31.         aud.autoplay = true;
  32.         if(aud.paused) btnplay.style.animationPlayState = 'paused';
  33.         btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();
  34.         prog.onclick = (e) => aud.currentTime = aud.duration * e.offsetX / prog.offsetWidth;
  35.         aud.addEventListener('seeked', () => calcKey());
  36.         aud.addEventListener('pause', () =>mState());
  37.         aud.addEventListener('play', () =>mState());
  38.         aud.addEventListener('timeupdate', () => {let prg = aud.currentTime * prog.offsetWidth / aud.duration < 6 ? 6 : aud.currentTime * prog.offsetWidth / aud.duration;prog.style.setProperty('--ww', prg + 'px');audtime.innerText = toMin(aud.currentTime) + ' | ' + toMin(aud.duration);for(j=0; j<lrcAr.length; j++) {if(aud.currentTime >= lrcAr[j][0]) {cKey = j;if(mKey === j) showLrc(lrcAr[j][2]);else continue;}}});
  39.         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);};
  40.         let showLrc = (time) => {let name = mFlag ? 'cover1' : 'cover2';lrc.innerHTML = 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;};
  41.         let mState = () => aud.paused ? (btnplay.style.animationPlayState='paused',lrc.style.setProperty('--state', 'paused'),papa.style.setProperty('--opt','0')) : (btnplay.style.animationPlayState='running', lrc.style.setProperty('--state', 'running'),papa.style.setProperty('--opt','.25'));
  42.         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;}
  43. })();
  44. </script>
复制代码


五、《我在纳林湖等着你》地址:http://qslt.net/forum.php?mod=viewthread&tid=3621,,代码如下:
  1. <style>
  2. #papa { left:-20px; width: 1200px; height: 596px; background: lightgreen url('https://s1.ax1x.com/2023/08/09/pPZYqRe.jpg') no-repeat center/cover; box-shadow: 3px 3px 24px #000; position: relative; }
  3. #ball { position: absolute; width: 60px; height: 60px; background: rgba(0,255,255,.75) radial-gradient(at 35% 35%, lightgray, transparent); border-radius: 50%; cursor: pointer; }
  4. #tit { position: absolute; padding: 0; margin: 0; left: 20px; top: 20px; font: bold 2em sans-serif; color: #F6FCEF; text-shadow: 1px 1px 2px rgba(0,0,0,.75); }
  5. </style>

  6. <div id="papa">
  7.         <span id="tit">我在纳林湖等着你</span>
  8.         <span id="ball"></span>
  9. </div>

  10. <script>
  11. let moveX = 0, moveY = 0, stepX = 1, stepY = 1, canMove = true, aud = new Audio(), timer;

  12. aud.src = 'https://music.163.com/song/media/outer/url?id=1851599756.mp3';
  13. aud.loop = true;
  14. aud.autoplay = true;

  15. timer = requestAnimationFrame(motion);

  16. function motion() {
  17.         moveX += stepX;
  18.         moveY += stepY;
  19.         ball.style.left = moveX + 'px';
  20.         ball.style.top = moveY + 'px';
  21.         timer = requestAnimationFrame(motion);
  22.         if(moveX < 0 || moveX > papa.offsetWidth - ball.offsetWidth) stepX = -stepX;
  23.         if(moveY < 0 || moveY > papa.offsetHeight - ball.offsetHeight) stepY = -stepY;
  24. }

  25. ball.onclick = () => aud.paused ? (aud.play(), requestAnimationFrame(motion)) : (aud.pause(), cancelAnimationFrame(timer));
  26. </script>
复制代码

六、《我要去西藏》地址:http://qslt.net/forum.php?mod=viewthread&tid=3629,这个飞鹰的特效,大家可以根据自己的图片,换成千山勋章里的大灵宠。代码如下:
  1. <css-doodle grid="1x6" id="papa">
  2.         :doodle {
  3.                 @size: 1200px 798px;
  4.                 background: url('http://img.mp.sohu.com/upload/20170811/85f4408116424bca9960b9aaa7b163fa_th.png');
  5.                 box-shadow: 0 0 8px #000;
  6.                 position: relative;
  7.                 margin: 0 0 0 calc(50% - 531px);
  8.                 z-index: 1;
  9.                 --ww: 300px; /* 进度条总长 */
  10.                 --prog: 0; /* 进度 */
  11.                 --tt1: '00:00'; /* 当前播放时间 */
  12.                 --tt2: '00:00'; /* 音乐时长 */
  13.                 --xplace: 50%; /* 播放器水平定位 */
  14.                 --yplace: 98%; /* 播放器垂直定位 */
  15.                 --color: snow;
  16.                 --state: paused; /* 关键帧运行状态 */
  17.         }
  18.         /* 单元格1 :进度条 */
  19.         @nth(1) {
  20.                 @size: var(--ww) 2px;
  21.                 @place: var(--xplace) var(--yplace);
  22.                 background: silver;
  23.                 :before, :after { content: ''; }
  24.                 :before {
  25.                         position: absolute;
  26.                         left: 0;
  27.                         width: var(--prog);
  28.                         height: 100%;
  29.                         background: var(--color);
  30.                 }
  31.                 :after {
  32.                         width: 100%;
  33.                         height: 10px;
  34.                         cursor: pointer;
  35.                 }
  36.         }
  37.         /* 单元格2 :播放时间信息 */
  38.         @nth(2) {
  39.                 @size: var(--ww) 20px;
  40.                 @place: var(--xplace) calc(var(--yplace) - 20px);
  41.                 :before, :after{
  42.                         position: absolute;
  43.                         width: 100%;
  44.                         height: 100%;
  45.                         color: var(--color);
  46.                 }
  47.                 :before { content: var(--tt1); }
  48.                 :after { content: var(--tt2); text-align: right; }
  49.         }

  50.         /* 单元格3和4 :播放按钮 */
  51.         @nth(3,4) {
  52.                 @size: 60px;
  53.                 @place: var(--xplace) calc(var(--yplace) - 36px);
  54.                 cursor: pointer;
  55.         }
  56.         @nth(3) {
  57.                 @size: 50px;
  58.                 @shape: clover 4;
  59.                 background: var(--color);
  60.                 animation: rot 6s infinite linear var(--state);
  61.         }
  62.         @match(i ≥ 5) {
  63.                 @size: 100px 88px;
  64.                 @place: 50px 44px;
  65.                 background: url('https://638183.freep.cn/638183/t22/gif/ying1.gif');
  66.                 offset-path: path('M50 44 Q500 300 900 44');
  67.                 offset-distance: 0%;
  68.                 animation: fly 10s calc(@r(1,10) * -1s) infinite linear var(--state);
  69.         }
  70.         @keyframes rot { to { transform: rotate(360deg); } }
  71.         @keyframes fly { to { offset-distance: 100%; }}
  72. </css-doodle>

  73. <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1851314605" autoplay="autoplay" loop="loop"></audio>

  74. <script>
  75. (function(){
  76.         let script = document.createElement('script');
  77.         script.src = 'https://638183.freep.cn/638183/web/api/css-doodle.js';
  78.         document.head.appendChild(script);
  79.         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;};
  80.         let mState = () => papa.style.setProperty('--state', aud.paused ? 'paused' : 'running');
  81.         aud.addEventListener('timeupdate', () => {
  82.                 papa.style.setProperty('--prog', 100*aud.currentTime/aud.duration + '%');
  83.                 papa.style.setProperty('--tt1', `'${toMin(aud.currentTime)}'`);
  84.                 papa.style.setProperty('--tt2', `'${toMin(aud.duration)}'`);
  85.         });
  86.         aud.addEventListener('play', mState, false);
  87.         aud.addEventListener('pause', mState, false);
  88.         window.onload = () => {
  89.                 let btns = papa.shadowRoot.querySelectorAll('cell');
  90.                 let ww = parseInt(window.getComputedStyle(papa).getPropertyValue('--ww'));
  91.                 btns[3].onclick = () => aud.paused ? aud.play() : aud.pause();
  92.                 btns[0].onclick = (e) => aud.currentTime = e.offsetX * aud.duration / ww;
  93.         }
  94. })();
  95. </script>
复制代码







评分

4

查看全部评分

点评
回复 使用道具

千年灵狐
开卷有益 雪花精灵 版主勋章 海洋之心 蝴蝶精灵 花漫千山 江湖之上 江湖靓女 音画同行 一生安柠 樱果相依 红狐狸
 楼主| 发表于 2023-8-22 11:29 | 显示全部楼层
本帖最后由 婴宁 于 2023-8-24 16:15 编辑

七、《山水画》地址:http://qslt.net/forum.php?mod=viewthread&tid=3627,代码如下:
  1. <style>
  2.         #papa { margin: auto; display: grid; place-items: center; width: 1200px; height: 640px; background: url('https://s1.ax1x.com/2023/07/07/pCcFkwQ.jpg') no-repeat center/cover; position: relative; }
  3.         #canv { position: absolute; }
  4.         #disc { position: absolute; width: 40px; height: 40px; left: 10px; bottom: 10px; background: conic-gradient(red,orange,yellow,green,teal,blue,purple); mask: radial-gradient(transparent 4px,red 0); -webkit-mask: radial-gradient(transparent 4px,red 0); border-radius: 50%; cursor: pointer; animation: rot 2s linear infinite; }
  5.         #lrcbox { position: absolute; left: 60px; bottom: 10px;  font: bold 22px / 40px sans-serif; color: snow; text-shadow: 2px 2px 4px #222; }
  6.         @keyframes rot { to { transform: rotate(360deg); } }
  7. </style>

  8. <div id="papa">
  9.         <span id="lrcbox">山水画</span>
  10.         <canvas id="canv"></canvas>
  11.         <span id="disc"></span>
  12. </div>

  13. <script type="text/javascript">
  14. let num = (min, max) => Math.floor(Math.random() * (max-min+1)) + min;
  15. let r = 10, speed = 0.5, idx = 0;
  16. let w = canv.width = 600, h = canv.height = 700;
  17. let ctx = canv.getContext('2d');
  18. let images = new Array(), aud = new Audio();

  19. aud.src = 'https://music.163.com/song/media/outer/url?id=1857242307.mp3';
  20. aud.loop = true;
  21. aud.autoplay = true;
  22. disc.style.animationPlayState = aud.paused ? 'paused' : 'running';
  23. disc.onclick = () => aud.paused ? aud.play() : aud.pause();
  24. aud.addEventListener('playing',()  => disc.style.animationPlayState = 'running');
  25. aud.addEventListener('pause',()  => disc.style.animationPlayState = 'paused');

  26. function preload() {
  27.         for (j = 0; j < preload.arguments.length; j++) {
  28.                 images[j] = new Image()
  29.                 images[j].src = preload.arguments[j]
  30.         }
  31. }
  32. preload(
  33.         'https://s1.ax1x.com/2023/08/07/pPVFV3Q.jpg',
  34.         'https://s1.ax1x.com/2023/08/07/pPVFE9g.jpg',
  35.         'https://s1.ax1x.com/2023/08/07/pPVFk4S.jpg',
  36.         'https://s1.ax1x.com/2023/08/07/pPVFFN8.jpg',
  37.         
  38. )

  39. idx = num(0, images.length - 1);

  40. (function draw() {
  41.         ctx.clearRect(0, 0, w, h);
  42.         ctx.save();
  43.         ctx.beginPath();
  44.         ctx.arc(w / 2, h / 2, r, 0, Math.PI*2);
  45.         ctx.closePath();
  46.         ctx.fillStyle = "transparent";
  47.         ctx.fill();
  48.         ctx.clip();
  49.         ctx.drawImage(images[idx], 0, 0, w, h);
  50.         ctx.restore();
  51.         r += speed;
  52.         if (r > 250 || r <= 0) speed = -speed;
  53.         if(r <= 0) idx = num(0, images.length - 1);
  54.         requestAnimationFrame(draw);
  55. })();

  56. </script>
复制代码



八、《那一世》地址:http://qslt.net/forum.php?mod=viewthread&tid=3572,代码如下:
  1. <style>
  2. #papa {
  3.         margin: -80px 0 0 calc(50% - 593px);
  4.         width: 1200px;
  5.         height: 690px;
  6.         background: lightgreen url('https://s1.ax1x.com/2023/08/09/pPZtsOA.jpg') no-repeat center/cover;
  7.         box-shadow: 3px 3px 20px #000;
  8.         position: relative;
  9. }
  10. #mplayer {
  11.         position: absolute;
  12.         width: 160px;
  13.         height: 160px;
  14.         right: 200px;
  15.         top: 60%;
  16.         border-radius: 50%;
  17.         cursor: pointer;
  18.         animation: rot 8s linear infinite;
  19. }
  20. #lrc {
  21.         --state: paused;
  22.         --motion: cover2;
  23.         --tt: 2s;
  24.         --bg: linear-gradient(180deg, hsla(60, 50%, 50%, .45), hsla(80, 70%, 50%, .65));
  25.         position: absolute;
  26.         left: 50%;
  27.         transform: translate(-50%);
  28.         top: 5px;
  29.         font: bold 2em sans-serif;
  30.         color: snow;
  31.         white-space: pre;
  32.         -webkit-background-clip: text;
  33.         filter: drop-shadow(1px 1px 2px hsla(0, 0%, 0%, .95));
  34. }
  35. #lrc::before {
  36.         position: absolute;
  37.         content: attr(data-lrc);
  38.         width: 20%;
  39.         height: 100%;
  40.         color: transparent;
  41.         overflow: hidden;
  42.         white-space: pre;
  43.         background: var(--bg);
  44.         filter: inherit;
  45.         -webkit-background-clip: text;
  46.         animation: var(--motion) var(--tt) linear forwards;
  47.         animation-play-state: var(--state);
  48. }
  49. @keyframes cover1 { from { width: 0; } to { width: 100%; } }
  50. @keyframes cover2 { from { width: 0; } to { width: 100%; } }
  51. @keyframes rot { to { transform: rotate(1turn); } }
  52. </style>

  53. <div id="papa">
  54.         <div id="lrc" data-lrc="HCPlayer">《那一世》  演唱 婴宁</div>
  55.         <img id="mplayer" src="https://s1.ax1x.com/2023/06/21/pCGOPL6.jpg" alt="" />
  56.         <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1921184311.mp3" loop autoplay></audio>
  57. </div>

  58. <script>
  59. (function() {
  60. /*原始lrc歌词*/
  61. let lrcStr = `


  62. /*变量 :mKey - 当前歌词索引;mFlag :调用关键帧动画

  63. /*函数 :获取每句歌词用时,歌词用时若超过平均值则取平均值,最后一句歌词则取平均值*/
  64. let lrcTime = (ar) => {
  65.         let tmpAr = [];
  66.         for(j = 0; j <ar.length - 1; j ++) {
  67.                 if(j !== ar.length - 1) tmpAr[j] = parseFloat((ar[j+1][0] - ar[j][0]).toFixed(1));
  68.         }
  69.         let aver = parseInt(tmpAr.reduce((a,b) => a + b) / (tmpAr.length - 1)) + averAdd;
  70.         tmpAr.push(aver);
  71.         tmpAr.forEach((item,key) => {
  72.                 ar[key][2] = item > aver ? aver : item;
  73.         });
  74.         return ar;
  75. };

  76. /*函数 :从原始lrc歌词获取信息并存入 n*3 数组*/
  77. let getLrcAr = (text) => {
  78.         let lrcAr = [];
  79.         let calcRule = [60,1,0.001];
  80.         for(x of text.split('\n')) {
  81.                 let ar = [];
  82.                 let re = /\d+[\.:]\d+([\.:]\d+)?/g;
  83.                 let geci = x.replace(re,'');
  84.                 if(geci) {
  85.                         geci = geci.replace(/[\[\]\'"\t,]s?/g,'');
  86.                         let time = x.match(re);
  87.                         if(time != null) {
  88.                                 for(y of time) {
  89.                                         let tmp = y.match(/\d+/g);
  90.                                         let sec = 0;
  91.                                         for(z in tmp) sec += tmp[z] * calcRule[z];
  92.                                         ar[0] = [parseFloat(sec.toFixed(2)), geci];
  93.                                         lrcAr.push(ar[0]);
  94.                                 }
  95.                         }
  96.                 }
  97.         }
  98.         lrcAr.sort((a,b)=> a[0] - b[0]);
  99.         return(lrcTime(lrcAr));
  100. };

  101. /*函数 :模拟显示同步歌词*/
  102. let showLrc = (time) => {
  103.         let name = mFlag ? 'cover1' : 'cover2';
  104.         lrc.innerHTML = lrcAr[mKey][1];
  105.         lrc.dataset.lrc = lrcAr[mKey][1];
  106.         lrc.style.setProperty('--motion', name);
  107.         lrc.style.setProperty('--tt', time + 's');
  108.         lrc.style.setProperty('--state', 'running');
  109.         mKey += 1;
  110.         mFlag = !mFlag;
  111. };

  112. /*函数 :处理当前歌词索引 mKey*/
  113. let calcKey = () => {
  114.         for (j = 0; j < lrcAr.length; j++) {
  115.                 if (aud.currentTime <= lrcAr[j][0]) {
  116.                         mKey = j - 1;
  117.                         break;
  118.                 }
  119.         }
  120.         if (mKey < 0) mKey = 0;
  121.         if (mKey > lrcAr.length - 1) mKey = lrcAr.length - 1;
  122.         let time = lrcAr[mKey][2] - (aud.currentTime - lrcAr[mKey][0]);
  123.         showLrc(time);
  124. };

  125. /*格式化时间信息*/
  126. let toMin = (val) => {
  127.         if (!val) return '00:00';
  128.         val = Math.floor(val);
  129.         let min = parseInt(val / 60),
  130.         sec = parseFloat(val % 60);
  131.         if (min < 10) min = '0' + min;
  132.         if (sec < 10) sec = '0' + sec;
  133.         return min + ':' + sec;
  134. }

  135. /*函数 :关键帧动画状态切换*/
  136. let mState = () => aud.paused ? (lrc.style.setProperty('--state','paused'),mplayer.style.animationPlayState = 'paused') : (lrc.style.setProperty('--state','running'),mplayer.style.animationPlayState = 'running');

  137. /*监听播放进度*/
  138. aud.addEventListener('timeupdate', () => {
  139.         for (j = 0; j < lrcAr.length; j++) {
  140.                 if (aud.currentTime >= lrcAr[j][0]) {
  141.                         cKey = j;
  142.                         if (mKey === j) showLrc(lrcAr[j][2]);
  143.                         else continue;
  144.                 }
  145.         }
  146. });

  147. aud.addEventListener('pause', () => mState());/*监听暂停事件*/
  148. aud.addEventListener('play', () => mState());/*监听播放事件*/
  149. aud.addEventListener('seeked', () => calcKey());/*监听查询事件*/
  150. mplayer.addEventListener('click', () => { aud.paused ? aud.play() : aud.pause(); });

  151. let lrcAr = getLrcAr(lrcStr); /*获得歌词数组*/
  152. })();
  153. </script>
复制代码


九、《红楼梦》地址:http://qslt.net/forum.php?mod=viewthread&tid=3686,代码如下:
  1. <style>
  2. #papa { margin: 0 0 0 calc(50% - 593px);; display: grid; place-items: center; width: 1200px; height: 640px; background: gray url('https://s1.ax1x.com/2023/08/09/pPZYSCF.jpg') no-repeat center/cover; box-shadow: 8px 4px 20px #000; overflow: hidden; user-select: none; position: relative; perspective: 3000px; z-index: 1; }
  3. </style>

  4. <div id="papa"></div>
  5. <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1350265233.mp3" loop autoplay></audio>

  6. <script >
  7. (function() {
  8.         (function(mkPlayer) {let defaults = {lrcAr: [[2, "婴宁翻唱", 3],[6, "", 1]],ttAr: ['婴宁', '论坛',  '在线','HCP','Player'],红楼遗梦: 'top: 20px; left: 50%; transform: translateX(-50%);',player_css: 'bottom: 20px; left: calc(50% - 50px);',playerCode: `<style>#mplayer {--bg1: tan;--bg2: tan;--bg3: tan;--bg4: tan;--bg5: tan;--bg6: tan;--border: 1px dotted orange;position: absolute;width: 120px;height: 80px;cursor: pointer;transform-style: preserve-3d;animation: rot 10s linear infinite;animation-play-state: paused;display: grid;place-items: center;}#mplayer > span {width: 100%;height: 100%;border: var(--border);display: grid;place-items: center;font: norml 1.5em sans-serif;position: absolute;}#btnMsg {--btnColor: white;--btnBg: #0089f0;position: absolute;color: var(--btnColor);background: var(--btnBg);opacity: 0;border: 2px solid var(--btnColor);border-radius: 8px;padding: 4px;transition: all .75s;cursor: pointer;z-index: 901;}#lrc {--motion: cover2;--tt: 1s;--state: running;--bg: linear-gradient(180deg, hsla(100, 10%, 50%, .75), hsla(100, 100%, 20%, .65));position: absolute;font: bold 2.4em sans-serif;color: hsl(100, 100%, 90%);white-space: pre;-webkit-background-clip: text;filter: drop-shadow(1px 1px 2px hsla(0, 100%, 0%, .85));z-index: 900;}#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 rot { to {transform: rotateY(-360deg); } }@keyframes cover1 { from { width: 0; } to { width: 100%; } }@keyframes cover2 { from { width: 0; } to { width: 100%; } }</style><div id="lrc"data-lrc="">红楼梦 </div><div id="mplayer"><span></span><span></span><span></span><span></span><span></span><span></span></div><span id="btnMsg">全屏观赏</span>`,};let playCode = (user_config) => {let data = Object.assign({}, defaults, user_config);papa.innerHTML += data.playerCode;mplayer.style.cssText += data.player_css;lrc.style.cssText += data.lrc_css;btnMsg.style.cssText += data.btn_css;let mKey = 0,mFlag = true,fs = false,tnow = Date.now(),timerId;let sps = mplayer.children;let width = mplayer.offsetWidth, angle = 60;let trz = Math.ceil(Math.tan(Math.PI / 180 * (180 - angle) /2 ) * width / 2);Array.from(sps).forEach( (item,key) => {let ry = Math.floor(key*60);sps[key].style.transform = `rotateY(${ry}deg) translateZ(${trz}px)`;sps[key].style.background = `var(--bg${key+1})`;sps[key].innerText = data.ttAr[key];});mplayer.onclick = () => aud.paused ? aud.play() : aud.pause();btnMsg.onclick = () => fs ? document.exitFullscreen() : papa.requestFullscreen();papa.onmousemove = (e) => {clearTimeout(timerId);btnMsg.style.opacity = '.95';timerId = setTimeout('btnMsg.style.opacity = "0"', 3000);};document.addEventListener("fullscreenchange", () => {if (document.fullscreenElement !== null) {fs = true;btnMsg.innerText = '退出全屏';} else {fs = false;btnMsg.innerText = '全屏观赏';}});aud.addEventListener('pause', () => mState());aud.addEventListener('play', () => mState());aud.addEventListener('seeked', () => calcKey());let mState = () => aud.paused ? (lrc.style.setProperty('--state', 'paused'), mplayer.style.animationPlayState = 'paused') : (lrc.style.setProperty('--state', 'running'), mplayer.style.animationPlayState = 'running');aud.addEventListener('timeupdate', () => {for (j = 0; j < data.lrcAr.length; j++) {if (aud.currentTime >= data.lrcAr[j][0]) {if (mKey === j) showLrc(data.lrcAr[j][2]);else continue;}}});let showLrc = (time) => {let name = mFlag ? 'cover1' : 'cover2';lrc.innerHTML = data.lrcAr[mKey][1];lrc.dataset.lrc = data.lrcAr[mKey][1].replace(/<br>/, '\n');lrc.style.setProperty('--motion', name);lrc.style.setProperty('--tt', time + 's');lrc.style.setProperty('--state', 'running');mKey += 1;mFlag = !mFlag;};let calcKey = () => {for (j = 0; j < data.lrcAr.length; j++) {if (aud.currentTime <= data.lrcAr[j][0]) {mKey = j - 1;break;}}if (mKey < 0) mKey = 0;if (mKey > data.lrcAr.length - 1) mKey = data.lrcAr.length - 1;let time = data.lrcAr[mKey][2] - (aud.currentTime - data.lrcAr[mKey][0]);showLrc(time);};};mkPlayer.HCPlayer = playCode;})(this);
  9.         let lrcAr = [];
  10.         HCPlayer({
  11.                 lrcAr: lrcAr,
  12.                 lrc_css:`
  13.                         --bg: linear-gradient(hsla(180,55%,40%,.15),hsla(200,90%,45%,.7));
  14.                         top: 20px;
  15.                         color: snow;
  16.                 `,
  17.                 ttAr: ['','','','','',''],
  18.                 player_css: `
  19.                         --bg1: url('http://img.jiaodong.net/pic/0/11/39/98/11399808_269919.jpg') no-repeat center/cover;
  20.                         --bg2: url('https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=1066440951,166135310&fm=175&s=52B03C8D504276EE6224BCED03001021&w=640&h=714&img.JPE') no-repeat center/cover;
  21.                         --bg3: url('https://p0.ssl.qhimgs1.com/sdr/400__/t01be27a3468b4b51f0.jpg') no-repeat center/cover;
  22.                         --bg4: url('https://p7.itc.cn/images01/20210826/b0d50c044063476eb1f5b8d9598eeea1.jpeg') no-repeat center/cover;
  23.                         --bg5: url('http://n.sinaimg.cn/sinacn20200201ac/130/w501h429/20200201/7015-intiarq0778300.jpg') no-repeat center/cover;
  24.                         --bg6: url('https://i0.hdslb.com/bfs/article/1a6568c98acbb5966367a69ccd8ecdfee7113fd2.jpg') no-repeat center/cover;
  25.                         --bg7: url('http://n.sinaimg.cn/sinacn10/197/w600h397/20180723/9bdd-hftenhy7491741.jpg') no-repeat center/cover;
  26.                         --bg8: url('http://5b0988e595225.cdn.sohucs.com/images/20191211/6fcd2f545818415983dfbd5bd67b096b.jpeg') no-repeat center/cover;
  27.                         --bg9: url('http://5b0988e595225.cdn.sohucs.com/images/20180116/910d0ef221094b1b96d7a0f15ecf17aa.jpeg') no-repeat center/cover;
  28.                         --border: 1px dotted olive;
  29.                         width: 220px;
  30.                         height: 200px;
  31.                         top: 120px;
  32.                 `,
  33.                 btn_css: '--btnColor: white; --btnBg: transparent;',
  34.         });
  35. })();
  36. </script>
复制代码


十、《天空之城》地址:http://qslt.net/forum.php?mod=viewthread&tid=3689,代码如下:
  1. <style>
  2. #mydiv {
  3.   margin: -80px 0 0 calc(50% - 593px);
  4.   width: 1200px;
  5.   height: 772px;
  6.   background: #000 url('https://s1.ax1x.com/2023/08/10/pPeXkkQ.png') no-repeat center/cover;
  7.   box-shadow: 0 0 8px gray;
  8.   position: relative;
  9. }
  10. </style>
  11. <div id="mydiv">
  12.   <css-doodle id="mplayer">
  13.     :doodle {
  14.       @grid: 4 / 200px;
  15.       background: url('https://638183.freep.cn/638183/t23/btn/laba1.png') no-repeat 0px 50px / 100px 100px;
  16.       cursor: pointer;
  17.       position: absolute;
  18.       left: 1000px;
  19.       top: 280px;
  20.       --state: running;
  21.     }
  22.     :doodle(:hover) { transform: skew(2deg); }
  23.     position: absolute;
  24.     @place-cell: 80px 46%;
  25.     :after {
  26.       content: @p(♫,♪,♩,♬);
  27.       color: @p(red,pink,orange,green,blue,white);
  28.     }
  29.     animation: fly 1s @r(-2,2)s infinite var(--state);
  30.     @keyframes fly {
  31.       from { transform: rotate(0deg) translate(0px); }
  32.       to { transform: rotate(@r(-60,60)deg) translate(110px); }
  33.     }
  34.   </css-doodle>
  35.   <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1899636809" autoplay="autoplay" loop="loop"></audio>
  36. </div>

  37. <script>
  38. (function() {
  39.   let scriptEle = document.createElement('script');
  40.   scriptEle.setAttribute('type','text/javascript');
  41.   scriptEle.setAttribute('src','https://unpkg.com/css-doodle@0.34.8/css-doodle.min.js');
  42.   document.head.appendChild(scriptEle);

  43.   let mState = () => mplayer.style.setProperty('--state', aud.paused ? 'paused' : 'running');
  44.   aud.addEventListener('play', mState, false);
  45.   aud.addEventListener('pause', mState, false);
  46.   mplayer.onclick = () => aud.paused ? aud.play() : aud.pause();
  47. })();
  48. </script>
复制代码


评分

1

查看全部评分

点评
回复 使用道具

千年灵狐
开卷有益 雪花精灵 版主勋章 海洋之心 蝴蝶精灵 花漫千山 江湖之上 江湖靓女 音画同行 一生安柠 樱果相依 红狐狸
 楼主| 发表于 2023-8-22 11:29 | 显示全部楼层
本帖最后由 婴宁 于 2023-8-24 16:18 编辑

十一、《醉美天下》地址:http://qslt.net/forum.php?mod=viewthread&tid=3672,代码如下:
  1. <style>
  2.         #papa { margin: auto; width: 1200px; height: 640px; background: url('https://s1.ax1x.com/2023/07/07/pCcFPOS.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; box-shadow: 3px 3px 20px #000; display: flex; justify-content: center; overflow: hidden; position: relative; z-index: 1; }
  3.         #mplayer { position: absolute; bottom: 10px; }
  4.         #btnwrap { fill: lightblue; cursor: pointer; }
  5.         #btnwrap:hover { fill: lightgreen; }
  6.         #tmsg { fill: tan; stroke: lightblue; stroke-width: 1px; font: bold 1em sans-serif; }
  7.         #lrc { position: absolute; top: 10px; font: bold 2.4em sans-serif; color: transparent; background: linear-gradient(-90deg, tomato, tan) 0 0 / 200% 200%; filter: drop-shadow(2px 2px 4px #000); background-clip: text; -webkit-background-clip: text; text-stroke: 1px lightgreen; -webkit-text-stroke: 1px lightblue; }
  8.         #mpic {position: absolute; left: 0; top: 0; width: 100px;offset-distance: 0;offset-path: path("M0 40 Q500 180, 600 160 T1024 40");animation: move 18s linear infinite;}
  9.         @keyframes bgMove1 { from { background-position: 0 0; } to { background-position: -100% 0; } }
  10.         @keyframes bgMove2 { from { background-position: 0 0; } to { background-position: -100% 0; } }
  11.         @keyframes move { to { offset-distance: 100%;} }
  12. </style>

  13. <div id="papa">
  14.         <img id="mpic" alt="" src="http://qslt.net/static/image/common/lingchong/67.gif" />
  15.         <div id="lrc">醉 美 天 下</div>
  16.         <svg id="mplayer" width="120" height="120">
  17.                 <g id="mama" transform="rotate(-90, 60, 60)" style="cursor: pointer">
  18.                         <circle id="track" cx="60" cy="60" r="50" fill="none" stroke-width="10" stroke="rgba(255,255,255,0.65)" />
  19.                         <circle id="prog" cx="60" cy="60" r="50" fill="none" stroke-width="4" stroke="rgba(50,120,40,0.75)" />
  20.                 </g>
  21.                 <g id="btnwrap">
  22.                         <path id="btnplay" d="M 50 50,50 70,70, 60 z"></path>
  23.                         <path id="btnpause" d="M 52 50,52 70,57 70,57 50,52 50 z M 60 50,60 70,65 70,65 50,60 50 z" style="display:none"></path>
  24.                         <path d="M 57 50,60 50,60 70,57 70 z" fill="transparent" />
  25.                 </g>
  26.                 <path id="curPath" d="M 20 70 Q 60 0 100 70" fill="none" stroke="none"/>
  27.                 <path id="durPath" d="M 20 55 Q 60 110 100 55" fill="none" stroke="none"/>
  28.                 <g id="tmsg">
  29.                         <text x="34" y="0"><textPath id="curMsg" xlink:href="#curPath" dominant-baseline="text-after-edge">00:00</textPath></text>
  30.                         <text x="29" y="0"><textPath id="durMsg" xlink:href="#durPath" dominant-baseline="text-before-edge">00:00</textPath></text>
  31.                 </g>
  32.         </svg>
  33. </div>

  34. <script>
  35. let lrcAr = [];

  36. let mKey = 0, mFlag = true, aud = new Audio();
  37. let cc = {
  38.         x: 1*track.getAttribute('cx'),
  39.         y: 1*track.getAttribute('cy'),
  40.         r: 1*track.getAttribute('r'),
  41.         len: track.getTotalLength(),
  42. };

  43. prog.style.strokeDasharray = prog.style.strokeDashoffset =cc.len;
  44. aud.src = 'https://music.163.com/song/media/outer/url?id=1877656158.mp3';
  45. aud.autoplay = true;
  46. aud.loop = true;

  47. mama.onclick = (e) => {
  48.         let deg = Math.atan2(e.offsetY - cc.y, e.offsetX - cc.x) * 180 / Math.PI;
  49.         deg += (e.offsetX < cc.x && e.offsetY < cc.y) ? 450 : 90;
  50.         aud.currentTime = aud.duration * deg / 360;
  51. };

  52. btnwrap.onclick = () => aud.paused ? aud.play() : aud.pause();

  53. aud.addEventListener('pause', () => mState());
  54. aud.addEventListener('play', () => mState());
  55. aud.addEventListener('seeked', () => calcKey());

  56. aud.addEventListener('timeupdate', () => {
  57.         prog.style.strokeDashoffset = cc.len - cc.len * aud.currentTime / aud.duration;
  58.         curMsg.textContent = toMin(aud.currentTime);
  59.         durMsg.textContent = toMin(aud.duration);
  60.         for(j=0; j<lrcAr.length; j++) {
  61.                 if(aud.currentTime >= lrcAr[j][0]) {
  62.                         if(mKey === j) showLrc(lrcAr[j][2] || 5);
  63.                         else continue;
  64.                 }
  65.         }
  66. });

  67. let mState = () => aud.paused ? (btnplay.style.display = 'block', btnpause.style.display = 'none', lrc.style.animationPlayState = 'paused') : (btnplay.style.display = 'none', btnpause.style.display = 'block', lrc.style.animationPlayState = 'running');

  68. let showLrc = (time) => {
  69.         lrc.style.animation = (mFlag ? 'bgMove1 ' : 'bgMove2 ') + time + 's linear forwards';
  70.         lrc.innerHTML = lrcAr[mKey][1];
  71.         mKey += 1;
  72.         mFlag = !mFlag;
  73. }

  74. let calcKey = () => {
  75.         for(j = 0; j < lrcAr.length; j ++) {
  76.                 if(aud.currentTime <= lrcAr[j][0]) {
  77.                         mKey = j - 1;
  78.                         break;
  79.                 }
  80.         }
  81.         if(mKey <0) mKey = 0;
  82.         if(mKey > lrcAr.length - 1) mKey = lrcAr.length - 1;
  83.         let mtime = lrcAr[mKey][2] - (aud.currentTime - lrcAr[mKey][0]);
  84.         showLrc(mtime);
  85. }

  86. let toMin = (val)  => {
  87.         if (!val) return '00:00';
  88.         val = Math.floor(val);
  89.         let min = parseInt(val / 60), sec = parseFloat(val % 60);
  90.         if(min < 10) min = '0' + min;
  91.         if(sec < 10) sec = '0' + sec;
  92.         return min + ':' + sec;
  93. }
  94. </script>
复制代码


十二、《等你千年》地址:http://qslt.net/forum.php?mod=viewthread&tid=3527,代码如下:
  1. <style>
  2. #papa {
  3.         margin: 20px auto;
  4.         width: 1200px;
  5.         height: 650px;
  6.         background: tan url('https://s1.ax1x.com/2023/08/10/pPeLL2q.jpg') center/cover no-repeat;
  7.         box-shadow: 0 0 10px gray;
  8.         display: grid;
  9.         place-items: center;
  10. }
  11. </style>

  12. <div id="papa">

  13. <css-doodle id="mplayer">
  14.         @grid: 1 / 50px;
  15.         cursor: pointer;
  16.         background: radial-gradient(yellow, #6DC7D0, #fff);
  17.         clip-path: @shape( fill-rule: evenodd; split: 00; scale: .6; r: cos(7t)^2 + sin(7t) + .3;);
  18.         animation: rot 6s infinite linear var(--state);
  19.         @keyframes rot { to { transform: rotate(360deg); } }
  20. </css-doodle>

  21. </div>
  22. <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1855756345" autoplay loop></audio>

  23. <script>
  24. (function() {
  25.         let scriptEle = document.createElement('script');
  26.         scriptEle.setAttribute('type','text/javascript');
  27.         scriptEle.setAttribute('src','https://unpkg.com/css-doodle@0.34.8/css-doodle.min.js');
  28.         document.head.appendChild(scriptEle);
  29.         let mState = () => papa.style.setProperty('--state', aud.paused ? 'paused' : 'running');
  30.         aud.addEventListener('play', mState, false);
  31.         aud.addEventListener('pause', mState, false);
  32.         mplayer.onclick = () => aud.paused ? aud.play() : aud.pause();
  33. })();
  34. </script>
复制代码


十三、《许你》地址:http://qslt.net/forum.php?mod=viewthread&tid=3452,代码如下:
  1. <style>
  2. #papa {
  3.         margin: -80px 0 0 calc(50% - 593px);
  4.         display: grid;
  5.         place-items: center;
  6.         width: 1200px;
  7.         height: 660px;
  8.         background: gray url('https://s1.ax1x.com/2023/08/12/pPups3D.jpg') no-repeat center/cover;
  9.         box-shadow: 8px 4px 20px hsla(0,0%,0%,.65);
  10.         user-select: none;
  11.         position: relative;
  12.         z-index: 1;
  13.         animation: flash 10s infinite alternate;
  14. }
  15. @keyframes flash { from {filter: brightness(60%); } to {filter: brightness(140%); } }
  16. </style>

  17. <div id="papa"></div>
  18. <audio id="aud" src="https://music.163.com/song/media/outer/url?id=2046097236.mp3" loop autoplay></audio>

  19. <script >
  20. (function() {
  21.         (function(mkPlayer) {let defaults = {lrcAr: [],lrc_css: 'top: 10px; left: 50%; transform: translateX(-50%);',player_css: 'bottom: 20px; left: 50%; transform: translateX(-50%);',btn_txt: '\u2638',playerCode: `<style>#mplayer {position: absolute;grid-template-columns: auto auto auto;gap: 8px;display: grid;place-items: center;color: var(--color);font: normal 16px sans-serif;z-index: 999;--ww: 260px;--color: hsl(0, 100%, 100%);--btn_size: 35px;--track: hsla(90,100%,95%,.65);--prog: linear-gradient(90deg,hsla(90,30%,50%,.55),hsla(0,70%,50%,.65),hsla(90,30%,50%,.75));}#btnplay {--state: paused;margin-right: -4px;font: bold var(--btn_size) / var(--btn_size) serif;text-align: center;cursor: pointer;animation: rot 4s infinite linear;animation-play-state: var(--state);}#prog {--xx: 0px;width: var(--ww);height: 10px;border-radius: 8px;background: var(--track);position: relative;cursor: pointer;}#prog::before {position: absolute;content: '';width: var(--xx);height: 100%;border-radius: 8px;background: var(--prog);}#lrc {--motion: cover2;--tt: 2s;--state: paused;--bg: linear-gradient(180deg, hsla(60, 50%, 50%, .45), hsla(80, 70%, 50%, .6), hsla(0, 100%, 50%, .75));position: absolute;font: bold 2.4em sans-serif;color: hsl(0, 10%, 90%);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="lrc" data-lrc="HCPlayer">HCPlayer</div><div id="mplayer"><span id="btnplay"></span><span id="prog"></span><span id="tmsg">00:00 | 00:00</span></div>`,};let playCode = (user_config) => {let data = Object.assign({}, defaults, user_config);papa.innerHTML += data.playerCode;mplayer.style.cssText += data.player_css;lrc.style.cssText += data.lrc_css;btnplay.innerHTML = data.btn_txt;let mKey = 0, mFlag = true;btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();prog.onclick = (e) => aud.currentTime = aud.duration * e.offsetX / prog.offsetWidth;aud.addEventListener('timeupdate', () => {let prg = aud.currentTime * prog.offsetWidth / aud.duration < 6 ? 6 : aud.currentTime * prog.offsetWidth / aud.duration;tmsg.innerText = `${toMin(aud.currentTime)} | ${toMin(aud.duration)}`;prog.style.setProperty('--xx', prg + 'px');for (j = 0; j < data.lrcAr.length; j++) {if (aud.currentTime >= data.lrcAr[j][0]) {cKey = j;if (mKey === j) showLrc(data.lrcAr[j][2]);else continue;}}});aud.addEventListener('pause', () => mState());aud.addEventListener('play', () => mState());aud.addEventListener('seeked', () => calcKey());let mState = () => aud.paused ? (lrc.style.setProperty('--state','paused'),btnplay.style.setProperty('--state', 'paused')) : (lrc.style.setProperty('--state','running'),btnplay.style.setProperty('--state', 'running'));let showLrc = (time) => {let name = mFlag ? 'cover1' : 'cover2';lrc.innerHTML = data.lrcAr[mKey][1];lrc.dataset.lrc = data.lrcAr[mKey][1].replace(/<br>/, '\n');lrc.style.setProperty('--motion', name);lrc.style.setProperty('--tt', time + 's');lrc.style.setProperty('--state', 'running');mKey += 1;mFlag = !mFlag;};let calcKey = () => {for (j = 0; j < data.lrcAr.length; j++) {if (aud.currentTime <= data.lrcAr[j][0]) {mKey = j - 1;break;}}if (mKey < 0) mKey = 0;if (mKey > data.lrcAr.length - 1) mKey = data.lrcAr.length - 1;let time = data.lrcAr[mKey][2] - (aud.currentTime - data.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;}};mkPlayer.HCPlayer = playCode;})(this);
  22.         (function(mkFS) {let setFullScreen = (user_set) => {let pa = user_set.pa;if(typeof(pa) !== 'object') return false;if(!user_set.set) user_set.set = 'color: snow; background: black; border: 2px solid snow; left: 40px; bottom: 40px;';btnMsg = document.createElement('span');btnMsg.style.cssText = `position: absolute; border-radius: 8px; padding: 4px; cursor: pointer; z-index:998; ${user_set.set}`;btnMsg.innerText = '全屏观赏';btnMsg.style.display = 'none';pa.appendChild(btnMsg);let timerId, fs = false;btnMsg.onclick = () => fs ? document.exitFullscreen() : pa.requestFullscreen();pa.addEventListener('mousemove', (e) => {clearTimeout(timerId);btnMsg.style.display = 'block';timerId = setTimeout('btnMsg.style.display = "none"', 3000);});document.addEventListener('fullscreenchange', () => {if (document.fullscreenElement !== null) {fs = true;btnMsg.innerText = '退出全屏';} else {fs = false;btnMsg.innerText = '全屏观赏';}});};mkFS.FS = setFullScreen;})(this);
  23.         let averAdd = 0, offset = 0;
  24.          let geci = `[00:00.000]许你(婴宁)\n[03:53.855]`;


  25.         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)) + averAdd;tmpAr.push(aver);tmpAr.forEach((item,key) => {ar[key][2] = item > aver ? aver : item;});return ar;};
  26.         let getLrcAr = (text) => {let lrcAr = [];let calcRule = [60,1,0.001];for(x of text.split('\n')) {let ar = [];let re = /\d+[\.:]\d+([\.:]\d+)?/g;let geci = x.replace(re,'');if(geci) {geci = geci.replace(/[\[\]\'"\t,]s?/g,'');let time = x.match(re);if(time != null) {for(y of time) {let tmp = y.match(/\d+/g);let sec = 0;for(z in tmp) sec += tmp[z] * calcRule[z];ar[0] = [parseFloat(sec.toFixed(2)) + offset, geci];lrcAr.push(ar[0]); }}}}lrcAr.sort((a,b)=> a[0] - b[0]);return(lrcTime(lrcAr));}

  27.         HCPlayer({
  28.                 lrcAr: getLrcAr(geci),
  29.                 lrc_css: '--bg: linear-gradient(hsla(90,80%,50%,.35),hsla(100,70%,45%,.6)); top: 20px;',
  30.                 player_css: '--ww: 180px; bottom: 10px;',
  31.                 btn_txt: '\u2623',
  32.         });

  33.         FS({
  34.                 pa: papa,
  35.                 set: 'backgroun: transparent; color: snow; border: 2px dotted snow; left: 20px; top: 20px;',
  36.         });

  37.         aud.onerror = () => {
  38.                 if(aud.error.code === 4) aud.src = '';
  39.         }
  40. })();
  41. </script>
复制代码




评分

1

查看全部评分

点评
回复 使用道具

千年灵狐
开卷有益 雪花精灵 版主勋章 海洋之心 蝴蝶精灵 花漫千山 江湖之上 江湖靓女 音画同行 一生安柠 樱果相依 红狐狸
 楼主| 发表于 2023-8-22 11:29 | 显示全部楼层
本帖最后由 婴宁 于 2023-8-24 16:23 编辑

十四、《猫咪》地址:http://qslt.net/forum.php?mod=viewthread&tid=3769,代码如下:
  1. <style>
  2. #papa { margin: auto; width: 1200px; height: 660px; background: url('https://s1.ax1x.com/2023/08/12/pPuC1lF.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; position: relative; display: grid; place-items: center; user-select: none; z-index: 1; --opt: .25;  }
  3. #mplayer { position: absolute; bottom: 20px; display: grid; grid-template-columns: auto auto auto; place-items: center; gap: 6px; user-select: none; }
  4. #btnplay { width: 40px; height: 40px; text-align: center; font: normal 40px/40px sans-serif; color: snow; cursor: pointer; animation: rot linear 4s infinite; }
  5. #prog { --ww: 0px; width: 300px; height: 12px; border: 1px solid green; border-radius: 6px; background: snow; opacity: .65; position: relative; }
  6. #prog::before { position: absolute; content: ''; width: var(--ww); height: 12px; border-radius: 6px; background: snow linear-gradient(90deg, orange, green); opacity: .75; }
  7. #audtime { font: normal 14px sans-serif; color: snow; }
  8. #lrc { --motion: cover1; --tt: 5s; --state: paused; position: absolute; top: 30px; font: bold 2.4em sans-serif; color: hsl(0,10%,90%); -webkit-background-clip: text; filter: drop-shadow(1px 1px 2px hsla(0,0%,0%,.95)); }
  9. #lrc::before { position: absolute; content: attr(data-lrc); width: 20%; height: 100%; color: transparent; overflow: hidden; white-space: nowrap; background: linear-gradient(180deg,hsla(0,50%,20%,.45),hsla(140,100%,50%,.75)); filter: inherit; -webkit-background-clip: text; animation: var(--motion) var(--tt) linear forwards; animation-play-state: var(--state); }
  10. #fish { offset-path: path('M310 195a93.5 62 0 1 0 187 0a93.5 62 0 1 0 -187 0z'); offset-distance: 100%; animation: swim 50s infinite; }
  11. @keyframes cover1 { from { width: 0; } to { width: 100%; } }
  12. @keyframes cover2 { from { width: 0; } to { width: 100%; } }
  13. @keyframes rot { to { transform: rotate(1turn); } }
  14. @keyframes swim { to { offset-distance: 0%; } }
  15. </style>

  16. <div id="papa">
  17.         <img id="fish" src="http://qslt.net/data/attachment/forum/202308/11/120506zy8dyltotmknyaiy.gif" alt="">
  18.         <div id="lrc" data-lrc="猫咪"></div>
  19.         <div id="mplayer">
  20.                 <span id="btnplay">❁</span>
  21.                 <span id="prog"></span>
  22.                 <span id="audtime">00:00 | 00:00</span>
  23.         </div>
  24. </div>



复制代码

十四、《闲云野鹤》地址:http://qslt.net/forum.php?mod=viewthread&tid=3768,代码如下:
  1. <style>
  2. #papa { position: relative; left: -214px; width: 1200px; height: 640px; background: teal url('https://s1.ax1x.com/2023/08/12/pPuS3yd.jpg') no-repeat center/cover; display: grid; grid-template-areas: 'head head head' 'mid mid mid' 'foot foot foot'; box-shadow: 3px 3px 20px #000; user-select: none; z-index: 1; }
  3. #papa > div { position: relative; display: grid; }
  4. #pa_top { grid-area: head; place-items: center start; }
  5. #pa_mid { grid-area: mid; place-items: start start; }
  6. #pa_foot { grid-area: foot; place-items: center; }
  7. #btnplay { --dur: 6s; position: absolute; bottom: 20px; width: 40px; height: 40px; font: bold 40px/40px serif; text-align: center; color: purple; cursor: pointer; animation: rot linear var(--dur) infinite; }
  8. #lrc { --motion: cover1; --tt: 1s; --state: paused; position: absolute; font: bold 2.4em sans-serif; color: hsl(240,100%,90%); -webkit-background-clip: text; filter: drop-shadow(1px 1px 2px hsla(0,100%,0%,.85)); }
  9. #lrc::before { position: absolute; content: attr(data-lrc); width: 20%; height: 100%; color: transparent; overflow: hidden; white-space: nowrap; background: linear-gradient(180deg,hsla(240,100%,50%,.75),hsla(0,100%,50%,.65)); filter: inherit; -webkit-background-clip: text; animation: var(--motion) var(--tt) linear forwards; animation-play-state: var(--state); }
  10. @keyframes cover1 { from { width: 0; } to { width: 100%; } }
  11. @keyframes cover2 { from { width: 0; } to { width: 100%; } }
  12. @keyframes rot { to { transform: rotate(360deg); } }
  13. </style>

  14. <div id="papa">
  15.         <div id="pa_top">
  16.                 <img src="https://638183.freep.cn/638183/t22/hl/fwhe0.gif" alt="" style="position: absolute; width: 564px;" />
  17.         </div>
  18.       
  19.         <div id="pa_foot">
  20.                 <span id="lrc" data-lrc="">闲 云 野 鹤</span>
  21.                 <span id="btnplay">☯</span>
  22.         </div>
  23. </div>

  24. <script>
  25. (function() {
  26.         let mKey = 0, mFlag = true, aud = new Audio();
  27.         let lrcAr = [];
  28.         aud.src = 'https://music.163.com/song/media/outer/url?id=2029711808.mp3';
  29.         aud.loop = false;
  30.         aud.autoplay = true;
  31.         papa.oncontextmenu = () => false;
  32.         btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();
  33.         aud.addEventListener('pause', () => mState());
  34.         aud.addEventListener('play', () => mState());
  35.         aud.addEventListener('ended', () => { mKey = 0; aud.play(); });
  36.         aud.addEventListener('timeupdate', () => {for (j = 0; j < lrcAr.length; j++) {if (aud.currentTime >= lrcAr[j][0]) {if (mKey === j) showLrc(lrcAr[j][2]);else continue;}}});
  37.         let mState = () => aud.paused ? (btnplay.style.animationPlayState = 'paused', lrc.style.setProperty('--state', 'paused')) : (btnplay.style.animationPlayState = 'running', lrc.style.setProperty('--state', 'running'));
  38.         let showLrc = (time) => {let name = mFlag ? 'cover1' : 'cover2';lrc.innerHTML = 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;};
  39. })();
  40. </script>
复制代码

十五、《宠物小精灵》地址:http://qslt.net/forum.php?mod=viewthread&tid=3826,代码如下:
  1. <style>
  2. #papa { left: -214px; width: 1200px; height: 680px; display: grid; place-items: center; background: gray url('https://s1.ax1x.com/2023/08/12/pPuS3yd.jpg'); box-shadow: 3px 3px 20px #000; perspective: 3000px; font: bold 1.2em / 30px sans-serif;  text-shadow: 1px 1px 1px black; color: snow; position: relative; }
  3. #msgbox {position: absolute; bottom: 25px; }
  4. #mama { position: absolute; width: 200px; height: 200px; animation: rot 20s linear infinite; transform-style: preserve-3d; }
  5. #mama:hover { animation-play-state: paused; cursor: pointer; }
  6. .pics { position: absolute; width: 100%; height: 100%; transition: all .5s; }
  7. .pics:hover { box-shadow: 14px 14px 20px #000; top: 10px; filter: grayscale(100%); }
  8. #mama img:nth-child(1) { transform: rotateY(0deg) translateZ(200px); }
  9. #mama img:nth-child(2) { transform: rotateY(60deg) translateZ(200px); }
  10. #mama img:nth-child(3) { transform: rotateY(120deg) translateZ(400px); }
  11. #mama img:nth-child(4) { transform: rotateY(180deg) translateZ(400px); }
  12. #mama img:nth-child(5) { transform: rotateY(240deg) translateZ(400px); }
  13. #mama img:nth-child(6) { transform: rotateY(300deg) translateZ(400px); }
  14. #playbox { position: absolute; left: 10px; top: 10px; padding: 10px; display: flex; gap: 8px; z-index: 100; }
  15. #btnplay { width: 30px; height: 30px; border-radius: 50%; outline: none; border: none; }
  16. #btnplay:hover { background: #aaa; color: #ff0000; cursor: pointer; }
  17. @keyframes rot { to { transform: rotateY(360deg); } }
  18. </style>

  19. <div id="papa">
  20.         <div id="mama">
  21.                 <img class="pics" src="https://s1.ax1x.com/2023/07/20/pC7LE9J.jpg" alt="" />
  22.                 <img class="pics" src="https://s1.ax1x.com/2023/07/20/pC7LiAU.jpg" alt="" />
  23.                 <img class="pics" src="https://s1.ax1x.com/2023/05/02/p9GRYDg.jpg" alt="" />
  24.                 <img class="pics" src="https://s1.ax1x.com/2023/03/02/ppFmjyj.jpg" alt="" />
  25.                 <img class="pics" src="https://s1.ax1x.com/2023/03/09/ppnGfrd.jpg" alt="" />
  26.                 <img class="pics" src="https://s1.ax1x.com/2023/04/01/ppWVQtH.jpg" alt="" />
  27.         </div>
  28.         <div id="msgbox"></div>
  29.         <div id="playbox"><input id="btnplay" type="button" value=">" /><span>纯音乐</span></div>
  30. </div>
  31. <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1885581139.mp3" autoplay="autoplay" loop="loop"></audio>

  32. <script>
  33. btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();
  34. aud.addEventListener('playing', () => btnplay.value = '||');
  35. aud.addEventListener('pause', () => btnplay.value = '>');
  36. </script>
复制代码


十六、《墨舞流年》地址:http://qslt.net/forum.php?mod=viewthread&tid=3767,代码如下:
  1. <style>
  2. #papa { margin: auto; width: 1024px; height: 640px; background: url('https://s1.ax1x.com/2023/08/14/pPKLCD0.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; position: relative; display: grid; place-items: center; user-select: none; z-index: 1; --opt: .15;  }
  3. #papa::before { position: absolute; content: ''; width: 100%; height: 50%; background: url('https://638183.freep.cn/638183/t22/webp/126.gif') repeat; opacity: var(--opt); }
  4. #mplayer { position: absolute; bottom: 20px; display: grid; grid-template-columns: auto auto; place-items: center; z-index: 9; }
  5. #btnplay { width: 30px; height: 30px; border-radius: 50%; background: tan linear-gradient(hsla(120,100%,90%,.6), hsla(0,100%,50%,.6)); cursor: pointer; animation: rot linear 3s infinite; }
  6. #lrc { --motion: cover1; --tt: 5s; --state: paused; position: absolute; bottom: 60px; font: bold 2.4em sans-serif; color: hsl(0,10%,90%); -webkit-background-clip: text; filter: drop-shadow(1px 1px 2px hsla(0,100%,0%,.85)); }
  7. #lrc::before { position: absolute; content: attr(data-lrc); width: 20%; height: 100%; color: transparent; overflow: hidden; white-space: nowrap; background: linear-gradient(180deg,hsla(60,100%,50%,.75),hsla(120,100%,50%,.75)); filter: inherit; -webkit-background-clip: text; animation: var(--motion) var(--tt) linear forwards; animation-play-state: var(--state); }
  8. @keyframes cover1 { from { width: 0; } to { width: 100%; } }
  9. @keyframes cover2 { from { width: 0; } to { width: 100%; } }
  10. @keyframes rot { to { transform: rotate(1turn); } }
  11. </style>

  12. <div id="papa">
  13.         <div id="lrc" data-lrc="歌曲"></div>
  14.         <div id="mplayer">
  15.                 <span id="btnplay"></span>
  16.                 <svg id="iplay" width="300" height="20">
  17.                         <line id="track" x1="10" y1="10" x2="190" y2="10" stroke="hsla(60,40%,80%,0.5)" stroke-width="10" stroke-linecap="round" />
  18.                         <line id="prog" x1="10" y1="10" x2="190" y2="10" stroke="hsla(0,100%,50%,0.5)" stroke-width="10" stroke-dasharray="180" stroke-dashoffset="180" stroke-linecap="round" />
  19.                         <text id="audtime" x="200" y="15" font-size="14" fill="hsl(0,0%,100%)">00:00 | 00:00</text>
  20.                 </svg>
  21.         </div>
  22. </div>

  23. <script>
  24. (function() {
  25.         let len = track.getTotalLength(), aud = new Audio(), mKey = 0, mFlag = true;
  26.         aud.src = 'https://music.163.com/song/media/outer/url?id=1905931032.mp3';
  27.         let lrcAr = [];
  28.         aud.loop = true;
  29.         aud.autoplay = true;
  30.         btnplay.style.animationPlayState = aud.paused ? 'paused' : 'running';
  31.         btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();
  32.         aud.addEventListener('seeked', () => calcKey());
  33.         prog.onclick = track.onclick = (e) => aud.currentTime = aud.duration * (e.offsetX - 10) / len;
  34.         aud.addEventListener('pause', () =>mState());
  35.         aud.addEventListener('play', () =>mState());
  36.         aud.addEventListener('timeupdate', () => {prog.style.strokeDashoffset = len - aud.currentTime * len / aud.duration;audtime.textContent = toMin(aud.currentTime) + ' | ' + toMin(aud.duration);for(j=0; j<lrcAr.length; j++) {if(aud.currentTime >= lrcAr[j][0]) {cKey = j;if(mKey === j) showLrc(lrcAr[j][2]);else continue;}}});
  37.         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);};
  38.         let showLrc = (time) => {let name = mFlag ? 'cover1' : 'cover2';lrc.innerHTML = 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;};
  39.         let mState = () => aud.paused ? (btnplay.style.animationPlayState = 'paused',lrc.style.setProperty('--state', 'paused'),papa.style.setProperty('--opt','0')) : (btnplay.style.animationPlayState = 'running', lrc.style.setProperty('--state', 'running'),papa.style.setProperty('--opt','.15'));
  40.         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;}
  41. })();
  42. </script>
复制代码


十七、《烟花易冷》地址:http://qslt.net/forum.php?mod=viewthread&tid=3872,代码如下:
  1. <style>
  2. #papa { center; width: 1200px; height: 640px; background: gray url('https://scpic.chinaz.net/files/default/imgs/2023-07-03/7e4f51486369330f.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; position: relative; }
  3. #canv { position: absolute; }
  4. #disc { position: absolute; width: 40px; height: 40px; left: 10px; bottom: 10px; background: conic-gradient(red,orange,yellow,green,teal,blue,purple); mask: radial-gradient(transparent 1px,red 0); -webkit-mask: radial-gradient(transparent 4px,red 0); border-radius: 50%; cursor: pointer; animation: rot 4s linear infinite; }
  5. #lrcbox { position: absolute; left: 160px; bottom: 10px;  font: bold 22px / 40px sans-serif; color: #859670; text-shadow: 2px 2px 4px #222; }
  6. @keyframes rot { to { transform: rotate(360deg); } }
  7. </style>

  8. <div id="papa">
  9.         <span id="lrcbox">纯音乐 - 烟花易冷</span>
  10.         <canvas id="canv"></canvas>
  11.         <span id="disc"></span>
  12. </div>

  13. <script>
  14. (function() {
  15.         let num = (min, max) => Math.floor(Math.random() * (max-min+1)) + min;
  16.         let ctx = canv.getContext('2d');
  17.         let w = canv.width = papa.offsetWidth, h = canv.height = papa.offsetHeight, particles = [], idx = 0, aud = new Audio();
  18.         
  19.         aud.src = 'https://music.163.com/song/media/outer/url?id=1942250548.mp3';
  20.         aud.loop = true;
  21.         aud.autoplay = true;
  22.         
  23.         disc.style.animationPlayState = aud.paused ? 'paused' : 'running';
  24.         disc.onclick = () => aud.paused ? aud.play() : aud.pause();
  25.         aud.addEventListener('playing',()  => disc.style.animationPlayState = 'running');
  26.         aud.addEventListener('pause',()  => disc.style.animationPlayState = 'paused');

  27.         canv.onclick = function(event) {
  28.                 let x = event.offsetX || event.layerX, y = event.offsetY || event.layerY;
  29.                 createParticle(x, y);
  30.         }

  31.         function createParticle(x, y) {
  32.                 let count = 100, radius = 10;
  33.                 for (let j = 0; j < count; j ++) {
  34.                         let p = {};
  35.                         let angle = 360 / count * j, radian = Math.PI / 180 * angle;
  36.                         p.radius = radius;
  37.                         p.startX = x;
  38.                         p.startY = y;
  39.                         p.radian = radian;
  40.                         p.rgb = `${num(0,255)},${num(0,255)},${num(0,255)},`;
  41.                         p.alpha = (Math.floor(Math.random() * 101)) / 100;
  42.                         p.speed = (Math.random() * 5) + 0.4;
  43.                         p.radius = p.speed;
  44.                         particles.push(p);
  45.                 }
  46.         }

  47.         function drawParticle() {
  48.                 ctx.fillStyle = 'transparent';
  49.                 ctx.fillRect(0, 0, w, h);
  50.                 for (let j = 0; j < particles.length; j++) {
  51.                         let p = particles[j];
  52.                         let resultX = Math.cos(p.radian) * p.radius;
  53.                         let resultY = Math.sin(p.radian) * p.radius + 0.4;
  54.                         p.startX += resultX;
  55.                         p.startY += resultY;
  56.                         p.radius *= 1 - p.speed / 100;
  57.                         p.alpha -= 0.005;
  58.                         if (p.alpha <= 0) {
  59.                                 particles.splice(j, 1);
  60.                                 continue;
  61.                         }
  62.                         ctx.beginPath();
  63.                         ctx.arc(p.startX, p.startY, 2, 0, 360, false);
  64.                         ctx.closePath();
  65.                         ctx.fillStyle = 'rgba(' + p.rgb + p.alpha + ')';
  66.                         ctx.fill();
  67.                 }
  68.         }

  69.         function fade() {
  70.                 ctx.globalCompositeOperation = 'destination-out';
  71.                 ctx.fillStyle = 'rgba(0, 0, 0, .1)';
  72.                 ctx.fillRect(0, 0, w, h);
  73.                  ctx.globalCompositeOperation = 'lighter';
  74.         }

  75.         function render() {
  76.                 idx ++;
  77.                 fade();
  78.                 drawParticle();
  79.                 if(idx > 20) {
  80.                         createParticle(Math.random() * w, Math.random() * h/2);
  81.                         idx = 0;
  82.                 }
  83.                 requestAnimationFrame(render);
  84.         }

  85.         render();
  86. })();
  87. </script>
复制代码


十八、《遗失的风景》地址:http://qslt.net/forum.php?mod=viewthread&tid=3877,代码如下:
  1. <style>
  2. #papa {
  3.         margin: 80px 0 0 calc(50% - 593px);
  4.         width: 1200px;
  5.         height: 840px;
  6.         background: gray;
  7.         box-shadow: 3px 3px 20px #000;
  8.         position: relative;
  9.         z-index: 1;
  10. }
  11. #papa::after {
  12.         position: absolute;
  13.         content: '';
  14.         right: 0;
  15.         top: 0;
  16.         width: 130px;
  17.         height: 80px;
  18.         background: linear-gradient(40deg, #eee 40%, #B7A4A4 50%);
  19.         filter: drop-shadow(0px 0px 8px #444);
  20. }
  21. #canv {
  22.         position: absolute;
  23.         display: block;
  24.         opacity: 1;
  25.         animation: opa 20s infinite alternate linear;
  26. }
  27. #vid { display: none; }
  28. #mplayer {
  29.         position: absolute;
  30.         top: 10px;
  31.         right: 10px;
  32.         width: 30px;
  33.         height: 30px;
  34.         border: 2px solid var(--bd);
  35.         border-radius: 50%;
  36.         box-shadow: 0 0 10px var(--sd);
  37.         transition: .7s;
  38.         cursor: pointer;
  39.         display: grid;
  40.         place-items: center;
  41.         z-index: 2;
  42.         --play: 1; --pause: 0; --bd: #435D03; --sd: white;
  43. }
  44. #mplayer::before, #mplayer::after {
  45.         position: absolute;
  46.         content: '';
  47.         border-style: solid;
  48.         border-color: var(--bd);
  49.         transition: .4s;
  50. }
  51. #mplayer::before {
  52.         width: 0;
  53.         height: 0;
  54.         left: 100px;
  55.         border-width: 10px 12px;
  56.         border-color: transparent transparent transparent var(--bd);
  57.         opacity: var(--play);
  58. }
  59. #mplayer::after {
  60.         width: 2px;
  61.         height: 16px;
  62.         border-width: 0 4px 0 4px;
  63.         opacity: var(--pause);
  64. }
  65. #mplayer:hover { box-shadow: 0 0 10px var(--sd), 0 0 10px var(--sd) inset; }
  66. </style>

  67. <div id="papa">
  68.         <canvas id="canv"></canvas>
  69.         <div id="mplayer"></div>  <img src="http://qslt.net/data/attachment/forum/202308/15/174129jtrbq3qzt2rqzzct.gif" alt="" style="position: absolute; top:420px;width: 564px;" />
  70. </div>
  71. <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1366016806.mp3" loop autoplay></audio>
  72. <video id="vid" src="" poster="https://s1.ax1x.com/2023/08/11/pPnGzqA.jpg" loop muted></video>

  73. <script>
  74. (function () {
  75.         let ctx = canv.getContext('2d'), pic = new Image();
  76.         let ww = canv.width = papa.offsetWidth, hh = canv.height = papa.offsetHeight;
  77.         pic.src = vid.poster;
  78.         pic.onload = () => ctx.drawImage(pic,0,0,ww,hh);
  79.         let mState = () => aud.paused ? vid.pause() : vid.play();
  80.         let loop = () => {ctx.drawImage(vid, 0, 0, ww, hh);if(!vid.paused) {requestAnimationFrame(loop);return;}};
  81.         vid.addEventListener('play', loop, false);
  82.         aud.addEventListener('play', () => mState());
  83.         aud.addEventListener('pause', () => mState());
  84.         mplayer.addEventListener('click', () => aud.paused ? aud.play() : aud.pause());
  85. })();
  86. </script>
复制代码


评分

1

查看全部评分

点评
回复 使用道具

千年灵狐
开卷有益 雪花精灵 版主勋章 海洋之心 蝴蝶精灵 花漫千山 江湖之上 江湖靓女 音画同行 一生安柠 樱果相依 红狐狸
 楼主| 发表于 2023-8-22 11:29 | 显示全部楼层
本帖最后由 婴宁 于 2023-8-24 16:27 编辑

十九、《锁心》地址:http://qslt.net/forum.php?mod=viewthread&tid=3905,代码如下:
  1. <style>
  2. :root { --state: running; --prg: 0%; --delay: 0s; }
  3. .mydiv { margin: 0 0 0 calc(50% - 621px); width: 1080px; height: 674px; background: #333 url('https://s1.ax1x.com/2023/08/15/pPQMRKJ.jpg'); box-shadow: 0 0 8px #000; overflow: hidden; z-index: 1; display: grid; place-items: center; position: relative; }
  4. .heart { position: absolute; font: normal 30px sans-serif; animation: up 5s var(--delay) infinite var(--state); }
  5. .heart:nth-of-type(2) { --delay: -2.5s; }
  6. #mplayer { position: absolute; bottom: 10px; width: 200px; height: 40px; background: linear-gradient(to right,red var(--prg),#eee 0) repeat-x 0 50% / 100% 2px; }
  7. #mplayer::before, #mplayer::after { position: absolute; top: 28%; font-size: 14px; }
  8. #mplayer::before { content: attr(data-cu); left: -50px; }
  9. #mplayer::after { content: attr(data-du); right: -50px; }
  10. #btnplay { position: absolute; left: calc(var(--prg) - 15px); bottom: 0; font: normal 30px sans-serif; cursor: pointer; animation: swing .3s infinite linear var(--state); }
  11. @keyframes swing { from { transform: rotate(90deg) skew(-5deg); } to { transform: rotate(90deg) skew(5deg); } }
  12. @keyframes up { 0% { opacity: 0; transform: rotate(0deg) translateY(0px); } 75% { opacity: 1; transform: rotate(-10deg) translateY(-300px); } 100% { opacity: 0; transform: rotate(-60deg) translateY(0px); } }
  13. </style>

  14. <div class="mydiv">
  15.     <span class="heart">&#128151;</span>
  16.     <span class="heart">&#128147;</span>
  17.     <div id="mplayer" data-cu="00:00" data-du="00:00" title="调节进度">
  18.             <div id="btnplay" title="暂停/播放">&#128030;</div>
  19.     </div>
  20.     <audio id="aud" src="https://music.163.com/song/media/outer/url?id=158472" loop autoplay></audio>
  21. </div>

  22. <script>
  23. (function() {
  24.     let root = document.querySelector(':root');
  25.     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;}
  26.     let mState = () => root.style.setProperty('--state', aud.paused ? 'paused' : 'running');
  27.     aud.addEventListener('pause', mState, false);
  28.     aud.addEventListener('play', mState, false);
  29.     aud.addEventListener('timeupdate', () => { root.style.setProperty('--prg', aud.currentTime / aud.duration * 100 + '%'); mplayer.dataset.cu = toMin(aud.currentTime); mplayer.dataset.du = toMin(aud.duration); });
  30.     btnplay.onclick = (e) => { e.stopPropagation(); aud.paused ? aud.play() : aud.pause(); }
  31.     mplayer.onclick = (e) => aud.currentTime = aud.duration * e.offsetX / mplayer.offsetWidth;
  32. })();
  33. </script>
复制代码


二十、《神秘园》地址:http://qslt.net/forum.php?mod=viewthread&tid=3881,代码如下:
  1. <style>
  2. .mydiv { margin: 0 0 0 calc(50% - 593px); display: grid; place-items: center; width: 1200px; height: 740px; background: lightblue url('https://s1.ax1x.com/2023/08/15/pPQlWA1.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; user-select: none; overflow: hidden; position: relative; z-index: 1; --state: running; }
  3. .mydiv::before,.mydiv::after { position: absolute; left: 0px; top: 0px; content: url('http://qslt.net/data/attachment/forum/202308/15/184613fkvp8zn8djtttnrj.gif'); offset-path: path('M-20,500 L130,440 L220,550 L70,440 L470,300 L520,590 L600,520 L890,430 L980,500'); animation: move 160s var(--delay) infinite var(--state); --delay: 0s; }
  4. .mydiv::after { --delay: -80.3s; }
  5. @keyframes move { from {offset-distance: 0%; } to { offset-distance: 60%; } }
  6. </style>

  7. <div class="mydiv"></div>
  8. <audio id="aud" src="https://music.163.com/song/media/outer/url?id=2065995408.mp3" loop autoplay></audio>

  9. <script >
  10. let script = document.createElement('script');
  11. script.src = 'https://638183.freep.cn/638183/web/api/pinpuz_lrc.js';
  12. document.head.appendChild(script);

  13. (function() {
  14.     let lrcAr = [];

  15.    window.onload = () => {
  16.         ({
  17.             papa: `.mydiv`,
  18.             lrcAr: lrcAr,
  19.             lrc_css: `
  20.                 top: 15px;
  21.                 color: snow;
  22.             `,
  23.             player_css: `
  24.                 color: snow;
  25.                 top: 120px;
  26.                 --len: 2px;
  27.             `,
  28.             pinpu_num: 60,
  29.         });
  30.    }
  31. })();
  32. </script>
复制代码


二一、《生命的悸动》地址:http://qslt.net/forum.php?mod=viewthread&tid=3876,代码如下:
  1. <style>
  2. #papa { margin: auto; width: 1200px; height: 760px; background: url('https://s1.ax1x.com/2023/08/11/pPnGH56.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; position: relative; display: grid; place-items: center; user-select: none; z-index: 1; --opt: .25;  }
  3. #mplayer { position: absolute; bottom: 20px; display: grid; grid-template-columns: auto auto auto; place-items: center; gap: 6px; user-select: none; }
  4. #btnplay { width: 40px; height: 40px; text-align: center; font: normal 40px/40px sans-serif; color: snow; cursor: pointer; animation: rot linear 4s infinite; }
  5. #prog { --ww: 0px; width: 300px; height: 12px; border: 1px solid green; border-radius: 6px; background: snow; opacity: .65; position: relative; }
  6. #prog::before { position: absolute; content: ''; width: var(--ww); height: 12px; border-radius: 6px; background: snow linear-gradient(90deg, orange, green); opacity: .75; }
  7. #audtime { font: normal 14px sans-serif; color: snow; }
  8. #lrc { --motion: cover1; --tt: 5s; --state: paused; position: absolute; top: 30px; font: bold 2.4em sans-serif; color: hsl(0,10%,90%); -webkit-background-clip: text; filter: drop-shadow(1px 1px 2px hsla(0,0%,0%,.95)); }
  9. #lrc::before { position: absolute; content: attr(data-lrc); width: 20%; height: 100%; color: transparent; overflow: hidden; white-space: nowrap; background: linear-gradient(180deg,hsla(0,50%,20%,.45),hsla(140,100%,50%,.75)); filter: inherit; -webkit-background-clip: text; animation: var(--motion) var(--tt) linear forwards; animation-play-state: var(--state); }
  10. #fish { offset-path: path('M310 195a93.5 62 0 1 0 187 0a93.5 62 0 1 0 -187 0z'); offset-distance: 100%; animation: swim 50s infinite; }
  11. @keyframes cover1 { from { width: 0; } to { width: 100%; } }
  12. @keyframes cover2 { from { width: 0; } to { width: 100%; } }
  13. @keyframes rot { to { transform: rotate(1turn); } }
  14. @keyframes swim { to { offset-distance: 0%; } }
  15. </style>

  16. <div id="papa">
  17.         <img id="fish" src="http://qslt.net/data/attachment/forum/202308/11/160126sw6t6wj2j61te68t.gif" alt="0" />
  18.         <div id="lrc" data-lrc="江南"></div>
  19.         <div id="mplayer">
  20.                 <span id="btnplay">❁</span>
  21.                 <span id="prog"></span>
  22.                 <span id="audtime">00:00 | 00:00</span>
  23.         </div>
  24. </div>
  25. <script>
  26. (function() {
  27.         let aud = new Audio(), mKey = 0, mFlag = true;
  28.         let lrcAr = [];
  29.         aud.src = 'https://music.163.com/song/media/outer/url?id=139730.mp3';
  30.         aud.loop = true;
  31.         aud.autoplay = true;
  32.         if(aud.paused) btnplay.style.animationPlayState = 'paused';
  33.         btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();
  34.         prog.onclick = (e) => aud.currentTime = aud.duration * e.offsetX / prog.offsetWidth;
  35.         aud.addEventListener('seeked', () => calcKey());
  36.         aud.addEventListener('pause', () =>mState());
  37.         aud.addEventListener('play', () =>mState());
  38.         aud.addEventListener('timeupdate', () => {let prg = aud.currentTime * prog.offsetWidth / aud.duration < 6 ? 6 : aud.currentTime * prog.offsetWidth / aud.duration;prog.style.setProperty('--ww', prg + 'px');audtime.innerText = toMin(aud.currentTime) + ' | ' + toMin(aud.duration);for(j=0; j<lrcAr.length; j++) {if(aud.currentTime >= lrcAr[j][0]) {cKey = j;if(mKey === j) showLrc(lrcAr[j][2]);else continue;}}});
  39.         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);};
  40.         let showLrc = (time) => {let name = mFlag ? 'cover1' : 'cover2';lrc.innerHTML = 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;};
  41.         let mState = () => aud.paused ? (btnplay.style.animationPlayState='paused',lrc.style.setProperty('--state', 'paused'),papa.style.setProperty('--opt','0')) : (btnplay.style.animationPlayState='running', lrc.style.setProperty('--state', 'running'),papa.style.setProperty('--opt','.25'));
  42.         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;}
  43. })();
  44. </script>
复制代码


二二、《鸿雁》地址:http://qslt.net/forum.php?mod=viewthread&tid=3975,代码如下:
  1. <style>
  2. outer-box {
  3.         margin: 0 0 0 calc(50% - 531px);
  4.         position: relative;
  5.         display: block;
  6.         width: 1200px;
  7.         height: 798px;
  8.         background: url('https://s1.ax1x.com/2023/08/18/pP1Lk8O.jpg');
  9.         z-index: 1;
  10.         --state: paused;
  11. }
  12. css-doodle {
  13.         position: absolute;
  14. }
  15. </style>

  16. <outer-box id="papa">
  17.         <css-doodle grid="1x6" id="mplayer">
  18.                 :doodle {
  19.                         @size: 100%;
  20.                         box-shadow: 20px auto;
  21.                         --ww: 300px;
  22.                         --prog: 0;
  23.                         --tt1: '00:00';
  24.                         
  25.                         --xplace: 50%;
  26.                         --yplace: 98%;
  27.                         --color: snow;
  28.                 }
  29.                 position: absolute;
  30.                 @nth(1) {
  31.                         @size: var(--ww) 2px;
  32.                         @place: var(--xplace) var(--yplace);
  33.                         background: silver;
  34.                         :before, :after { content: ''; }
  35.                         :before {
  36.                                 position: absolute;
  37.                                 left: 0;
  38.                                 width: var(--prog);
  39.                                 height: 100%;
  40.                                 background: var(--color);
  41.                         }
  42.                         :after {
  43.                                 width: 100%;
  44.                                 height: 10px;
  45.                                 cursor: pointer;
  46.                         }
  47.                 }
  48.                 @nth(2) {
  49.                         @size: var(--ww) 20px;
  50.                         @place: var(--xplace) calc(var(--yplace) - 20px);
  51.                         :before, :after{
  52.                                 position: absolute;
  53.                                 width: 100%;
  54.                                 height: 100%;
  55.                                 color: var(--color);
  56.                         }
  57.                         :before { content: var(--tt1); }
  58.                         :after { content: var(--tt2); text-align: right; }
  59.                 }
  60.                 @nth(3) {
  61.                         @size: 60px;
  62.                         @place: var(--xplace) calc(var(--yplace) - 36px);
  63.                         cursor: pointer;
  64.                         animation: rot 6s infinite linear var(--state);
  65.                         :after {
  66.                                 content: '';
  67.                                 @size: inherit;
  68.                                 @shape: clover 4;
  69.                                 background: var(--color);
  70.                         }
  71.                 }
  72.                 @match(i ≥ 4) {
  73.                         @size: 80px 48px;
  74.                         @place: 50px 44px;
  75.                         background: url('https://638183.freep.cn/638183/t22/gif/ying1.gif');
  76.                         offset-path: path('M50 44 Q500 300 900 44');
  77.                         offset-distance: 0%;
  78.                         animation: fly 30s calc((@size - @i) * -2.5s) infinite linear var(--state);
  79.                 }
  80.                
  81.                 @keyframes fly { to { offset-distance: 100%; }}
  82.         </css-doodle>
  83.         <css-doodle grid="1" id="lrc">
  84.                 :doodle {
  85.                         @size: auto 3em;
  86.                         left: 50%;
  87.                         top: 5%;
  88.                         transform: translate(-50%);
  89.                         --geci: '';
  90.                         --motion: cover2;
  91.                         --tt: 1s;
  92.                 }
  93.                 display: grid;
  94.                 place-items: center start;
  95.                 :before, :after {
  96.                         content: var(--geci);
  97.                         width: fit-content;
  98.                         height: fit-content;
  99.                         font: bold 2.4em Sans-serif;
  100.                         color: #ccc;
  101.                         text-shadow: 1px 1px 2px #000;
  102.                         white-space: pre;
  103.                 }
  104.                 :after {
  105.                         position: absolute;
  106.                         white-space: pre;
  107.                         width: 0;
  108.                         color: red;
  109.                         overflow: hidden;
  110.                         animation: var(--motion) var(--tt) linear forwards var(--state);
  111.                 }
  112.                 @keyframes cover1 { from { width: 0; } to { width: 100%; } }
  113.                
  114.         </css-doodle>
  115.         <audio id="aud" src="https://music.163.com/song/media/outer/url?id=2006523886" autoplay="autoplay" loop="loop"></audio>

  116. </outer-box>

  117. <script>
  118. (function(){
  119.         let script = document.createElement('script');
  120.         script.src = 'https://638183.freep.cn/638183/web/api/css-doodle.js';
  121.         document.head.appendChild(script);
  122.         let mKey = 0, mFlag = true, slip = 0;
  123.         let lrcAr = [];
  124.         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;};
  125.         let mState = () => papa.style.setProperty('--state', aud.paused ? 'paused' : 'running');
  126.         let showLrc = (time) => {lrc.style.setProperty('--motion', mFlag ? 'cover1' : 'cover2');lrc.style.setProperty('--geci', '"' + lrcAr[mKey][1] + '"');lrc.style.setProperty('--tt', time + 's');mKey += 1;mFlag = !mFlag;};
  127.         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);};
  128.         aud.addEventListener('timeupdate', () => {for (j = 0; j < lrcAr.length; j++) {if (aud.currentTime - slip >= lrcAr[j][0]) {cKey = j;if (mKey === j) showLrc(lrcAr[j][2]);else continue;}}mplayer.style.setProperty('--prog', 100*aud.currentTime/aud.duration + '%');mplayer.style.setProperty('--tt1', `'${toMin(aud.currentTime)}'`);mplayer.style.setProperty('--tt2', `'${toMin(aud.duration)}'`);});
  129.         aud.addEventListener('play', mState, false);
  130.         aud.addEventListener('pause', mState, false);
  131.         aud.addEventListener('seeked', () => calcKey());
  132.         window.onload = () => {
  133.                 let btns = mplayer.shadowRoot.querySelectorAll('cell');
  134.                 let ww = parseInt(window.getComputedStyle(mplayer).getPropertyValue('--ww'));
  135.                 btns[2].onclick = () => aud.paused ? aud.play() : aud.pause();
  136.                 btns[0].onclick = (e) => aud.currentTime = e.offsetX * aud.duration / ww;
  137.         }
  138. })();
  139. </script>
复制代码


二三、《神秘的黄昏》地址:http://qslt.net/forum.php?mod=viewthread&tid=3976,代码如下:
  1. <style>
  2. #papa { center; width: 1200px; height: 740px; background: gray url('https://s1.ax1x.com/2023/08/12/pPuK4IS.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; display:grid; place-items: center; user-select: none; overflow: hidden; position: relative; z-index: 1; }
  3. #mplayer { position: absolute; bottom: 10px; width: fit-content; height: fit-content; display: flex; align-items: center; gap: 8px; z-index: 9; }
  4. #btnwrap { position: relative; width: 36px; height: 36px; display: grid; place-items: center; border-radius: 50%; background: linear-gradient(to top right, lightblue, blue); cursor: pointer; }
  5. #btnwrap:hover { background: #000 linear-gradient(to top right, snow, teal); }
  6. #btnplay { width: 20px; height: 20px; background: #ccc; clip-path: polygon(0 0, 0% 100%, 100% 50%); }
  7. #btnpause { width: 2px; height: 20px; border-style: solid; border-width: 0px 4px; border-color: transparent #eee; display: none; }
  8. #prog { width: 300px; height: 2px; background: #ccc linear-gradient(to right,red,orange,blue,tomato) no-repeat; background-size: 1px 2px; cursor: pointer; position: relative;  }
  9. #prog::before { position: absolute; content: ''; top: -7px; width: inherit; height: 15px; }
  10. #prog:hover::before { background: rgba(200,200,200,.15); }
  11. #tmsg { font: normal 16px sans-serif; color: snow;  }
  12. #lrc { position: absolute; left: 20px; top: 20px; font: bold 1.5em sans-serif; color: skyblue; text-shadow: 2px 2px 2px #222; opacity: 1; animation: opa 1.9s infinite alternate; }
  13. #wave { position: absolute; display: block; top: 0; }
  14. @keyframes opa { to { opacity: .3;} }
  15. </style>

  16. <div id="papa">
  17.         <div id="mplayer"><span id="btnwrap"><span id="btnplay"></span><span id="btnpause"></span></span><span id="prog"></span><span id="tmsg">00:00 | 00:00</span></div>
  18.         <div id="lrc"></div>
  19.         <svg id="wave" width="600" height="600"> <!-- 模拟电波 -->
  20.                 <circle cx="300" cy="300" r="0" fill="none" stroke="lightgreen" stroke-width="4">
  21.                         <animate attributeName="r" begin="0s" from="0" to="290" dur="6s" repeatCount="indefinite"></animate>
  22.                         <animate attributeName="stroke-opacity" begin="0s" from="0.5" to="0" dur="6s" repeatCount="indefinite"></animate>
  23.                 </circle>
  24.                 <circle cx="300" cy="300" r="0" fill="none" stroke="skyblue" stroke-width="3">
  25.                         <animate attributeName="r" begin="0.5s" from="0" to="290" dur="6s" repeatCount="indefinite"></animate>
  26.                         <animate attributeName="stroke-opacity" begin="0.5s" from="0.5" to="0" dur="6s" repeatCount="indefinite"></animate>
  27.                 </circle>
  28.                 <circle cx="300" cy="300" r="0" fill="none" stroke="lightblue" stroke-width="2">
  29.                         <animate attributeName="r" begin="1s" from="0" to="290" dur="6s" repeatCount="indefinite"></animate>
  30.                         <animate attributeName="stroke-opacity" begin="1s" from="0.5" to="0" dur="6s" repeatCount="indefinite"></animate>
  31.                 </circle>
  32.                 <circle cx="300" cy="300" r="0" fill="none" stroke="red" stroke-width="1">
  33.                         <animate attributeName="r" begin="1.5s" from="0" to="290" dur="6s" repeatCount="indefinite"></animate>
  34.                         <animate attributeName="stroke-opacity" begin="1.5s" from="0.5" to="0" dur="6s" repeatCount="indefinite"></animate>
  35.                 </circle>
  36.         </svg>
  37. </div>

  38. <script>
  39. let lrcAr = [
  40.         ['0.00','神秘黄昏'],
  41.         ['240.00','']
  42. ];
  43. let aud = new Audio();
  44. aud.src = 'https://music.163.com/song/media/outer/url?id=1813024829.mp3';
  45. aud.autoplay = true;
  46. aud.loop = true;
  47. btnwrap.onclick = () => aud.paused ? aud.play() : aud.pause();
  48. prog.onclick = (e) => aud.currentTime = aud.duration * e.offsetX / prog.offsetWidth;
  49. aud.addEventListener('pause', () => btnstate());
  50. aud.addEventListener('play',() => btnstate());
  51. aud.addEventListener('timeupdate', () => {
  52.         prog.style.backgroundSize = prog.offsetWidth * aud.currentTime / aud.duration + 'px 2px';
  53.         tmsg.innerText = toMin(aud.duration) + ' | ' + toMin(aud.currentTime);
  54.         for(j=0; j<lrcAr.length; j++) {
  55.                 if(aud.currentTime >= lrcAr[j][0]) lrc.innerText = lrcAr[j][1];
  56.         }
  57. });
  58. let btnstate = () => aud.paused ? (btnplay.style.display = 'block', btnpause.style.display = 'none') : (btnplay.style.display = 'none', btnpause.style.display = 'block');
  59. let toMin = (val)  => {
  60.         if (!val) return '00:00';
  61.         val = Math.floor(val);
  62.         let min = parseInt(val / 60), sec = parseFloat(val % 60);
  63.         if(min < 10) min = '0' + min;
  64.         if(sec < 10) sec = '0' + sec;
  65.         return min + ':' + sec;
  66. }
  67. </script>
复制代码



评分

1

查看全部评分

点评
回复 使用道具

六国朝令制

六六顺 ♥ 沁入心
山间红叶 音画同行 中秋月圆 欢度国庆 雪花精灵 丹凤凰
发表于 2023-8-23 13:31 | 显示全部楼层
有些看不懂
点评
回复 使用道具

千年灵狐
开卷有益 雪花精灵 版主勋章 海洋之心 蝴蝶精灵 花漫千山 江湖之上 江湖靓女 音画同行 一生安柠 樱果相依 红狐狸
 楼主| 发表于 2023-8-24 16:31 | 显示全部楼层
二四、《星空》地址:http://qslt.net/forum.php?mod=viewthread&tid=4032,代码如下:

  1. <style>
  2. #papa {
  3.         margin: -80px 0  0 calc(50% - 593px);
  4.         width: 1234px;
  5.         height: 740px;
  6.         background: url('https://s1.ax1x.com/2023/08/18/pP1bQeI.jpg') center/cover no-repeat;
  7.         overflow: hidden;
  8.         position: relative;
  9.         --state: paused;
  10. }
  11. #mplayer {
  12.         position: absolute;
  13.         width: 40px;
  14.         height: 40px;
  15.         border-radius: 50%;
  16.         box-shadow: 10px 8px snow;
  17.         cursor: pointer;
  18.         animation: rot 1s infinite linear alternate var(--state);
  19. }
  20. #mplayer::before {
  21.         position: absolute;
  22.         content: '';
  23.         top: 10px;
  24.         left: 10px;
  25.         width: 100%;
  26.         height: 100%;
  27. }
  28. #wrap {
  29.         position: absolute;
  30.         width: 100%;
  31.         height: 50%;
  32.         transform: rotate(-30deg);z=[[]]
  33. }
  34. .line {
  35.         --du: 10s; --delay: 0s;
  36.         position: absolute;
  37.         width: 2px;
  38.         height: 100px;
  39.         top: -200px;
  40.         opacity: .9;
  41.         background: linear-gradient(to top, snow, transparent);
  42.         animation: flow var(--du) var(--delay) infinite linear;
  43. }
  44. @keyframes flow { to { top: 100%; opacity: 0; } }
  45. @keyframes rot { from { transform: rotate(-10deg); } to { transform: rotate(10deg); } }
  46. </style>

  47. <div id="papa">
  48.         <div id="wrap"></div>
  49.         <div id="mplayer"></div>
  50.         <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1387078234" autoplay loop></audio>
  51. </div>

  52. <script>
  53. let total = 40, ww = wrap.offsetWidth;
  54. Array.from({length:total}).forEach((item,key) => {
  55.         let sp = document.createElement('span');
  56.         sp.className = 'line';
  57.         sp.style.cssText += `
  58.                 --delay: ${Math.random() * 4 - 4}s;
  59.                 --du: ${Math.random() * 8 + 4}s;
  60.                 left: ${Math.random() * ww}px;
  61.                 height: ${Math.random() * 50 + 50}px;
  62.         `;
  63.         wrap.appendChild(sp);
  64. });
  65. let mState = () => papa.style.setProperty('--state', aud.paused ? 'paused' : 'running');
  66. aud.addEventListener('play', mState, false);
  67. aud.addEventListener('pause', mState, false);
  68. mplayer.onclick = () => aud.paused ? aud.play() : aud.pause();
  69. </script>
复制代码


二五、《绿野仙踪》地址:http://qslt.net/forum.php?mod=viewthread&tid=4069,代码如下:
  1. <style>
  2. #papa {
  3.         margin: 0 0 0 calc(50% - 593px);
  4.         width: 1234px;
  5.         height: 740px;
  6.         background: snow url('https://s1.ax1x.com/2023/08/18/pP1bKOA.jpg') no-repeat center/cover;
  7.         box-shadow: 100 8px #000;
  8.         position: relative;
  9.         --state: paused; --delay: 0s;
  10. }
  11. #papa::before, #papa::after {
  12.         position: absolute;
  13.         content: url('http://qslt.net/data/attachment/forum/202308/16/102439ghzyhxb20u2hekef.gif');
  14.         transform: rotate(0deg);
  15.         
  16.         animation: fly 30s var(--delay) infinite linear var(--state);
  17. }
  18. #papa::after { --delay: 15s; }
  19. #papa > img {
  20.         position: absolute;
  21.         left: 65%;
  22.         bottom: 20%;
  23.         cursor: pointer;
  24. }
  25. @keyframes fly { to { offset-distance: 0%; } }
  26. </style>

  27. <div id="papa">
  28.         <audio id="aud" src="https://music.163.com/song/media/outer/url?id=866210299" autoplay="autoplay" loop="loop"></audio>
  29.         
  30. </div>

  31. <script>
  32. (function() {
  33.         let mState = () => papa.style.setProperty('--state', aud.paused ? 'paused' : 'running');
  34.         aud.addEventListener('play', mState, false);
  35.         aud.addEventListener('pause', mState, false);
  36.         papa.onclick = () => aud.paused ? aud.play() : aud.pause();
  37.         mplayer.onmouseover = () => mplayer.src = 'https://638183.freep.cn/638183/2-2.gif';
  38.         mplayer.onmouseout = () => mplayer.src = 'https://638183.freep.cn/638183/2-0.gif';
  39. })();
  40. </script>
复制代码


二七、《雪域》地址:http://qslt.net/forum.php?mod=viewthread&tid=4077,代码如下:
  1. <style>

  2. #papa { margin-left: calc(50% - 593px); display: grid; place-items: center; width: 1234px; height: 740px; background: #000 url('https://s1.ax1x.com/2023/08/20/pP8oEKs.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; perspective: 1000px; overflow: hidden; user-select: none; position: relative; z-index: 1; }
  3. #papa::after { position: absolute; content: '雪  域'; top: 10px; font: bold 3em sans-serif; color: snow; text-shadow: 2px 2px 3px #ccc; opacity: .6; }
  4. #mplayer { position: absolute; bottom: 10px; z-index: 1000; }
  5. #btnwrap { display: block; fill: hsla(30, 20%, 80%, .9); cursor: pointer; }
  6. #btnwrap:hover { fill: hsla(90, 100%, 100%, .9); }
  7. #tmsg { fill: hsla(30, 100%, 90%, .9); stroke: none; font: bold 1em sans-serif; }
  8. .stars { position: absolute; width: 3px; height: 3px; border-radius: 50%; background: silver; transform-style: preserve-3d; }
  9. @keyframes move { to { transform: rotate(0) translate3d(0, 0, 0); } }

  10. </style>

  11. <div id="papa">
  12.         <svg id="mplayer" width="120" height="120">
  13.                 <g id="mama" transform="rotate(-90, 60, 60)" style="cursor: pointer;">
  14.                         <circle id="track" cx="60" cy="60" r="50" fill="none" stroke-width="10" stroke="hsla(240, 20%, 80%, .77)" />
  15.                         <circle id="prog" cx="60" cy="60" r="50" fill="none" stroke-width="10" stroke="hsla(240,100%,60%,.65)" />
  16.                 </g>
  17.                 <g id="btnwrap">
  18.                         <path id="btnplay" d="M 50 50,50 70,70, 60 z"></path>
  19.                         <path id="btnpause" d="M 52 50,52 70,57 70,57 50,52 50 z M 60 50,60 70,65 70,65 50,60 50 z" style="display: none;"></path>
  20.                         <path d="M 57 50,60 50,60 70,57 70 z" fill="transparent" />
  21.                 </g>
  22.                 <path id="curPath" d="M 20 70 Q 60 0 100 70" fill="none" stroke="none"/>
  23.                 <path id="durPath" d="M 20 55 Q 60 110 100 55" fill="none" stroke="none"/>
  24.                 <g id="tmsg">
  25.                         <text x="34" y="0"><textPath id="curMsg" xlink:href="#curPath" dominant-baseline="text-after-edge">00:00</textPath></text>
  26.                         <text x="29" y="0"><textPath id="durMsg" xlink:href="#durPath" dominant-baseline="text-before-edge">00:00</textPath></text>
  27.                 </g>
  28.         </svg>
  29. </div>
  30. <audio id="aud" src="http://www.kumeiwp.com/sub/filestores/2022/11/04/dc52a9ca7610090421f620496f39715b.mp3" loop autoplay></audio>

  31. <script>

  32. (function() {
  33.         (function() {for(j=0; j<500; j++) {let ele = document.createElement('span');ele.className = 'stars';ele.style.cssText += `left: ${Math.random() * 200 + 420}px;top: ${Math.random() * 100 + 260}px;background: hsla(${Math.random() * 255}, ${Math.random() * 50 + 40}%,${Math.random() * 40 + 20}%, ${Math.random() * .5 + .4});box-shadow: 0 0 5px hsla(0,10%,100%,.25);transform: rotate(${Math.random() * 720}deg) translate3d(${Math.random() * 500}px,${Math.random() * 300}px,${Math.random() * 1000}px);animation: move 30s infinite ${-10 - Math.random() * 20}s linear;`;papa.appendChild(ele);}})();
  34.         let cc = { x: 1*track.getAttribute('cx'), y: 1*track.getAttribute('cy'), len: track.getTotalLength(),};
  35.         prog.style.strokeDasharray = prog.style.strokeDashoffset =cc.len;
  36.         btnwrap.onclick = () => aud.paused ? aud.play() : aud.pause();
  37.         mama.onclick = (e) => {let deg = Math.atan2(e.offsetY - cc.y, e.offsetX - cc.x) * 180 / Math.PI;deg += (e.offsetX < cc.x && e.offsetY < cc.y) ? 450 : 90;aud.currentTime = aud.duration * deg / 360;};
  38.         aud.addEventListener('pause', () => mState());
  39.         aud.addEventListener('play', () => mState());
  40.         aud.addEventListener('seeked', () => aud.play());
  41.         aud.addEventListener('timeupdate', () => {prog.style.strokeDashoffset = cc.len - cc.len * aud.currentTime / aud.duration;curMsg.textContent = toMin(aud.currentTime);durMsg.textContent = toMin(aud.duration);});
  42.         let mState = () => aud.paused ? (btnplay.style.display = 'block', btnpause.style.display = 'none') : (btnplay.style.display = 'none', btnpause.style.display = 'block');
  43.         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;};
  44.         document.title = '雪  乡';
  45. })();

  46. </script>
复制代码


二八、《自由自在》地址:http://qslt.net/forum.php?mod=viewthread&tid=4107,代码如下:
  1. <style> #papa { margin: 0 0 0 calc(50% - 593px); display: grid; place-items: center; width: 1234px; height: 780px; background: lightblue url('https://s1.ax1x.com/2023/08/20/pP8TAJO.jpg') no-repeat center/cover; box-shadow: 30px 3px 20px #000; user-select: none; position: relative; z-index: 1; } </style>

  2. <div id="papa">
  3.         <img src="http://qslt.net/data/attachment/forum/202308/11/120506zy8dyltotmknyaiy.gif" alt="" style="position: absolute; bottom: 0; right: 0;" />
  4. </div>
  5. <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1840182622.mp3" loop autoplay></audio>

  6. <script >

  7. //插件代码略
  8. //歌词数组代码样式↓
  9. let lrcAr = [[0.95,"Je voudrais du soleil vert<br>",2.6],[5.27,"Des dentelles et des théières<br>",]];

  10. //设置播放器插件参数↓
  11. HCPlayer({
  12.         lrcAr: lrcAr,
  13.         lrc_css: `
  14.                 top: 5px;
  15.                 left: 50%;
  16.                 transform: translate(-50%);
  17.                 --bg: linear-gradient(hsla(100,70%,50%,.35),hsla(120,40%,40%,.6));
  18.                 color: hsla(120,100%,95%,.95);
  19.         `,
  20.         player_css: `
  21.                 bottom: 20px;
  22.                 --color: snow;
  23.                 --ww: 200px;
  24.                 --btn_size: 40px;
  25.                 --btn_img: url("https://638183.freep.cn/638183/t22/btn/g3.png") no-repeat center/cover;
  26.         `,
  27. });

  28. </script>
复制代码


二九、《追逐》地址:http://qslt.net/forum.php?mod=viewthread&tid=4109,代码如下:
  1. <style>
  2. #papa { margin: auto; width: 1234px; height: 740px; background: tan url('https://s1.ax1x.com/2023/08/15/pPQlWA1.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; user-select: none; position: relative; display: grid; grid-template-rows: -10fr 3fr 1fr; grid-template-areas: 'top top top' 'left mid mid' '. foot foot'; z-index: 1; }
  3. #papa > div { position: relative; display: grid; }
  4. .pTop { grid-area: top; place-items: center; }
  5. .pMid { grid-area: mid; }
  6. .pFoot { grid-area: foot; place-items: center; }
  7. .pLeft { grid-area: left; place-items: end; }
  8. #mplayer { position: absolute;bottom: 0; width: 300px; height: 80px; user-select: none; display: grid; place-items: center; cursor: pointer; }
  9. #mplayer:hover #btnwrap, #mplayer:hover #prog { transform: translateY(var(--yy)); } #mplayer:hover #btnwrap { background: linear-gradient(to top right, hsla(0,100%,50%, .5), hsla(120,100%,50%, .5)); border-radius: 50%; opacity: .75; }
  10. #btnwrap, #prog { position: absolute; display: grid; place-items: center;transition: .5s; } #btnwrap { --yy: -15px; width: 40px; height: 40px; transform: rotate(45deg); border: 1px solid hsla(0,50%,80%, .65); border-radius: 6px; opacity: 0; }
  11. #btnplay { width: 20px; height: 20px; background: #eee; clip-path: polygon(0 0, 0% 100%, 100% 50%); transform: translateX(3px); }
  12. #btnpause { width: 2px; height: 20px; border-style: solid; border-width: 0px 4px; border-color: transparent #eee; display: none; }
  13. #prog { --yy: 20px; width: 300px; height: 16px; border-radius: 10px; background: linear-gradient(90deg, hsla(120,100%,50%, .6), hsla(0,100%,50%, .75) 100%, transparent 0); border: 1px solid hsla(120,100%,70%, .6); font: normal 14px / 16px sans-serif; color: hsl(60,100%,50%); opacity: .75; }
  14. #lrc { font: bold 2em sans-serif; color: transparent; letter-spacing: 2px; background: linear-gradient(-90deg, hsla(120,40%,50%, .6), hsla(120,100%,100%, .5)) 100% 100% / 200% 200%; background-clip: text; -webkit-background-clip: text; filter:drop-shadow(1px 1px 2px #000); }
  15. @keyframes bgMove1 { from { background-position: 0 0; } to { background-position: -100% 0; } }
  16. @keyframes bgMove2 { from { background-position: 0 0; } to { background-position: -100% 0; } }
  17. </style>

  18. <div id="papa">
  19.         <div class="pTop"><span id="lrc"></span></div>
  20.         <div class="pMid"><img src="http://qslt.net/static/image/common/lingchong/67.gif" alt="" /></div>
  21.         <div class="pLeft"><img src="http://qslt.net/static/image/common/lingchong/13.gif" alt="" style="width: 120px; mix-blend-mode: multiply; transform: translateX(320px);" /></div>
  22.         <div class="pFoot">
  23.                 <div id="mplayer"><span id="btnwrap"><span id="btnplay"></span><span id="btnpause"></span></span><span id="prog"></span></div>
  24.         </div>
  25. </div>

  26. <script>
  27. let lrcAr = [];
  28. let mKey = 0, mSeek = false, mFlag = true, aud = new Audio();
  29. aud.src = 'https://music.163.com/song/media/outer/url?id=1888407466.mp3';
  30. aud.autoplay = true;
  31. aud.loop = true;
  32. btnwrap.onclick = () => aud.paused ? aud.play() : aud.pause();
  33. prog.onclick = (e) => aud.currentTime = aud.duration * e.offsetX / prog.offsetWidth;
  34. aud.addEventListener('pause', () => mState());
  35. aud.addEventListener('play', () => mState());
  36. aud.addEventListener('seeked', () => calcKey());
  37. aud.addEventListener('timeupdate', () => {prog.style.background= 'linear-gradient(90deg, hsla(120,100%,50%, .6), hsla(0,100%,50%, .75) ' + aud.currentTime / aud.duration * 100 + '%, hsla(0,100%,100%, .45) 0)';prog.innerText = toMin(aud.currentTime) + ' | ' + toMin(aud.duration);for(j=0; j<lrcAr.length; j++) {if(aud.currentTime >= lrcAr[j][0]) {if(mKey === j) showLrc(lrcAr[j][2]);else continue;}}});
  38. let mState = () => aud.paused ? (btnplay.style.display = 'block', btnpause.style.display = 'none', lrc.style.animationPlayState = 'paused') : (btnplay.style.display = 'none', btnpause.style.display = 'block', lrc.style.animationPlayState = 'running');
  39. let showLrc = (time) => {lrc.style.animation = (mFlag ? 'bgMove1 ' : 'bgMove2 ') + time + 's linear forwards';lrc.innerHTML = lrcAr[mKey][1];mKey += 1;mFlag = !mFlag;}
  40. 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 mtime = lrcAr[mKey][2] - (aud.currentTime - lrcAr[mKey][0]);showLrc(mtime);}
  41. 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;}
  42. </script>
复制代码



评分

1

查看全部评分

点评
回复 使用道具

千年灵狐
开卷有益 雪花精灵 版主勋章 海洋之心 蝴蝶精灵 花漫千山 江湖之上 江湖靓女 音画同行 一生安柠 樱果相依 红狐狸
 楼主| 发表于 2023-8-24 16:33 | 显示全部楼层
三十、《这里的时光静悄悄》地址:http://qslt.net/forum.php?mod=viewthread&tid=4110,代码如下:

  1. <style>#papa {
  2.         margin: 0 0 0 calc(50% - 600px);
  3.         width: 1200px;
  4.         height: 700px;
  5.         background: lightblue url('https://s1.ax1x.com/2023/08/20/pP8TAJO.jpg') no-repeat;
  6.         box-shadow: 3px 3px 20px #000;
  7.         display: grid;
  8.         place-items: center;
  9.         user-select: none;
  10.         position: relative;
  11.         z-index: 1;
  12. }
  13. #mplayer {
  14.         position: absolute;
  15.         display: grid;
  16.         grid-template-areas:
  17.                 'cur btnplay dur'
  18.                 'prog prog prog';
  19.         gap: 0 4px;
  20.         place-items: end center;
  21.         font-size: 14px;
  22.         bottom: 20px;
  23. }
  24. #cur { grid-area: cur; color: purple; }
  25. #dur { grid-area: dur; color: purple; }
  26. #btnplay {
  27.         grid-area: btnplay;
  28.         display: grid;
  29.         grid-auto-flow: column;
  30.         place-items: end center;
  31.         gap: 0 4px;
  32.         height: 160px;
  33.         cursor: pointer;
  34. }
  35. #btnplay > span {
  36.         background: red;
  37.         width: 2px;
  38.         transition: .3s;
  39. }
  40. #prog {
  41.         grid-area: prog;
  42.         width: 300px;
  43.         height: 16px;
  44.         opacity: .65;
  45.         cursor: pointer;
  46.         position: relative;
  47. }

  48. </style>

  49. <div id="papa">
  50.         <div id="mplayer">
  51.                 <div id="cur">00:00</div>
  52.                 <div id="btnplay"></div>
  53.                 <div id="dur">00:00</div>
  54.                 <progress id="prog" max="100"></progress>
  55.         </div>
  56.         <audio id="aud" src="https://music.163.com/song/media/outer/url?id=463859653.mp3" loop="" autoplay=""></audio>
  57.         <img src="http://qslt.net/data/attachment/forum/202308/14/214938v6drkdcwd140bsra.gif" alt="" style="position: absolute; width: 120px; top: 85px; left: 186px;">
  58.         <img src="http://qslt.net/data/attachment/forum/202308/21/132439d3vj03auzv0w0046.gif" alt="" style="position: absolute; width: 500px; top: 90px; left: 620px; transform: rotate(-60deg);">
  59.         <img src="http://qslt.net/data/attachment/forum/202308/11/120507dgmvjmyyp3kafpsz.gif" alt="" style="position: absolute; width: 650px; top: 320px; right: 80px; transform: rotate(-35deg);"></div>

  60. <div id="comment_1780079" class="cm">
  61. <br></div>
复制代码


三一、《秋水》地址:http://qslt.net/forum.php?mod=viewthread&tid=4216,代码如下:
  1. <style>
  2.   .container0 {
  3.   margin: 50px auto;
  4.   width: 1200px;box-shadow: 0px 0px 0px 2px #cccccc, 0px 0px 0px 15px #FAF6F6; overflow: hidden;
  5.   height: 720px;
  6. border: 1px solid;
  7. background: #333 url('https://s1.ax1x.com/2023/08/16/pPQjMVI.jpg') no-repeat center/cover; overflow: hidden;
  8.   position: relative;
  9. }

  10. .photo {
  11.   position: absolute;top:130px; left:180px;
  12. width: 65%;box-shadow: 0px 0px 0px 2px #ffffff, 0px 0px 0px 10px #FAF6F6;
  13.   height: 60%;transform:perspective(00px); background:
  14.     linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4)),
  15.    url("");
  16.   background-size: 0, cover;
  17.   box-sizing: border-box;preserve-3d;
  18.   animation: round 32s infinite;
  19.   opacity: 0;
  20. }
  21. @keyframes round {
  22.   0% {opacity: 1;transform:perspective(600px) rotateX(-180deg)scale(1);}

  23. 10% {opacity: 1;transform:perspective(600px)rotateX(30deg)scale(1)}
  24. 12% {opacity: 0.9;transform:perspective(600px)rotateX(0deg)scale(1)}
  25. 18% {opacity: 0;transform:perspective(600px)rotateX(0deg)scale(1)}
  26. }

  27. img:nth-child(1) {animation-delay: 28s;}
  28. img:nth-child(2) {animation-delay: 16s;}
  29. img:nth-child(3) {animation-delay: 8s;}

  30.     </style>


  31. <div class="container0">
  32.   <img class='photo'  src="https://s1.ax1x.com/2023/08/08/pPVN2ss.jpg" alt="" />
  33.   <img class='photo'  src="https://s1.ax1x.com/2023/08/08/pPVNRLn.jpg" alt="" />
  34.   <img class='photo'  src="https://s1.ax1x.com/2023/07/02/pCDDY1P.jpg" alt="" />
  35.   

  36. <div class="container">
  37.       <div class="btn">
  38.         <span id="bf"onclick="bf();"style="width: 120px; height: 120px;z-index: 550;position: absolute;top:-60px; left:880px;"></span>
  39.         <span id="bf"onclick="rbf();"></span>
  40.       </div>
  41. <audio autoplay="" class="audio" id="MusicPlayer" src="https://music.163.com/song/media/outer/url?id=38679066.mp3" controls loop style="width: 1%; height: 1%;z-index: 1;"></audio>
  42. <div class="img_border"><img src="http://pan.yinhuabbs.cn/view.php/caef5d12b92eaa7fad771e288f5cb7c9.png" id="aplay"style="width: 100%; height: 100%;z-index: 550;" ></div>
  43.      <div class="items" >
  44. <div  class="lrc">
  45.         <ul id="ullrc">
  46.          </ul>
  47.       </div>
  48. </div>
  49. </div>


  50. <style type="text/css">
  51. .container{width: 1px;height: 1px;
  52.     margin: 0;position: absolute;top:500px; left:-30px;z-index: 550;
  53. }
  54. .container #MusicPlayer{
  55.     width: 250px;
  56.     display: block;
  57.     margin: 0 auto;
  58. }
  59. .container .btn{
  60.     display: block;
  61.     margin: 0;
  62. }
  63. .container .lrc{
  64.     width: 960px;
  65.     height: 180px;z-index: 550;
  66.     overflow: hidden;filter:drop-shadow(#ffffff 1px 0 0)drop-shadow(#ffffff 0 1px 0)drop-shadow(#ffffff -1px 0 0) drop-shadow(#ffffff 0 -1px  0);
  67.     display: block;position: absolute;top:-70px; left:0px;
  68.     margin: 0 auto;
  69. }
  70. .container .lrc #ullrc{
  71.     width: 100%;
  72.     padding: 0;
  73.     list-style: none;
  74.     transition: 0.3s all ease;
  75.     margin: 0;
  76. }
  77. /*歌词普通样式*/
  78. .container .lrc #ullrc li{
  79.     height: 80px;
  80.     line-height: 90px;
  81. font-family:悟空大字库;
  82.     font-size: 30px;
  83.     color: #000078;transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg);
  84.     font-weight: normal;
  85.     transition: .3s all ease;/*一定要加上不然看着突兀*/
  86.     list-style-type: none;
  87.     text-align: center;
  88.     display: block;
  89.     width: 100%;
  90.     margin: 0 auto;

  91. }
  92. /*动态歌词样式*/
  93. .container .lrc #ullrc li.active{
  94.     font-size: 40px;
  95.     color: #ff0000;transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg);
  96.     font-weight: bold;
  97. }
  98. /*光碟动画*/
  99. .container .img_border{display:inline-block;width:120px;height:120px;margin:0px ;position: absolute;top:-60px; left:880px;z-index: 150;}
  100. .container .img_border #aplay{ }
  101. .container .z360z{-webkit-animation:rotating 10s linear infinite;animation:rotating 10s linear infinite}@-webkit-keyframes rotating{0% {transform: rotateX(0deg) rotateY(0deg)
  102. rotateZ(0deg)scale(0.2);}
  103. 50% {transform: rotateX(0deg) rotateY(0deg) rotateZ(-30deg)scale(2.5);}
  104. 100% {transform: rotateX(0deg) rotateY(0deg) rotateZ(360deg)scale(2.5);}
  105. }
  106. .audio{
  107.     z-index: 1;
  108.     bottom: 0;
  109.     opacity: 0;
  110. transition: all 2s;
  111. width: 1px;
  112. height: 1px;
  113. position: absolute;top:0px; left:0px;
  114. }
  115. .audio:hover{
  116.     opacity: 0;
  117. }
  118. </style>
  119. <style type="text/css">.items  { z-index: 1540;animation: slider 0.26s linear infinite ;}
  120. @keyframes slider {from {opacity: 1;filter:hue-rotate(360deg)contrast(180%)brightness(200%);}
  121. 50% {opacity: 1;}to {opacity: 1;filter:hue-rotate(0deg)contrast(140%)brightness(100%);}}
  122. </style>

  123. <style type="text/css">.items1  { animation: slider1 1s linear infinite ;}
  124. @keyframes slider1 {from {opacity: 1;filter:hue-rotate(360deg)contrast(100%)brightness(80%);}
  125. to {opacity: 1;filter:hue-rotate(0deg)contrast(100%)brightness(100%);}}
  126. </style>
  127. <script >var lrc = `[00:00] ;
  128. function $(id) {return document.getElementById(id);
  129. }//这样写以后getid方便
  130. function getLrcArray() {
  131.     var parts = lrc.split("\n");
  132.     for (let index = 0; index < parts.length; index++) {
  133.         parts[index] = getLrcObj(parts[index]);
  134.     }
  135.     return parts;

  136.     function getLrcObj(content) {
  137.         var twoParts = content.split("]");
  138.         var time = twoParts[0].substr(1);
  139.         var timeParts = time.split(":");
  140.         var seconds = +timeParts[1];
  141.         var min = +timeParts[0];
  142.         seconds = min * 60 + seconds;
  143.         var words = twoParts[1];
  144.         return{
  145.             seconds: seconds,
  146.             words: words,
  147.         };
  148.     }
  149. }

  150. var lrcArray = getLrcArray();

  151. function inputLrc() {
  152.     for (let index = 0; index < lrcArray.length; index++) {
  153.         var li = document.createElement("li");
  154.         li.innerText = lrcArray[index].words;
  155.         $("ullrc").appendChild(li);
  156.     }
  157. }

  158. inputLrc();

  159. function setPosition() {
  160.     var index = getLrcIndex();
  161.     if (index == -1) {
  162.         return;
  163.     }
  164.     var lrc_li_height = 80, lrc_ul_height = 90;
  165.     var top = index * lrc_li_height + lrc_li_height / 2 - lrc_ul_height / 2;
  166.     if (top < 0) {
  167.         top = 0;
  168.     }
  169.     $("ullrc").style.marginTop = -top + "px";
  170.     var activeLi = $("ullrc").querySelector(".active");
  171.     if(activeLi){
  172.         activeLi.classList.remove("active");
  173.     }
  174.     $("ullrc").children[index].classList.add("active");
  175. }

  176. var turn = 0;

  177. function getLrcIndex(){
  178.     var time = $("MusicPlayer").currentTime + turn;
  179.     for (var index = 0; index < lrcArray.length; index++) {
  180.         if (lrcArray[index].seconds > time) {
  181.             return index - 1;
  182.         }
  183.     }
  184. }

  185. $("MusicPlayer").ontimeupdate = setPosition;
  186. </script>
  187. <script>
  188.         function rbf() {
  189.             var audio = document.getElementById('MusicPlayer');
  190.             var bf=document.getElementById("bf");
  191.             audio.currentTime = 0;
  192.             audio.play();
  193.             bf.innerText="";
  194.         }

  195.         function bf() {
  196.             var audio = document.getElementById('MusicPlayer');
  197.             var bf=document.getElementById("bf");
  198.             if (audio !== null) {
  199.                 if (audio.paused) {
  200.                     audio.play(); //audio.play();// 这个就是播放  
  201.                     bf.innerText="";
  202.                 } else {
  203.                     audio.pause(); // 这个就是暂停
  204.                     bf.innerText="";
  205.                 }
  206.             }
  207.         }
  208.     </script>
  209. <script type="text/javascript">
  210. var my_audio =document.getElementById("MusicPlayer");my_audio.onended = function(){document.getElementById("aplay").className="";};my_audio.onplaying = function()

  211. {document.getElementById("aplay").className="z360z";};my_audio.onpause = function(){document.getElementById("aplay").className="";};var lyric = parseLyric(songkrc);
  212. </script>
复制代码




评分

1

查看全部评分

点评
回复 使用道具

千年灵狐
开卷有益 雪花精灵 版主勋章 海洋之心 蝴蝶精灵 花漫千山 江湖之上 江湖靓女 音画同行 一生安柠 樱果相依 红狐狸
 楼主| 发表于 2023-8-24 16:46 | 显示全部楼层

这几天琢磨出一个获取音画帖子源代码的法子,和大家分享一下。获取源代码,是为了编辑,把其中的图片和音乐特效替换成自己的,方法如下:

1、鼠标右键点击:查看网页源代码;此时是网页所有的代码,比较混乱。接下来要查找到自己需要的那部分。

2、Ctrl键+F键,是查找,在查找框输入#papa,找到后,把它后面的一段复制下来,粘贴到文本框或是Sublime Text 软件里,然后在前面加一个<style>。
把该文件保存为后辍为.html的文件,然后预览。根据自己的需要编辑。
   
如找到后辍为html格式的连接,直接点击打开。然后再重复上述操作,查找源代码,这一次是完整的代码了,全部直接复制粘贴就能编辑了。

@不系之舟  @夜雨  @念风 @聆听雨声  @所有喜欢音画的新手朋友们。

谁还有更好的办法,帖来大家一起分享吧。

评分

1

查看全部评分

点评
回复 使用道具

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|千山论坛

GMT+8, 2024-5-11 04:28

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表