未来的底片二(测试新开发canvas播放器)
本帖最后由 马黑黑 于 2024-5-17 12:36 编辑 <br /><br /><style>#mydiv { margin: -60px 0 20px calc(50% - 593px); display: grid; place-items: center; width: 1024px; height: 576px; background: url('https://638183.freep.cn/638183/t24/2/wlddp.jpg') no-repeat center/cover; overflow: hidden; border: 1px solid gray; z-index: 1; position: relative; }
#player { position: absolute; bottom: 0; }
#lrc { position: absolute; top: 20px; }
li-zi { position: absolute; width: 20px; height: 20px; background: purple; }
@keyframes moving { from { opacity: 0; transform: rotate(0) translate(0,0); } to { opacity: 1; transform: rotate(180deg) translate(var(--x0),var(--y0)); } }
</style>
<div id="mydiv">
<audio id="aud" src="https://file.uhsea.com/2405/97ee0ea9b4ad516c0d84543c7dacf3eeFV.mp3" autoplay loop></audio>
<canvas id="player" width="460" height="80"></canvas>
<canvas id="lrc" width="800" height="50"></canvas>
</div>
<script>
var sF = document.createElement('script');
sF.charset = 'utf-8';
sF.src = 'https://638183.freep.cn/638183/web/js2024/canv_lineprog_player.js';
document.body.appendChild(sF);
var all = 120;
for(var i = 0; i < all; i++) {
var lz = document.createElement('li-zi');
var hudu = Math.PI / 180 * 360 / all * i;
var xx = 600 * Math.cos(hudu), yy = 600 * Math.sin(hudu);
var size = Math.random() * 15 + 5;
lz.style.cssText += `
--x0: ${xx}px;
--y0: ${yy}px;
width: ${size}px;
height: ${size}px;
animation: moving ${Math.random() * 20 + 20}s -${Math.random() * 20}s infinite var(--state);
`;
mydiv.prepend(lz);
}
var colors = {track: 'pink', prog: 'white', lrc1: 'snow', lrc2: 'darkred'};
var lrcAr = [ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ];
</script>
本帖最后由 马黑黑 于 2024-5-18 19:32 编辑 <br /><br /><style>
.mum { position: relative; margin: 0; padding: 10px; font: normal 16px/20px Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; color: black; background: rgba(240, 240, 240,.95); box-shadow: 2px 2px 4px gray; border: thick groove lightblue; border-radius: 6px; }
.mum ::selection { background-color: rgba(0,100,100,.35); }
.mum div { margin: 0; padding: 0; }
.mum cl-cd { display: block; position: relative; margin: 0 0 0 50px; padding: 0 0 0 10px; white-space: pre-wrap; overflow-wrap: break-word; border-left: 1px solid silver; }
.mum cl-cd::before { position: absolute; content: attr(data-idx); width: 50px; color: gray; text-align: right; transform: translate(-70px); }
.tRed { color: red; }
.tBlue { color: blue; }
.tGreen { color: green; }
.tDarkRed { color: darkred; }
.tMagenta { color: magenta; }
</style>
<h2>代码</h2>
<div class='mum'>
<cl-cd data-idx="1"><<span class="tDarkRed">style</span>></cl-cd>
<cl-cd data-idx="2"> #mydiv { <span class="tBlue">margin:</span> 20px 0 20px calc(50% - 593px); <span class="tBlue">display:</span> grid; <span class="tBlue">place-items:</span> center; <span class="tBlue">width:</span> 1024px; <span class="tBlue">height:</span> 576px; <span class="tBlue">background:</span> url(<span class="tMagenta">'https://638183.freep.cn/638183/t24/2/wlddp.jpg'</span>) no-repeat center/cover; <span class="tBlue">overflow:</span> hidden; <span class="tBlue">border:</span> 1px solid gray; <span class="tBlue">position:</span> relative; }</cl-cd>
<cl-cd data-idx="3"> #player { <span class="tBlue">position:</span> absolute; <span class="tBlue">bottom:</span> 0; }</cl-cd>
<cl-cd data-idx="4"> #lrc { <span class="tBlue">position:</span> absolute; <span class="tBlue">top:</span> 20px; }</cl-cd>
<cl-cd data-idx="5"> li-zi { <span class="tBlue">position:</span> absolute; <span class="tBlue">width:</span> 20px; <span class="tBlue">height:</span> 20px; <span class="tBlue">background:</span> purple; }</cl-cd>
<cl-cd data-idx="6"> @keyframes moving { from { <span class="tBlue">opacity:</span> 0; <span class="tBlue">transform:</span> rotate(0) translate(0,0); } to { <span class="tBlue">opacity:</span> 1; <span class="tBlue">transform:</span> rotate(180deg) translate(<span class="tBlue">var</span>(--x0),<span class="tBlue">var</span>(--y0)); } }</cl-cd>
<cl-cd data-idx="7"><<span class="tDarkRed">/style</span>></cl-cd>
<cl-cd data-idx="8"> </cl-cd>
<cl-cd data-idx="9"><<span class="tDarkRed">div</span> <span class="tRed">id</span>=<span class="tMagenta">"mydiv"</span>></cl-cd>
<cl-cd data-idx="10"> <span class="tGreen"><!-- 两个canvas各司其职,<span class="tRed">id</span>唯一,尺寸自设,布局定位使用CSS设置; audio <span class="tRed">id</span>唯一 --></span></cl-cd>
<cl-cd data-idx="11"> <<span class="tDarkRed">audio</span> <span class="tRed">id</span>=<span class="tMagenta">"aud"</span> src=<span class="tMagenta">"https://file.uhsea.com/2405/97ee0ea9b4ad516c0d84543c7dacf3eeFV.mp3"</span> autoplay loop><<span class="tDarkRed">/audio</span>></cl-cd>
<cl-cd data-idx="12"> <<span class="tDarkRed">canvas</span> <span class="tRed">id</span>=<span class="tMagenta">"player"</span> width=<span class="tMagenta">"460"</span> height=<span class="tMagenta">"80"</span>><<span class="tDarkRed">/canvas</span>></cl-cd>
<cl-cd data-idx="13"> <<span class="tDarkRed">canvas</span> <span class="tRed">id</span>=<span class="tMagenta">"lrc"</span> width=<span class="tMagenta">"800"</span> height=<span class="tMagenta">"50"</span>><<span class="tDarkRed">/canvas</span>></cl-cd>
<cl-cd data-idx="14"><<span class="tDarkRed">/div</span>></cl-cd>
<cl-cd data-idx="15"> </cl-cd>
<cl-cd data-idx="16"><<span class="tDarkRed">script</span>></cl-cd>
<cl-cd data-idx="17"> <span class="tBlue">var</span> sF = <span class="tRed">document</span>.createElement(<span class="tMagenta">'script'</span>);</cl-cd>
<cl-cd data-idx="18"> sF.charset = <span class="tMagenta">'utf-8'</span>;</cl-cd>
<cl-cd data-idx="19"> sF.src = <span class="tMagenta">'https://638183.freep.cn/638183/web/js2024/canv_lineprog_player.js'</span>;</cl-cd>
<cl-cd data-idx="20"> <span class="tRed">document</span>.body.appendChild(sF);</cl-cd>
<cl-cd data-idx="21"> <span class="tGreen">//html粒子</span></cl-cd>
<cl-cd data-idx="22"> <span class="tBlue">var</span> all = 120;</cl-cd>
<cl-cd data-idx="23"> <span class="tBlue">for</span>(<span class="tBlue">var</span> i = 0; i < all; i++) {</cl-cd>
<cl-cd data-idx="24"> <span class="tBlue">var</span> lz = <span class="tRed">document</span>.createElement(<span class="tMagenta">'li-zi'</span>);</cl-cd>
<cl-cd data-idx="25"> <span class="tBlue">var</span> hudu = <span class="tRed">Math</span>.PI / 180 * 360 / all * i;</cl-cd>
<cl-cd data-idx="26"> <span class="tBlue">var</span> xx = 600 * <span class="tRed">Math</span>.cos(hudu), yy = 600 * <span class="tRed">Math</span>.sin(hudu);</cl-cd>
<cl-cd data-idx="27"> <span class="tBlue">var</span> size = <span class="tRed">Math</span>.random() * 15 + 5;</cl-cd>
<cl-cd data-idx="28"> lz.style.cssText += `</cl-cd>
<cl-cd data-idx="29"> --x0: ${xx}px;</cl-cd>
<cl-cd data-idx="30"> --y0: ${yy}px;</cl-cd>
<cl-cd data-idx="31"> <span class="tBlue">width:</span> ${size}px;</cl-cd>
<cl-cd data-idx="32"> <span class="tBlue">height:</span> ${size}px;</cl-cd>
<cl-cd data-idx="33"> <span class="tBlue">animation:</span> moving ${<span class="tRed">Math</span>.random() * 20 + 20}s -${<span class="tRed">Math</span>.random() * 20}s infinite <span class="tBlue">var</span>(--state);</cl-cd>
<cl-cd data-idx="34"> `;</cl-cd>
<cl-cd data-idx="35"> mydiv.prepend(lz);</cl-cd>
<cl-cd data-idx="36"> }</cl-cd>
<cl-cd data-idx="37"> <span class="tGreen">//播放器配置 track - 进度条底色; prog - 进度条、滑块、文本颜色; lrc1、lrc2 - 歌词渐变色</span></cl-cd>
<cl-cd data-idx="38"> <span class="tBlue">var</span> colors = {<span class="tBlue">track:</span> <span class="tMagenta">'pink'</span>, <span class="tBlue">prog:</span> <span class="tMagenta">'white'</span>, lrc1: <span class="tMagenta">'snow'</span>, lrc2: <span class="tMagenta">'darkred'</span>};</cl-cd>
<cl-cd data-idx="39"> <span class="tGreen">//歌词 lrcAr 名称唯一</span></cl-cd>
<cl-cd data-idx="40"> <span class="tBlue">var</span> lrcAr = [ , , ];</cl-cd>
<cl-cd data-idx="41"><<span class="tDarkRed">/script</span>></cl-cd>
</div>
本帖最后由 马黑黑 于 2024-5-17 21:48 编辑
这个canvas画布播放器分两个独立的部分:
一是带进度条的播放控制器。canvas 要求 id="player",在帖子中的定位使用CSS设置(代码第 3 行),宽高尺寸在HTML中设置(代码 12 行),主要设置宽度,可以根据需要设置,注意不要太短否则里面的元素会重叠。
二是歌词UI。定位于宽高设置原理和方法同上,应根据歌词文本的最大长度设置 id="lrc" 的canvas画布的宽度(代码第 13 行)。
这两个画布标签的 id 不能更改。
关于元素的 id,audio 标签的 id 约定为 id="aud",这是播放器实现功能的重要依赖。
如果帖子有视频且需要播放器顺带同步管理视频的播放暂停,则要求视频的 class="vid",酱紫就可以了。
帖子容器id不论,也无需提供。
播放器的配置:
两个变量——
(一)colors : 代码在第 38 行,主要配置颜色,详情看对应的代码注释;
(二)lrcAr : 代码在第 40 行,给播放器提供 lrc 歌词,支持的歌词格式是花潮lrc歌词格式。
播放器的两个配置可以缺省,这意味着使用默认的颜色配置、无歌词同步但有免费广告。
其他:
发纯音乐帖也可以使用这个准插件。lrcAr 配置建议如下:
var lrcAr = [ , ];
这将在lrc UI区域显示一下帖子的标题,然后就没有文字,直至重新播放音频。
粉紫色效果绝美,白老师,这个粒子形状好像没有裁~
小播和歌词打包封在一起了,且可以更改参数……
画布把这两个整一起是不是更难一些……
运行十分流畅,很高级的感觉…… 南无月 发表于 2024-5-17 12:50
粉紫色效果绝美,白老师,这个粒子形状好像没有裁~
底片效果 南无月 发表于 2024-5-17 12:54
小播和歌词打包封在一起了,且可以更改参数……
画布把这两个整一起是不是更难一些……
运行十分流畅,很 ...
性能可以的 挺漂亮的,我喜欢紫色。 愤怒的葡萄 发表于 2024-5-17 13:28
挺漂亮的,我喜欢紫色。
紫色虽好,却是最难处理的颜色之一 很奇妙的效果,这底图用来配这首歌曲,非常贴切呢。欣赏黑黑好帖{:4_199:} 把粒子和歌词整合到一起了。厉害。
这个歌词同步没有逐字的颜色变化了呢。进度条上的调整十分流畅。
漂亮的制作{:4_187:} 黑黑的帖子配色十分棒,这里的颜色设计很和谐{:4_204:} 马黑黑 发表于 2024-5-17 12:55
底片效果
原来如此,你发午后的那贴已经改了,是最新的代码。已经把配置留出来了。{:4_173:} 马黑黑 发表于 2024-5-17 12:56
性能可以的
很漂亮啊。这个小播细长细长,好苗条的样子 南无月 发表于 2024-5-17 19:43
原来如此,你发午后的那贴已经改了,是最新的代码。已经把配置留出来了。
是滴 南无月 发表于 2024-5-17 19:43
很漂亮啊。这个小播细长细长,好苗条的样子
要根据歌词长度设置一下HTML代码里的 width="800" 的值。将来也许有扩展,现在还没思路。 红影 发表于 2024-5-17 19:17
黑黑的帖子配色十分棒,这里的颜色设计很和谐
紫色是最不好拿捏的 红影 发表于 2024-5-17 19:16
把粒子和歌词整合到一起了。厉害。
这个歌词同步没有逐字的颜色变化了呢。进度条上的调整十分流畅。
漂亮 ...
画布做那个同步模拟的思路还木有,先酱紫 红影 发表于 2024-5-17 19:15
很奇妙的效果,这底图用来配这首歌曲,非常贴切呢。欣赏黑黑好帖
果酱果酱 马黑黑 发表于 2024-5-17 19:44
是滴
{:4_199:}所以,可以不叫测试了吧