马黑黑 发表于 2022-9-11 20:22

给小辣椒做一个小巧的播放器

<style>
#papa { left: -214px; width: 1024px; height: 640px; background: transparent; display: grid; place-items: center;box-shadow: 3px 3px 20px #000; position: relative; z-index: 1; }
#mplayer { position: absolute; bottom: 4px; width: 240px; height: 80px; user-select: none; display: grid; place-items: center; cursor: pointer; }
#mplayer:hover #btnwrap, #mplayer:hover #prog { transform: translateY(var(--yy)); }
#mplayer:hover #btnwrap { background: linear-gradient(to top right, snow, green); }
#btnwrap, #prog { position: absolute;         display: grid; place-items: center;transition: .5s; }
#btnwrap { --yy: -15px; width: 40px; height: 40px; border-radius: 50%; border: 4px solid pink; }
#btnplay { width: 20px; height: 20px; background: #eee; clip-path: polygon(0 0, 0% 100%, 100% 50%); }
#btnpause { width: 2px; height: 20px; border-style: solid; border-width: 0px 4px; border-color: transparent #eee; display: none; }
#prog { --yy: 20px; width: 240px; height: 20px; border-radius: 10px; background: linear-gradient(90deg, rgba(255,0,0,.45), rgba(0,255,0,.35) 70%, transparent 0); border: 1px solid pink; font: normal 14px sans-serif; color: purple; }
#s_svg { position: absolute; width: 400px; height: 50px;left: 0px; top: 10px; animation: move 12s linear infinite alternate;}
#lrc { text-anchor: middle; dominant-baseline: middle; font: bold 2em sans-serif; fill: none; stroke: red; }
@keyframes move { to {left: 624px;} }
</style>

<div id="papa">
        <div id="mplayer">
                <div id="btnwrap"><span id="btnplay"></span><span id="btnpause"></span></div>
                <div id="prog">00:00 | 00:00</div>
        </div>
        <svg id="s_svg"><text id="lrc" x="50%" y="50%">lrc歌词</text></svg>
</div>

<script>
let lrcAr = [
        ['0.00','月亮啊月亮'],
        ['180.00','感谢支持']
];
let aud = new Audio();
aud.src = 'http://www.kumeiwp.com/sub/filestores/2022/08/29/4ff9b3d04e7ae8f20d90a52cefb99595.mp3';
aud.autoplay = true;
aud.loop = true;
btnwrap.onclick = () => aud.paused ? aud.play() : aud.pause();
prog.onclick = (e) => aud.currentTime = aud.duration * e.offsetX / prog.offsetWidth;
aud.addEventListener('pause', () => btnstate());
aud.addEventListener('play',() => btnstate());
aud.addEventListener('timeupdate', () => {
        prog.style.background= 'linear-gradient(90deg, rgba(255,0,0,.45), rgba(0,255,0,.35) ' + aud.currentTime / aud.duration * 100 + '%, transparent 0)';//prog.offsetWidth * aud.currentTime / aud.duration) + 'px 0px';
        prog.innerText = toMin(aud.currentTime) + ' | ' + toMin(aud.duration);
        for(j=0; j<lrcAr.length; j++) {
                if(aud.currentTime >= lrcAr) lrc.textContent = lrcAr;
        }
});
let btnstate = () => aud.paused ? (btnplay.style.display = 'block', btnpause.style.display = 'none') : (btnplay.style.display = 'none', btnpause.style.display = 'block');
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>

马黑黑 发表于 2022-9-11 20:22

代码:
<style>
#papa { margin: auto; width: 1024px; height: 640px; background: transparent; display: grid; place-items: center;box-shadow: 3px 3px 20px #000; position: relative; z-index: 1; }
#mplayer { position: absolute; bottom: 4px; width: 240px; height: 80px; user-select: none; display: grid; place-items: center; cursor: pointer; }
#mplayer:hover #btnwrap, #mplayer:hover #prog { transform: translateY(var(--yy)); }
#mplayer:hover #btnwrap { background: linear-gradient(to top right, snow, green); }
#btnwrap, #prog { position: absolute;         display: grid; place-items: center;transition: .5s; }
#btnwrap { --yy: -15px; width: 40px; height: 40px; border-radius: 50%; border: 4px solid pink; }
#btnplay { width: 20px; height: 20px; background: #eee; clip-path: polygon(0 0, 0% 100%, 100% 50%); }
#btnpause { width: 2px; height: 20px; border-style: solid; border-width: 0px 4px; border-color: transparent #eee; display: none; }
#prog { --yy: 20px; width: 240px; height: 20px; border-radius: 10px; background: linear-gradient(90deg, rgba(255,0,0,.45), rgba(0,255,0,.35) 70%, transparent 0); border: 1px solid pink; font: normal 14px sans-serif; color: purple; }
#s_svg { position: absolute; width: 400px; height: 50px;left: 0px; top: 10px; animation: move 12s linear infinite alternate;}
#lrc { text-anchor: middle; dominant-baseline: middle; font: bold 2em sans-serif; fill: none; stroke: red; }
@keyframes move { to {left: 624px;} }
</style>

