|
|

楼主 |
发表于 2022-10-16 18:04
|
显示全部楼层
帖子也是 网格布局入门学习专题的演示实例,全部代码如下:
- <style>
- #papa { left: -214px; display: grid; grid-template-rows: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr); width: 1024px; height: 640px; background: pink url('https://638183.freep.cn/638183/t22/webp/hsmw.webp') no-repeat center/cover; box-shadow: 3px 3px 20px #000; user-select: none; position: relative; z-index: 1; }
- #papa > div { border: 0px solid olive; display: grid; position: relative; }
- #flag { grid-area: 1 / 1; }
- #player { grid-area: 3 / 2; place-items: end center; }
- #btnwrap { fill: pink; cursor: pointer; }
- #btnwrap:hover { fill: darkred; }
- #tmsg { fill: tan; stroke: pink; stroke-width: 1px; font: normal 1em sans-serif; }
- </style>
- <div id="papa">
- <div id="flag"><img src="https://638183.freep.cn/638183/t22/hl/flag.gif" alt="" style="width: 200px; mix-blend-mode: screen;" /></div>
- <div id="player">
- <svg id="mplayer" width="120" height="120">
- <g id="mama" transform="rotate(-90, 60, 60)" style="cursor: pointer">
- <circle id="track" cx="60" cy="60" r="50" fill="none" stroke-width="10" stroke="hsla(0,100%,90%,0.95)" />
- <circle id="prog" cx="60" cy="60" r="50" fill="none" stroke-width="10" stroke="hsla(0,100%,40%,0.55)" />
- </g>
- <g id="btnwrap">
- <path id="btnplay" d="M 50 50,50 70,70, 60 z"></path>
- <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>
- <path d="M 57 50,60 50,60 70,57 70 z" fill="transparent" />
- </g>
- <path id="curPath" d="M 20 70 Q 60 0 100 70" fill="none" stroke="none"/>
- <path id="durPath" d="M 20 55 Q 60 110 100 55" fill="none" stroke="none"/>
- <g id="tmsg">
- <text x="34" y="0"><textPath id="curMsg" xlink:href="#curPath" dominant-baseline="text-after-edge">00:00</textPath></text>
- <text x="29" y="0"><textPath id="durMsg" xlink:href="#durPath" dominant-baseline="text-before-edge">00:00</textPath></text>
- </g>
- </svg>
- </div>
- </div>
- <script>
- let aud = new Audio(), cc = {x: 1*track.getAttribute('cx'),y: 1*track.getAttribute('cy'),len: track.getTotalLength(),};
- prog.style.strokeDasharray = prog.style.strokeDashoffset =cc.len;
- papa.oncontextmenu = () => false;
- aud.src = 'http://www.kumeiwp.com/sub/filestores/2022/03/30/21e538cb3926d7e68a5abb0444dbe73b.mp3';
- aud.autoplay = true;
- aud.loop = true;
- 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;};
- btnwrap.onclick = () => aud.paused ? aud.play() : aud.pause();
- aud.addEventListener('pause', () => mState());
- aud.addEventListener('play', () => mState());
- aud.addEventListener('seeked', () => aud.play());
- aud.addEventListener('timeupdate', () => {prog.style.strokeDashoffset = cc.len - cc.len * aud.currentTime / aud.duration;curMsg.textContent = toMin(aud.currentTime);durMsg.textContent = toMin(aud.duration);});
- let mState = () => aud.paused ? (btnplay.style.display = 'block', btnpause.style.display = 'none') : (btnplay.style.display = 'none', btnpause.style.display = 'block');
- let showLrc = (time) => {lrc.style.animation = (mFlag ? 'bgMove1 ' : 'bgMove2 ') + time + 's linear forwards';lrc.innerHTML = lrcAr[mKey][1];mKey += 1;mFlag = !mFlag;}
- 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;}
- </script>
复制代码
|
|