马黑黑 发表于 2024-6-5 11:57

戴树红·碧涧流泉

<style>
        #mydiv { margin: 30px 0 30px calc(50% - 593px); width: 1024px; height:680px; background: url('https://638183.freep.cn/638183/t24/2/bjlq.jpeg') no-repeat center/cover; box-shadow: 2px 2px 6px rgba(0,0,0,.6); overflow: hidden; z-index: 1; user-select: none; position: relative; }
        txt-box { position: absolute; display: grid; place-items: center; left: var(--xx); bottom: 10px; width: 50px; height: 50px; font: normal 30px sans-serif; color: snow; cursor: pointer; transition: .5s; animation: move 5s var(--delay) linear infinite alternate var(--state); }
        txt-box::after { position: absolute; content: ''; inset: -4px; border: thick outset lightgreen; border-radius: 0 50%; animation: rot 5s var(--delay) linear infinite alternate var(--state); }
        txt-box:hover { filter: sepia(100%) drop-shadow(0 -80px 10px white); }
        #vid { position: absolute; bottom: 0; width: 100%; height: calc(100% + 60px); object-fit: cover; mix-blend-mode: multiply; opacity: .75; pointer-events: none; }
        @keyframes move { to { bottom: 150px; } }
        @keyframes rot { to { transform: rotateX(360deg); } }
</style>

<div id="mydiv">
        <audio id="aud" src="https://music.163.com/song/media/outer/url?id=5269161" autoplay loop></audio>
        <video id="vid" src="https://img.tukuppt.com/video_show/3664703/00/02/08/5b5041984d4dc.mp4" muted loop autoplay></video>
</div>

<script>
(function() {
        const ar = '涧水流花去山云载鹤归'.split('');
        const total = ar.length, half = Math.floor(ar.length / 2), ww = 700;
        let tbAr = [];
        ar.forEach((t,k) => {
                let tbox = document.createElement('txt-box');
                tbox.textContent = t;
                tbox.style.cssText += `
                        --xx: ${ww / total * k + 180}px;
                        --delay: -${k < half ? k * 0.5 : (total - k) * 0.5}s;
                `;
                tbAr.push(tbox);
                mydiv.appendChild(tbox);
        });
        aud.onplaying = aud.onpause = () => {
                mydiv.style.setProperty('--state', ['running','paused'][+aud.paused]);
                aud.paused ? vid.pause() : vid.play();
                tbAr.forEach(tb => tb.title = ['暂停','播放'][+aud.paused]);
        };
        tbAr.forEach(tb => tb.onclick = () => aud.paused ? aud.play() : aud.pause());
})();
</script>

马黑黑 发表于 2024-6-5 11:58