<div id="papa">
        <div id="mplayer">
                <div id="btnwrap"><span id="btnplay"></span><span id="btnpause"></span></div>
                <div id="prog">00:00 | 00:00</div>
        </div>
        <svg id="s_svg"><text id="lrc" x="50%" y="50%">lrc歌词</text></svg>
</div>

<script>
let lrcAr = [
        ['0.00','月亮啊月亮'],
        ['180.00','感谢支持']
];
let aud = new Audio();
aud.src = 'http://www.kumeiwp.com/sub/filestores/2022/08/29/4ff9b3d04e7ae8f20d90a52cefb99595.mp3';
aud.autoplay = true;
aud.loop = true;
btnwrap.onclick = () => aud.paused ? aud.play() : aud.pause();
prog.onclick = (e) => aud.currentTime = aud.duration * e.offsetX / prog.offsetWidth;
aud.addEventListener('pause', () => btnstate());
aud.addEventListener('play',() => btnstate());
aud.addEventListener('timeupdate', () => {
        prog.style.background= 'linear-gradient(90deg, rgba(255,0,0,.45), rgba(0,255,0,.35) ' + aud.currentTime / aud.duration * 100 + '%, transparent 0)';//prog.offsetWidth * aud.currentTime / aud.duration) + 'px 0px';
        prog.innerText = toMin(aud.currentTime) + ' | ' + toMin(aud.duration);
        for(j=0; j<lrcAr.length; j++) {
                if(aud.currentTime >= lrcAr) lrc.textContent = lrcAr;
        }
});
let btnstate = () => aud.paused ? (btnplay.style.display = 'block', btnpause.style.display = 'none') : (btnplay.style.display = 'none', btnpause.style.display = 'block');
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>

马黑黑 发表于 2022-9-11 20:23

@小辣椒

马黑黑 发表于 2022-9-11 20:34

lrc歌词文本设置在CSS选择器 #lrc 里(12行);如果歌词较长,修改它的父元素CSS选择器 #s_svg 的宽度(11行),如果修改,13行的关键帧动画跟着修改 left 值,公式是 帖子宽度 - #s_svg宽度。

进度条、播放按钮、暂停按钮、装按钮的圆圈,分别对应的选择器是 #prog、#bntplay、#btnpause、btnwrap,所有这些,有 #mplayer 装载,定位播放器可按 left、right ↔ top、bottom 两两配对设置对 mplayer 进行定位。

红影 发表于 2022-9-11 20:51

好看,黑黑真是创意无极限。小辣椒亲爱的快来看黑黑专门创建的新播放器@小辣椒 {:4_187:}

红影 发表于 2022-9-11 20:52

有趣,鼠标移动上去,播放器还能有变化呢,真漂亮{:4_199:}

小辣椒 发表于 2022-9-11 21:10

马黑黑 发表于 2022-9-11 20:23
@小辣椒

来了,太惊喜了{:4_187:}

马黑黑 发表于 2022-9-11 21:11

小辣椒 发表于 2022-9-11 21:10
来了,太惊喜了

不知道中意不

马黑黑 发表于 2022-9-11 21:11

红影 发表于 2022-9-11 20:51
好看,黑黑真是创意无极限。小辣椒亲爱的快来看黑黑专门创建的新播放器@小辣椒

挺好看的吧感觉

马黑黑 发表于 2022-9-11 21:12

红影 发表于 2022-9-11 20:52
有趣,鼠标移动上去,播放器还能有变化呢,真漂亮

要分开才能操作播放暂停按钮

小辣椒 发表于 2022-9-11 21:14

哇瑟,预览了一下,这个进度条会移动{:4_178:}

小辣椒 发表于 2022-9-11 21:14

谢谢黑神,好喜欢的播放器{:4_178:}

小辣椒 发表于 2022-9-11 21:16

这个播放器先好好仔细看看,得慢慢来做个图玩一下。

小辣椒 发表于 2022-9-11 21:16

谢谢黑黑,小辣椒的专用播放器了{:4_170:}

马黑黑 发表于 2022-9-11 21:17

小辣椒 发表于 2022-9-11 21:16
谢谢黑黑,小辣椒的专用播放器了

{:4_181:}

小辣椒 发表于 2022-9-11 21:18

马黑黑 发表于 2022-9-11 21:11
不知道中意不

哈哈,肯定喜欢的,这么漂亮{:4_178:}

马黑黑 发表于 2022-9-11 21:19

小辣椒 发表于 2022-9-11 21:18
哈哈,肯定喜欢的,这么漂亮

看着有点朴素

小辣椒 发表于 2022-9-11 21:21

马黑黑 发表于 2022-9-11 21:19
看着有点朴素

是在想应该配怎么样的颜色背景图图

小辣椒 发表于 2022-9-11 21:35

红影 发表于 2022-9-11 20:51
好看,黑黑真是创意无极限。小辣椒亲爱的快来看黑黑专门创建的新播放器@小辣椒
亲爱的,我们一起玩。。。。

小辣椒 发表于 2022-9-11 21:43

马黑黑 发表于 2022-9-11 21:17


再次谢谢黑大神,今天收获太大了,刚才还想不上来的,哈哈~~~被骂也是值得了{:4_170:}

先下了
页: [1] 2 3 4
查看完整版本: 给小辣椒做一个小巧的播放器