马黑黑 发表于 2022-10-19 07:14

秋水无恙

<style>
#papa { left: -214px; width: 1024px; height: 640px; background: silver url('https://638183.freep.cn/638183/t22/webp/quwy.webp') no-repeat center/cover; box-shadow: 3px 3px 20px #000; position: relative; display: grid; grid-template-rows: repeat(2, 4fr) 1fr; grid-template-columns: repeat(3, 1fr); grid-template-areas: '. . top' 'mid mid mid' 'foot foot foot'; user-select: none; z-index: 1; }
#papa > div { position: relative; display: grid; }
.pTop { grid-area: top; place-items: end start; }
.pMid { grid-area: mid; place-items: end center; }
.pFoot { grid-area: foot; place-items: center; }
#mplayer { position: absolute; width: 400px; height: 60px; font: normal 14px sans-serif; z-index: 9; }
#mplayer::before, #mplayer::after { position: absolute; width: 100%; height: 50%; color: snow; margin: 15px 0; }
#mplayer::before { content: attr(data-cur); }
#mplayer::after { content: attr(data-dur); text-align: right; }
#btnplay { position: absolute; left: calc(50% - 15px); bottom: 25px; width: 30px; height: 30px; border-radius: 50%; background: green url('https://638183.freep.cn/638183/t22/webp/lotus.webp') no-repeat; cursor: pointer; z-index: 2; animation: rot linear 4s infinite; }
#prog { --posX: 0px; position: absolute; bottom: 10px; width: 100%; height: 1px; background: #eee; cursor: pointer; }
#prog::before, #prog::after { position: absolute; content: ''; left: 0; }
#prog::before { width: var(--posX); height: 1px; background: red; }
#prog::after { left: var(--posX); top: calc(50% - 5px); width: 3px; height: 10px; background: silver; }
#tit { position: absolute; bottom: 20px; right: 30px; font: bold 3em sans-serif; color: snow; text-shadow: 2px 2px 3px #212121; }
#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)); }
#lrc::before { position: absolute; content: attr(data-lrc); width: 20%; height: 100%; color: transparent; overflow: hidden; white-space: nowrap; background: linear-gradient(180deg,hsla(120,30%,50%,.75),hsla(120,100%,50%,.65)); 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="papa">
        <div class="pTop"><img src="https://638183.freep.cn/638183/t22/webp/bird5.gif" alt="" style="mix-blend-mode: multiply;" /></div>
        <div class="pMid"><span id="lrc" data-lrc="花潮论坛lrc在线">花潮论坛lrc在线</span></div>
        <div class="pFoot">
                <div id="mplayer" data-cur="00:00" data-dur="00:00"><span id="prog"></span><span id="btnplay"></span></div>
        </div>
</div>

<script>
(function() {
        let mKey = 0, mFlag = true, aud = new Audio();
        aud.src = 'http://www.kumeiwp.com/sub/filestores/2022/10/18/dbd937aed7a3070a1826bf4040426e11.mp3';
        let lrcAr = [ , , , , , , , , , , , , , , , , , , , , , , , , , , , , ];
        aud.autoplay = true;
        aud.loop = true;
        if (aud.paused) btnplay.style.animationPlayState = 'paused';
        btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();
        mplayer.onmousemove = (e) => {mplayer.style.cursor = e.offsetY > mplayer.offsetHeight / 1.5 ? 'pointer' : 'default';}
        mplayer.onclick = (e) => {if (e.offsetY > mplayer.offsetHeight / 1.5) aud.currentTime = aud.duration * e.offsetX / prog.offsetWidth;}
        aud.addEventListener('pause', () => mState());
        aud.addEventListener('play', () => mState());
        aud.addEventListener('seeked', () => calcKey());
        aud.addEventListener('timeupdate', () => {prog.style.setProperty('--posX', prog.offsetWidth * aud.currentTime / aud.duration + 'px');mplayer.dataset.cur = toMin(aud.currentTime);mplayer.dataset.dur = toMin(aud.duration);for (j = 0; j < lrcAr.length; j++) {if (aud.currentTime >= lrcAr) {if (mKey === j) showLrc(lrcAr);else continue;}}});
        let mState = () => aud.paused ? (btnplay.style.animationPlayState = 'paused', lrc.style.setProperty('--state', 'paused')) : (btnplay.style.animationPlayState = 'running', lrc.style.setProperty('--state', 'running'));
        let showLrc = (time) => {let name = mFlag ? 'cover1' : 'cover2';lrc.innerHTML = lrc.dataset.lrc = lrcAr;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 < lrcAr.length; j ++) {if(aud.currentTime <= lrcAr) {mKey = j - 1;break;}}if(mKey <0) mKey = 0;if(mKey > lrcAr.length - 1) mKey = lrcAr.length - 1;let time = lrcAr - (aud.currentTime - lrcAr);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; };
        papa.oncontextmenu = () => false;
})();
</script>