<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">&lt;<span class="tDarkRed">style</span>&gt;</cl-cd>
<cl-cd data-idx="2">&nbsp; &nbsp; #mydiv { <span class="tBlue">margin:</span> 30px 0 30px calc(50% - 593px); <span class="tBlue">width:</span> 1024px; <span class="tBlue">height:</span>680px; <span class="tBlue">background:</span> url(<span class="tMagenta">'https://638183.freep.cn/638183/t24/2/bjlq.jpeg'</span>) no-repeat center/cover; <span class="tBlue">box-shadow:</span> 2px 2px 6px rgba(0,0,0,.6); <span class="tBlue">overflow:</span> hidden; <span class="tBlue">z-index:</span> 1; <span class="tBlue">position:</span> relative; }</cl-cd>
<cl-cd data-idx="3">&nbsp; &nbsp; txt-box { <span class="tBlue">position:</span> absolute; <span class="tBlue">display:</span> grid; <span class="tBlue">place-items:</span> center; <span class="tBlue">left:</span> <span class="tBlue">var</span>(--xx); <span class="tBlue">bottom:</span> 10px; <span class="tBlue">width:</span> 50px; <span class="tBlue">height:</span> 50px; <span class="tBlue">font:</span> normal 30px sans-serif; <span class="tBlue">color:</span> snow; <span class="tBlue">cursor:</span> pointer; <span class="tBlue">transition:</span> .5s; <span class="tBlue">animation:</span> move 5s <span class="tBlue">var</span>(--delay) linear infinite alternate <span class="tBlue">var</span>(--state); }</cl-cd>
<cl-cd data-idx="4">&nbsp; &nbsp; txt-box::after { <span class="tBlue">position:</span> absolute; <span class="tBlue">content:</span> <span class="tMagenta">''</span>; <span class="tBlue">inset:</span> -4px; <span class="tBlue">border:</span> thick outset lightgreen; <span class="tBlue">border-radius:</span> 0 50%; <span class="tBlue">animation:</span> rot 5s <span class="tBlue">var</span>(--delay) linear infinite alternate <span class="tBlue">var</span>(--state); }</cl-cd>
<cl-cd data-idx="5">&nbsp; &nbsp; <span class="tBlue">txt-box:</span>hover { <span class="tBlue">filter:</span> sepia(100%) drop-shadow(0 -80px 10px white); }</cl-cd>
<cl-cd data-idx="6">&nbsp; &nbsp; #vid { <span class="tBlue">position:</span> absolute; <span class="tBlue">bottom:</span> 0; <span class="tBlue">width:</span> 100%; <span class="tBlue">height:</span> calc(100% + 60px); <span class="tBlue">object-fit:</span> cover; <span class="tBlue">mix-blend-mode:</span> multiply; <span class="tBlue">opacity:</span> .75; <span class="tBlue">pointer-events:</span> none; }</cl-cd>
<cl-cd data-idx="7">&nbsp; &nbsp; @keyframes move { to { <span class="tBlue">bottom:</span> 150px; } }</cl-cd>
<cl-cd data-idx="8">&nbsp; &nbsp; @keyframes rot { to { <span class="tBlue">transform:</span> rotateX(360deg); } }</cl-cd>
<cl-cd data-idx="9">&lt;<span class="tDarkRed">/style</span>&gt;</cl-cd>
<cl-cd data-idx="10">&nbsp;</cl-cd>
<cl-cd data-idx="11">&lt;<span class="tDarkRed">div</span> <span class="tRed">id</span>=<span class="tMagenta">"mydiv"</span>&gt;</cl-cd>
<cl-cd data-idx="12">&nbsp; &nbsp; &lt;<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>=5269161"</span> autoplay loop&gt;&lt;<span class="tDarkRed">/audio</span>&gt;</cl-cd>
<cl-cd data-idx="13">&nbsp; &nbsp; &lt;<span class="tDarkRed">video</span> <span class="tRed">id</span>=<span class="tMagenta">"vid"</span> src=<span class="tMagenta">"https://img.tukuppt.com/video_show/3664703/00/02/08/5b5041984d4dc.mp4"</span> muted loop autoplay&gt;&lt;<span class="tDarkRed">/video</span>&gt;</cl-cd>
<cl-cd data-idx="14">&lt;<span class="tDarkRed">/div</span>&gt;</cl-cd>
<cl-cd data-idx="15">&nbsp;</cl-cd>
<cl-cd data-idx="16">&lt;<span class="tDarkRed">script</span>&gt;</cl-cd>
<cl-cd data-idx="17">(<span class="tBlue">function</span>() {</cl-cd>
<cl-cd data-idx="18">&nbsp; &nbsp; <span class="tBlue">const</span> ar = <span class="tMagenta">'涧水流花去山云载鹤归'</span>.split(<span class="tMagenta">''</span>);</cl-cd>
<cl-cd data-idx="19">&nbsp; &nbsp; <span class="tBlue">const</span> total = ar.length, half = <span class="tRed">Math</span>.floor(ar.length / 2), ww = 700;</cl-cd>
<cl-cd data-idx="20">&nbsp; &nbsp; <span class="tBlue">let</span> tbAr = [];</cl-cd>
<cl-cd data-idx="21">&nbsp; &nbsp; ar.forEach((t,k) =&gt; {</cl-cd>
<cl-cd data-idx="22">&nbsp; &nbsp; &nbsp; &nbsp; <span class="tBlue">let</span> tbox = <span class="tRed">document</span>.createElement(<span class="tMagenta">'txt-box'</span>);</cl-cd>
<cl-cd data-idx="23">&nbsp; &nbsp; &nbsp; &nbsp; tbox.textContent = t;</cl-cd>
<cl-cd data-idx="24">&nbsp; &nbsp; &nbsp; &nbsp; tbox.style.cssText += `</cl-cd>
<cl-cd data-idx="25">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="tBlue">--xx:</span> ${ww / total * k + 180}px;</cl-cd>
<cl-cd data-idx="26">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="tBlue">--delay:</span> -${k &lt; half ? k * 0.5&nbsp;: (total - k) * 0.5}s;</cl-cd>
<cl-cd data-idx="27">&nbsp; &nbsp; &nbsp; &nbsp; `;</cl-cd>
<cl-cd data-idx="28">&nbsp; &nbsp; &nbsp; &nbsp; tbAr.push(tbox);</cl-cd>
<cl-cd data-idx="29">&nbsp; &nbsp; &nbsp; &nbsp; mydiv.appendChild(tbox);</cl-cd>
<cl-cd data-idx="30">&nbsp; &nbsp; });</cl-cd>
<cl-cd data-idx="31">&nbsp; &nbsp; aud.onplaying = aud.onpause = () =&gt; {</cl-cd>
<cl-cd data-idx="32">&nbsp; &nbsp; &nbsp; &nbsp; mydiv.style.setProperty(<span class="tMagenta">'--state'</span>, [<span class="tMagenta">'running'</span>,<span class="tMagenta">'paused'</span>][+aud.paused]);</cl-cd>
<cl-cd data-idx="33">&nbsp; &nbsp; &nbsp; &nbsp; aud.paused ? vid.pause() : vid.play();</cl-cd>
<cl-cd data-idx="34">&nbsp; &nbsp; &nbsp; &nbsp; tbAr.forEach(tb =&gt; tb.title = [<span class="tMagenta">'暂停'</span>,<span class="tMagenta">'播放'</span>][+aud.paused]);</cl-cd>
<cl-cd data-idx="35">&nbsp; &nbsp; };</cl-cd>
<cl-cd data-idx="36">&nbsp; &nbsp; tbAr.forEach(tb =&gt; tb.onclick = () =&gt; aud.paused ? aud.play() : aud.pause());</cl-cd>
<cl-cd data-idx="37">})();</cl-cd>
<cl-cd data-idx="38">&lt;<span class="tDarkRed">/script</span>&gt;</cl-cd>
</div>

