月下舞者
<style>#papa { margin: 20px 0 20px calc(50% - 581px); width: 1000px; height: 600px; background: lightblue; box-shadow: 3px 3px 6px gray; z-index: 1; overflow: hidden; user-select: none; display: grid; place-items: center; position: relative; }
.vid { position: absolute; width: 100%; height: 100%; object-fit: cover; }
.vid:nth-of-type(2) { mix-blend-mode: screen; }
.vid:nth-of-type(3) { width: 160px; height: 160px; right: 0; top: 0; border-radius: 50% 0 50% 50%; cursor: pointer; }
</style>
<div id="papa">
<audio id="aud" src="https://music.163.com/song/media/outer/url?id=2154869910" autoplay loop></audio>
<video class="vid" src="https://img.tukuppt.com/video_show/2419216/00/01/98/5b5459ad8a034.mp4" poster="https://638183.freep.cn/638183/t23/1/qbui.jpg" disablePictureInPicture loop muted></video>
<video class="vid" src="https://img.tukuppt.com/video_show/2418175/00/18/65/5eef9970142b6.mp4" disablePictureInPicture loop muted></video>
<video class="vid" id="player" src="https://img.tukuppt.com/video_show/2475824/00/08/20/5d19984aa5b7c.mp4" poster="https://638183.freep.cn/638183/small/f01.png" title="播放/暂停" disablePictureInPicture loop muted></video>
</div>
<script>
var sF = document.createElement('script');
sF.charset = 'UTF-8';
sF.src = 'https://638183.freep.cn/638183/web/js2024/lrc_only.js';
document.body.appendChild(sF);
sF.onload = () => {
LRC({
papa: '#papa',
lrc_css: 'top: 20px; color: lightblue; --bg: linear-gradient(rgba(0,0,128,.2), rgba(0,0,255,.6))',
lrcAr: geci,
btn: '#player'
});
aud.onplaying = aud.onpause = () => mState();
player.onclick = () => aud.paused ? aud.play() : aud.pause();
};
var mState = () => {
let vids = papa.querySelectorAll('video');
vids.forEach(vid => aud.paused ? vid.pause() : vid.play());
papa.style.setProperty('--state', aud.paused ? 'paused' : 'running');
};
papa.oncontextmenu = (e) => e.preventDefault();
var geci = [ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ];
</script>
本帖最后由 马黑黑 于 2024-5-15 09:13 编辑 <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>
<p>lrc_only.js插件有重要更新(主要解决歌词同步失准问题),此前观赏过《小池塘》一帖的朋友需要按 Ctrl+F5 硬刷新一下。</p>
<p><br></p>
<p>帖子构思:使用两个视频做帖子的背景,其中舞者视频使用 mix-blend-mode: screen 进行融合;使用一个视频做音频播放控制器,布置在右上角是为了挡住背景视频的水印。帖子需要容器元素(此帖为 id="papa" 的 div,视频及歌词UI等元素均装在其中。</p>
<p><br></p>
<p>视频中有两个带有 poster 属性,用于不支持自动播放或视频加载速度偏慢时展示广告图片。</p>
<h2>帖子核心代码</h2>
<div class='mum'>
<cl-cd data-idx="1"><<span class="tDarkRed">style</span>></cl-cd>
<cl-cd data-idx="2"> #papa { <span class="tBlue">margin:</span> 20px 0 20px calc(50% - 581px); <span class="tBlue">width:</span> 1000px; <span class="tBlue">height:</span> 600px; <span class="tBlue">background:</span> lightblue; <span class="tBlue">box-shadow:</span> 3px 3px 6px gray; <span class="tBlue">z-index:</span> 1; <span class="tBlue">overflow:</span> hidden; <span class="tBlue">user-select:</span> none; <span class="tBlue">display:</span> grid; <span class="tBlue">place-items:</span> center; <span class="tBlue">position:</span> relative; }</cl-cd>
<cl-cd data-idx="3"> .vid { <span class="tBlue">position:</span> absolute; <span class="tBlue">width:</span> 100%; <span class="tBlue">height:</span> 100%; <span class="tBlue">object-fit:</span> cover; }</cl-cd>
<cl-cd data-idx="4"> .<span class="tBlue">vid:</span>nth-of-type(2) { <span class="tBlue">mix-blend-mode:</span> screen; }</cl-cd>
<cl-cd data-idx="5"> .<span class="tBlue">vid:</span>nth-of-type(3) { <span class="tBlue">width:</span> 160px; <span class="tBlue">height:</span> 160px; <span class="tBlue">right:</span> 0; <span class="tBlue">top:</span> 0; <span class="tBlue">border-radius:</span> 50% 0 50% 50%; <span class="tBlue">cursor:</span> pointer; }</cl-cd>
<cl-cd data-idx="6"><<span class="tDarkRed">/style</span>></cl-cd>
<cl-cd data-idx="7"> </cl-cd>
<cl-cd data-idx="8"><<span class="tDarkRed">div</span> <span class="tRed">id</span>=<span class="tMagenta">"papa"</span>></cl-cd>
<cl-cd data-idx="9"> <<span class="tDarkRed">audio</span> <span class="tRed">id</span>=<span class="tMagenta">"aud"</span> src=<span class="tMagenta">"https://music.163.com/song/media/outer/url?<span class="tRed">id</span>=2154869910"</span> autoplay loop><<span class="tDarkRed">/audio</span>></cl-cd>
<cl-cd data-idx="10"> <<span class="tDarkRed">video</span> class=<span class="tMagenta">"vid"</span> src=<span class="tMagenta">"https://img.tukuppt.com/video_show/2419216/00/01/98/5b5459ad8a034.mp4"</span> poster=<span class="tMagenta">"https://638183.freep.cn/638183/t23/1/qbui.jpg"</span> disablePictureInPicture loop muted><<span class="tDarkRed">/video</span>></cl-cd>
<cl-cd data-idx="11"> <<span class="tDarkRed">video</span> class=<span class="tMagenta">"vid"</span> src=<span class="tMagenta">"https://img.tukuppt.com/video_show/2418175/00/18/65/5eef9970142b6.mp4"</span> disablePictureInPicture loop muted><<span class="tDarkRed">/video</span>></cl-cd>
<cl-cd data-idx="12"> <<span class="tDarkRed">video</span> class=<span class="tMagenta">"vid"</span> <span class="tRed">id</span>=<span class="tMagenta">"player"</span> src=<span class="tMagenta">"https://img.tukuppt.com/video_show/2475824/00/08/20/5d19984aa5b7c.mp4"</span> poster=<span class="tMagenta">"https://638183.freep.cn/638183/small/f01.png"</span> title=<span class="tMagenta">"播放/暂停"</span> disablePictureInPicture loop muted><<span class="tDarkRed">/video</span>></cl-cd>
<cl-cd data-idx="13"><<span class="tDarkRed">/div</span>></cl-cd>
<cl-cd data-idx="14"> </cl-cd>
<cl-cd data-idx="15"><<span class="tDarkRed">script</span>></cl-cd>
<cl-cd data-idx="16"> <span class="tBlue">var</span> sF = <span class="tRed">document</span>.createElement(<span class="tMagenta">'script'</span>);</cl-cd>
<cl-cd data-idx="17"> sF.charset = <span class="tMagenta">'UTF-8'</span>;</cl-cd>
<cl-cd data-idx="18"> sF.src = <span class="tMagenta">'https://638183.freep.cn/638183/web/js2024/lrc_only.js'</span>;</cl-cd>
<cl-cd data-idx="19"> <span class="tRed">document</span>.body.appendChild(sF);</cl-cd>
<cl-cd data-idx="20"> sF.onload = () => {</cl-cd>
<cl-cd data-idx="21"> LRC({</cl-cd>
<cl-cd data-idx="22"> <span class="tBlue">papa:</span> <span class="tMagenta">'#papa'</span>,</cl-cd>
<cl-cd data-idx="23"> lrc_<span class="tBlue">css:</span> <span class="tMagenta">'<span class="tBlue">top:</span> 20px; <span class="tBlue">color:</span> lightblue; <span class="tBlue">--bg:</span> linear-gradient(rgba(0,0,128,.2), rgba(0,0,255,.6))'</span>,</cl-cd>
<cl-cd data-idx="24"> <span class="tBlue">lrcAr:</span> geci</cl-cd>
<cl-cd data-idx="25"> });</cl-cd>
<cl-cd data-idx="26"> aud.onplaying = aud.onpause = () => mState();</cl-cd>
<cl-cd data-idx="27"> player.onclick = () => aud.paused ? aud.play() : aud.pause();</cl-cd>
<cl-cd data-idx="28"> };</cl-cd>
<cl-cd data-idx="29"> <span class="tBlue">var</span> mState = () => {</cl-cd>
<cl-cd data-idx="30"> <span class="tBlue">let</span> vids = papa.querySelectorAll(<span class="tMagenta">'video'</span>);</cl-cd>
<cl-cd data-idx="31"> vids.forEach(vid => aud.paused ? vid.pause() : vid.play());</cl-cd>
<cl-cd data-idx="32"> papa.style.setProperty(<span class="tMagenta">'--state'</span>, aud.paused ? <span class="tMagenta">'paused'</span> : <span class="tMagenta">'running'</span>);</cl-cd>
<cl-cd data-idx="33"> };</cl-cd>
<cl-cd data-idx="34"> papa.oncontextmenu = (e) => e.preventDefault();</cl-cd>
<cl-cd data-idx="35"> <span class="tBlue">var</span> geci = [, , ];</cl-cd>
<cl-cd data-idx="36"><<span class="tDarkRed">/script</span>></cl-cd>
</div> 这个比较特别啊。 这个用了3个视频呢,如此美妙的组合。那个跳舞灯光人太有意思了{:4_187:} 视频中有两个带有 poster 属性,用于不支持自动播放或视频加载速度偏慢时展示广告图片。
这设计真细心{:4_199:} 按钮视频id="player"被整合到封装里去了,这样跟着做就太方便了{:4_199:} 一上来就能欣赏到灯光人的舞蹈,真幸运{:4_173:} 红影 发表于 2024-5-15 09:39
一上来就能欣赏到灯光人的舞蹈,真幸运
{:4_191:} 愤怒的葡萄 发表于 2024-5-15 09:03
这个比较特别啊。
{:4_190:} 红影 发表于 2024-5-15 09:38
按钮视频id="player"被整合到封装里去了,这样跟着做就太方便了
这个 id 是帖子需要,不是 lrc_only 插件的需要 红影 发表于 2024-5-15 09:36
视频中有两个带有 poster 属性,用于不支持自动播放或视频加载速度偏慢时展示广告图片。
这设计真细心{: ...
{:4_190:} 红影 发表于 2024-5-15 09:35
这个用了3个视频呢,如此美妙的组合。那个跳舞灯光人太有意思了
是的吧?轻盈妙曼,婀娜多姿{:4_170:} 这跳舞的视频我当时怎么没找到呢,不然动感舞曲里是可以用用{:4_173:} 前几次发的画布效效太惊艳,第一眼看到的时候,还以为是画布做的跳舞人。。{:4_173:}
南无月 发表于 2024-5-15 12:48
前几次发的画布效效太惊艳,第一眼看到的时候,还以为是画布做的跳舞人。。
画布做这个就比较麻烦了,可能需要借助webGl编程 南无月 发表于 2024-5-15 12:44
这跳舞的视频我当时怎么没找到呢,不然动感舞曲里是可以用用
可能是看不上眼吧 马黑黑 发表于 2024-5-15 12:49
可能是看不上眼吧
根本没找到{:4_170:}
等有空我去换个试试 南无月 发表于 2024-5-15 12:54
根本没找到
等有空我去换个试试
好哒 马黑黑 发表于 2024-5-15 13:09
好哒
换上看了,还是放在这个贴子里效果更好。
那个背景是纯色,效果不咋滴 马黑黑 发表于 2024-5-15 12:49
画布做这个就比较麻烦了,可能需要借助webGl编程
其实看到它是视频就觉得有点正常~~
不然画布画出这么复杂的跟电影似的有点太妖孽了{:4_170:}
webGl编程现在听你说,很高级的样子