红梅赞(献礼20大)
<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;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>
帖子也是 网格布局入门学习专题的演示实例,全部代码如下:
<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;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>
grid 网格布局相关代码:
一、CSS
#papa { display: grid; grid-template-rows: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr); ... }
#papa > div { border: 0px solid olive; display: grid; position: relative; }
#flag { grid-area: 1 / 1; }
#player { grid-area: 3 / 2; place-items: end center; }
二、HTML代码主干
<div id="papa">
<div id="flag">图片</div>
<div id="player">播放器</div>
</div>
相关解释:
① #flag { grid-area: 1 / 1; }
完整写法应该是:#flag { grid-area: 1 / 1 / span 1 span 1; }
因为默认就是跨一行一列,所以把后面的省略了,建议用完整写法。
② #player { grid-area: 3 / 2; place-items: end center; }
同样道理,grid-area 用了超级简写;place-items,摆放子元素的位置设定,第一个值 end 是垂直方向,底部,第二个值 center 是水平方向,中间。
帖子是简简单单的布局:
在底图上面,做一个九宫格,然后“合并”第一行第一个单元格用来放置红旗,再在第三行第二个单元格“合并”该单元格,用来放置播放器。 马黑黑 发表于 2022-10-16 18:13
相关解释:
① #flag { grid-area: 1 / 1; }
这个得看清楚再做了 马黑黑 发表于 2022-10-16 18:04
帖子也是 网格布局入门学习专题的演示实例,全部代码如下:
谢谢黑黑的代码直接分享,为我们这些不会的人一个学习的机会。{:4_204:} 本帖最后由 梦油 于 2022-10-16 20:14 编辑
祝贺中国共产党第二十次全国代表大会的胜利召开。
黑黑朋友制图温馨,辛苦了!
梦油 发表于 2022-10-16 20:12
祝贺中国共产党第二十次全国代表大会的胜利召开。
黑黑朋友制图温馨,辛苦了!
{:5_108:} 小辣椒 发表于 2022-10-16 19:50
谢谢黑黑的代码直接分享,为我们这些不会的人一个学习的机会。
{:5_108:} 小辣椒 发表于 2022-10-16 19:48
这个得看清楚再做了
这个应该不难理解,不过相关的课程还是要去细看的
马黑黑 发表于 2022-10-16 20:33
这个应该不难理解,不过相关的课程还是要去细看的
没有仔细看,先套用一个,应景的作业{:4_189:} 马黑黑 发表于 2022-10-16 20:32
套用就是速度快{:4_173:} 小辣椒 发表于 2022-10-16 20:47
套用就是速度快
那也要会,看得懂关键的 马黑黑 发表于 2022-10-16 21:04
那也要会,看得懂关键的
做好仔细看看代码主要去看看你的私房菜那边 小辣椒 发表于 2022-10-16 21:52
做好仔细看看代码主要去看看你的私房菜那边
{:4_190:} 马黑黑 发表于 2022-10-16 18:04
帖子也是 网格布局入门学习专题的演示实例,全部代码如下:
repeat(3, 1fr)表示1fr重复3次,即第一、二、三列均衡划分三个等分。
昨天学习过,又忘了,赶紧复习一下。 马黑黑 发表于 2022-10-16 18:13
相关解释:
① #flag { grid-area: 1 / 1; }
原来只跨一行一列的,还可以这样简写。这个方便,可以直接定位到想要格子里去了。
昨天做帖的时候还在想,如果想要九宫格当中的位置,是否要先写4个空的<div>呢,后来用起始行列和结束行列合并自身来解决的,原来可以这么方便的{:4_173:} 怪不得黑黑说这个里面的东西非常多,这些多出来的东西更方便操作了,真不错{:4_199:} 光忙着看代码了,呵呵,黑黑的帖子做得真好,接帖同祝二十大胜利召开{:4_187:}