马黑黑 发表于 2024-6-5 12:09

本帖最后由 马黑黑 于 2024-6-5 12:10 编辑

本帖:

(一)文本按钮动画 :上下位移运动通过动画延时参数 animation-delay (即CSS变量 --delay)的错落算法(代码第26行)实现整体曲线态势;外圈(伪元素)旋转则使用 transform: rotateX(deg) 沿X轴翻滚。

(二)文本按钮的X方向布排 :即CSS变量 --xx 的赋值计算(代码第25行),--xx: ${ww / total * k + 180}px;,给定宽度/文字总数*文本序列号 + 左边距,左边距指第一个字离帖子容器元素左边缘的距离。

(三)文本按钮动态阴影 :使用 filter: drop-shadow(x y r color); 滤镜设置,x、y 是阴影横纵方向偏移量,支持负数值,r 是阴影模糊半径,color 是阴影颜色。

朵拉 发表于 2024-6-5 12:09

好看,学习下~~{:4_190:}

红影 发表于 2024-6-5 14:11

这个是纵向变化的文字按钮了,而且外框还能反转的呢。漂亮{:4_199:}

红影 发表于 2024-6-5 14:15

鼠标触动的滤镜效果也漂亮,还有个-80的飘到上面的阴影{:4_187:}

南无月 发表于 2024-6-5 17:46

马黑黑 发表于 2024-6-5 12:09
本帖:

(一)文本按钮动画 :上下位移运动通过动画延时参数 animation-delay (即CSS变量 --delay)的 ...

字变成上下运动了。。
这个波浪起伏的效果特别好看。。

南无月 发表于 2024-6-5 17:47

这个边框运动得跟字在跳绳似的。。
叶子形状跟背景和视频很搭。。。

南无月 发表于 2024-6-5 17:49

鼠标碰触除了边框 变色之外,还有灵魂出窍效果。。。一团白雾直接飞升。。{:4_170:}

马黑黑 发表于 2024-6-5 17:56

南无月 发表于 2024-6-5 17:49
鼠标碰触除了边框 变色之外,还有灵魂出窍效果。。。一团白雾直接飞升。。

{:4_172:}

马黑黑 发表于 2024-6-5 17:56

南无月 发表于 2024-6-5 17:47
这个边框运动得跟字在跳绳似的。。
叶子形状跟背景和视频很搭。。。

果酱果酱

马黑黑 发表于 2024-6-5 17:57

南无月 发表于 2024-6-5 17:46
字变成上下运动了。。
这个波浪起伏的效果特别好看。。

这里面有个算法,虽然不算太复杂

马黑黑 发表于 2024-6-5 17:57

红影 发表于 2024-6-5 14:15
鼠标触动的滤镜效果也漂亮,还有个-80的飘到上面的阴影

{:4_190:}

马黑黑 发表于 2024-6-5 17:58

朵拉 发表于 2024-6-5 12:09
好看,学习下~~

{:4_190:}

马黑黑 发表于 2024-6-5 17:58

红影 发表于 2024-6-5 14:11
这个是纵向变化的文字按钮了,而且外框还能反转的呢。漂亮

还行的吧

南无月 发表于 2024-6-5 20:58

马黑黑 发表于 2024-6-5 17:57
这里面有个算法,虽然不算太复杂

其实昨天有想,这些字能左右走,能不能竖排上下走。。靠左或者右的。。
今天就看到上下运动了。跟想的不太一样的是横排的。{:4_170:}

南无月 发表于 2024-6-5 20:58

马黑黑 发表于 2024-6-5 17:56
果酱果酱

{:4_173:}把字换成人,把边框换成竖椭圆,是不是就跳起来了

南无月 发表于 2024-6-5 20:59

马黑黑 发表于 2024-6-5 17:56


难为你是怎么想出来的。。
这个神来之笔。。{:4_170:}

马黑黑 发表于 2024-6-5 21:02

南无月 发表于 2024-6-5 20:58
把字换成人,把边框换成竖椭圆,是不是就跳起来了

你可以试试

马黑黑 发表于 2024-6-5 21:02

南无月 发表于 2024-6-5 20:59
难为你是怎么想出来的。。
这个神来之笔。。

{:4_203:}
页: [1] 2 3 4 5 6 7 8
查看完整版本: 戴树红·碧涧流泉