马黑黑 发表于 2022-10-19 07:19

参考代码
<style>
#papa { margin: auto; width: 1024px; height: 640px; background: silver url('https://638183.freep.cn/638183/t22/webp/quwy.webp') no-repeat center/cover; box-shadow: 3px 3px 20px #000; position: relative; display: grid; grid-template-rows: repeat(2, 4fr) 1fr; grid-template-columns: repeat(3, 1fr); grid-template-areas: '. . top' 'mid mid mid' 'foot foot foot'; user-select: none; z-index: 1; }
#papa > div { position: relative; display: grid; }
.pTop { grid-area: top; place-items: end start; }
.pMid { grid-area: mid; place-items: end center; }
.pFoot { grid-area: foot; place-items: center; }
#mplayer { position: absolute; width: 400px; height: 60px; font: normal 14px sans-serif; z-index: 9; }
#mplayer::before, #mplayer::after { position: absolute; width: 100%; height: 50%; color: snow; margin: 15px 0; }
#mplayer::before { content: attr(data-cur); }
#mplayer::after { content: attr(data-dur); text-align: right; }
#btnplay { position: absolute; left: calc(50% - 15px); bottom: 25px; width: 30px; height: 30px; border-radius: 50%; background: green url('https://638183.freep.cn/638183/t22/webp/lotus.webp') no-repeat; cursor: pointer; z-index: 2; animation: rot linear 4s infinite; }
#prog { --posX: 0px; position: absolute; bottom: 10px; width: 100%; height: 1px; background: #eee; cursor: pointer; }
#prog::before, #prog::after { position: absolute; content: ''; left: 0; }
#prog::before { width: var(--posX); height: 1px; background: red; }
#prog::after { left: var(--posX); top: calc(50% - 5px); width: 3px; height: 10px; background: silver; }
#tit { position: absolute; bottom: 20px; right: 30px; font: bold 3em sans-serif; color: snow; text-shadow: 2px 2px 3px #212121; }
#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)); }
#lrc::before { position: absolute; content: attr(data-lrc); width: 20%; height: 100%; color: transparent; overflow: hidden; white-space: nowrap; background: linear-gradient(180deg,hsla(120,30%,50%,.75),hsla(120,100%,50%,.65)); 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="papa">
        <div class="pTop"><img src="https://638183.freep.cn/638183/t22/webp/bird5.gif" alt="" style="mix-blend-mode: multiply;" /></div>
        <div class="pMid"><span id="lrc" data-lrc="花潮论坛lrc在线">花潮论坛lrc在线</span></div>
        <div class="pFoot">
                <div id="mplayer" data-cur="00:00" data-dur="00:00"><span id="prog"></span><span id="btnplay"></span></div>
        </div>
</div>

<script>
(function() {
        let mKey = 0, mFlag = true, aud = new Audio();
        aud.src = 'http://www.kumeiwp.com/sub/filestores/2022/10/18/dbd937aed7a3070a1826bf4040426e11.mp3';
        let lrcAr = [ , , , , , , , , , , , , , , , , , , , , , , , , , , , , ];
        aud.autoplay = true;
        aud.loop = true;
        if (aud.paused) btnplay.style.animationPlayState = 'paused';
        btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();
        mplayer.onmousemove = (e) => {mplayer.style.cursor = e.offsetY > mplayer.offsetHeight / 1.5 ? 'pointer' : 'default';}
        mplayer.onclick = (e) => {if (e.offsetY > mplayer.offsetHeight / 1.5) aud.currentTime = aud.duration * e.offsetX / prog.offsetWidth;}
        aud.addEventListener('pause', () => mState());
        aud.addEventListener('play', () => mState());
        aud.addEventListener('seeked', () => calcKey());
        aud.addEventListener('timeupdate', () => {prog.style.setProperty('--posX', prog.offsetWidth * aud.currentTime / aud.duration + 'px');mplayer.dataset.cur = toMin(aud.currentTime);mplayer.dataset.dur = toMin(aud.duration);for (j = 0; j < lrcAr.length; j++) {if (aud.currentTime >= lrcAr) {if (mKey === j) showLrc(lrcAr);else continue;}}});
        let mState = () => aud.paused ? (btnplay.style.animationPlayState = 'paused', lrc.style.setProperty('--state', 'paused')) : (btnplay.style.animationPlayState = 'running', lrc.style.setProperty('--state', 'running'));
        let showLrc = (time) => {let name = mFlag ? 'cover1' : 'cover2';lrc.innerHTML = lrc.dataset.lrc = lrcAr;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 < lrcAr.length; j ++) {if(aud.currentTime <= lrcAr) {mKey = j - 1;break;}}if(mKey <0) mKey = 0;if(mKey > lrcAr.length - 1) mKey = lrcAr.length - 1;let time = lrcAr - (aud.currentTime - lrcAr);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; };
        papa.oncontextmenu = () => false;
})();
</script>

马黑黑 发表于 2022-10-19 07:24

本帖最后由 马黑黑 于 2022-10-19 08:02 编辑

仍然是使用 grid 布局将帖子主界面划分以下区域:

#papa {
      display: grid;
      grid-template-rows: repeat(2, 4fr) 1fr;
      grid-template-columns: repeat(3, 1fr);
      grid-template-areas:
                '. . top'
                'mid mid mid'
                'foot foot foot';
}

#papa > div { position: relative; display: grid; }

.pTop { grid-area: top; place-items: end start; }
.pMid { grid-area: mid; place-items: end center; }
.pFoot { grid-area: foot; place-items: center; }

然后将帖子的功能元素放到HTML主干中:

<div id="papa">
      <div class="pTop">图片</div>
      <div class="pMid">歌词</div>
      <div class="pFoot">播放器</div>
</div>

马黑黑 发表于 2022-10-19 07:40

本帖最后由 马黑黑 于 2022-10-19 08:00 编辑

播放器控制暂停/播放的按钮,是一个圆形元素上面加一个背景图片。背景图片可以是任意图片,甚至可以是帖子的背景图片。之前的光盘按钮,用的是角向渐变,我们用图片替换它即可。本帖圆形按钮所用图片如下:

https://638183.freep.cn/638183/t22/webp/lotus.webp

可以看到,这里我只用了图片的很小的一部分,默认用了左上角{0~30,0~30}部分,没有用完全图。本帖background定义背景图的语句:

background: green url('https://638183.freep.cn/638183/t22/webp/lotus.webp') no-repeat;

一个简简单单的 no-repeat 参数而已,禁止背景图重复,只出现一次,当然不禁止也行,因为Ann比图片小多了;然后就是,元素有多大,图片就以相应的尺寸做它的背景,而不会是全幅图片。

background对 url('图片') 还可以做很多操作,比方说,你中意上面这张图片比较中间的部分,可以通过加入其它参数“剪裁”图片:

background: green url('图片') no-repeat -30px-35px;

这将从图片的 xy坐标 {30,35} 处开始截取图片,元素是30*30,则截取图片上的 x = 30至60、y = 35至65 区域的图案。

马黑黑 发表于 2022-10-19 07:46

      grid-template-rows: repeat(2, 4fr) 1fr;
      grid-template-columns: repeat(3, 1fr);

上面两句,grid-template-rows 一句,将帖子区域垂直方向分为三行、9等分,第一二行各占4个等分单位,第三行占1个等分;第二句,grid-template-columns,将帖子区域水平方向分为三列、3等分,每列各占1等分。

红影 发表于 2022-10-19 08:57

马黑黑 发表于 2022-10-19 07:46
grid-template-rows: repeat(2, 4fr) 1fr;
      grid-template-columns: repeat(3, 1fr);



现在这布局能明白了。行那句也可以写成grid-template-rows: 4fr 4fr 1fr;的吧。这个并列排布只要用空格隔开来就行了,repeat里的要用小逗号隔开。记得行列间距若都设置,也是空格隔开的。
借帖子,边欣赏,边学习和复习{:4_173:}

红影 发表于 2022-10-19 09:32

马黑黑 发表于 2022-10-19 07:40
播放器控制暂停/播放的按钮,是一个圆形元素上面加一个背景图片。背景图片可以是任意图片,甚至可以是帖子 ...

background: green url('图片') no-repeat -30px-35px;
这个都是要用负值的么?这种取任意位置的方式也有趣,倒是很方便的呢。

红影 发表于 2022-10-19 09:32

还以为那按钮又是特殊符号,原来是一片荷叶{:4_173:}

红影 发表于 2022-10-19 09:35

那个动图以为只有跳跃的音符,再仔细看,原来有两只小鸟{:4_173:}

红影 发表于 2022-10-19 09:39

歌曲好听,古风味的歌词特别有滋味。秋荷的图片也好看,跟歌曲倒是很相合呢{:4_199:}

梦油 发表于 2022-10-19 11:28

欣赏佳作,问候黑黑。

醉美水芙蓉 发表于 2022-10-19 11:49

马黑黑 发表于 2022-10-19 12:11

醉美水芙蓉 发表于 2022-10-19 11:49
黑黑老师的设计的好漂亮啊!

一般般

马黑黑 发表于 2022-10-19 12:11

梦油 发表于 2022-10-19 11:28
欣赏佳作,问候黑黑。

中午好

马黑黑 发表于 2022-10-19 12:12

红影 发表于 2022-10-19 08:57
现在这布局能明白了。行那句也可以写成grid-template-rows: 4fr 4fr 1fr;的吧。这个并列排布只要用空格隔 ...

都可以,绝对哪种上手或方便就用哪一种写法。至于空格和逗号,最好能记下来,记不准也没关系:实际使用时不对了再换种方式

马黑黑 发表于 2022-10-19 12:13

红影 发表于 2022-10-19 09:35
那个动图以为只有跳跃的音符,再仔细看,原来有两只小鸟

它们与荷叶差不多融为一体了

马黑黑 发表于 2022-10-19 12:14

红影 发表于 2022-10-19 09:39
歌曲好听,古风味的歌词特别有滋味。秋荷的图片也好看,跟歌曲倒是很相合呢

词曲都极有力道,演唱火候略欠

加林森 发表于 2022-10-19 12:25

小巧灵动。漂亮的制作!{:4_199:}

马黑黑 发表于 2022-10-19 12:38

加林森 发表于 2022-10-19 12:25
小巧灵动。漂亮的制作!

感谢队长支持

加林森 发表于 2022-10-19 12:40

马黑黑 发表于 2022-10-19 12:38
感谢队长支持

我还得继续去学习才行。
页: [1] 2 3 4 5
查看完整版本: 秋水无恙