马黑黑 发表于 2024-5-10 12:22

梦想

<style>
        #papa { margin: 20px 0 20px calc(50% - 593px); width: 1024px; height: 640px; background: url('https://638183.freep.cn/638183/t24/2/u03.jpg') no-repeat center/cover; box-shadow: 3px 3px 6px gray; z-index: 1; position: relative; }
        #canv { position: absolute; bottom: 0; left: 490px; }
        #player { position: absolute; left: 565px; top: 50px; cursor: pointer; animation: rot 10s linear infinite var(--state); }
        @keyframes rot { to { transform: rotate(1turn); } }
</style>

<div id="papa">
        <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1897491808" autoplay loop></audio>
        <canvas id="canv" width="400" height="400"></canvas>
        <img id="player" alt="" src="https://638183.freep.cn/638183/t23/btn/hxbj.png" />
</div>

<script>
        var sF = document.createElement('script');
        sF.src = 'https://638183.freep.cn/638183/web/js/cloth.js';
        document.body.appendChild(sF);
        aud.onplaying = aud.onpause = () => papa.style.setProperty('--state', aud.paused ? 'paused' : 'running');
        player.onclick = () => aud.paused ? aud.play() : aud.pause();
</script>

马黑黑 发表于 2024-5-10 12:22

<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; #papa { <span class="tBlue">margin:</span> 20px 0 20px calc(50% - 593px); <span class="tBlue">width:</span> 1024px; <span class="tBlue">height:</span> 640px; <span class="tBlue">background:</span> url(<span class="tMagenta">'https://638183.freep.cn/638183/t24/2/u03.jpg'</span>) no-repeat center/cover; <span class="tBlue">box-shadow:</span> 3px 3px 6px gray; <span class="tBlue">z-index:</span> 1; <span class="tBlue">position:</span> relative; }</cl-cd>
<cl-cd data-idx="3">&nbsp; &nbsp; #canv { <span class="tBlue">position:</span> absolute; <span class="tBlue">bottom:</span> 0; <span class="tBlue">left:</span> 490px; }</cl-cd>
<cl-cd data-idx="4">&nbsp; &nbsp; #player { <span class="tBlue">position:</span> absolute; <span class="tBlue">left:</span> 565px; <span class="tBlue">top:</span> 50px; <span class="tBlue">cursor:</span> pointer; <span class="tBlue">animation:</span> rot 10s linear infinite <span class="tBlue">var</span>(--state); }</cl-cd>
<cl-cd data-idx="5">&nbsp; &nbsp; @keyframes rot { to { <span class="tBlue">transform:</span> rotate(1turn); } }</cl-cd>
<cl-cd data-idx="6">&lt;<span class="tDarkRed">/style</span>&gt;</cl-cd>
<cl-cd data-idx="7">&nbsp;</cl-cd>
<cl-cd data-idx="8">&lt;<span class="tDarkRed">div</span> <span class="tRed">id</span>=<span class="tMagenta">"papa"</span>&gt;</cl-cd>
<cl-cd data-idx="9">&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>=1897491808"</span> autoplay loop&gt;&lt;<span class="tDarkRed">/audio</span>&gt;</cl-cd>
<cl-cd data-idx="10">&nbsp; &nbsp; &lt;<span class="tDarkRed">canvas</span> <span class="tRed">id</span>=<span class="tMagenta">"canv"</span> width=<span class="tMagenta">"400"</span> height=<span class="tMagenta">"400"</span>&gt;&lt;<span class="tDarkRed">/canvas</span>&gt;</cl-cd>
<cl-cd data-idx="11">&nbsp; &nbsp; &lt;<span class="tDarkRed">img</span> <span class="tRed">id</span>=<span class="tMagenta">"player"</span> alt=<span class="tMagenta">""</span> src=<span class="tMagenta">"https://638183.freep.cn/638183/t23/btn/hxbj.png"</span> /&gt;</cl-cd>
<cl-cd data-idx="12">&lt;<span class="tDarkRed">/div</span>&gt;</cl-cd>
<cl-cd data-idx="13">&nbsp;</cl-cd>
<cl-cd data-idx="14">&lt;<span class="tDarkRed">script</span>&gt;</cl-cd>
<cl-cd data-idx="15">&nbsp; &nbsp; <span class="tBlue">var</span> sF = <span class="tRed">document</span>.createElement(<span class="tMagenta">'script'</span>);</cl-cd>
<cl-cd data-idx="16">&nbsp; &nbsp; sF.src = <span class="tMagenta">'https://638183.freep.cn/638183/web/js/cloth.js'</span>;</cl-cd>
<cl-cd data-idx="17">&nbsp; &nbsp; <span class="tRed">document</span>.body.appendChild(sF);</cl-cd>
<cl-cd data-idx="18">&nbsp; &nbsp; aud.onplaying = aud.onpause = () =&gt; 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="19">&nbsp; &nbsp; player.onclick = () =&gt; aud.paused ? aud.play() : aud.pause();</cl-cd>
<cl-cd data-idx="20">&lt;<span class="tDarkRed">/script</span>&gt;</cl-cd>
</div>

马黑黑 发表于 2024-5-10 12:28

本帖最后由 马黑黑 于 2024-5-10 12:30 编辑 <br /><br /><canvas id="mycanv" width="760" height="200"></canvas>

<script>

const text = '俺有一个梦想:扯布';
const skip = 4;
const ctx = mycanv.getContext('2d');

ctx.fillStyle = 'cyan';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.font = 'bold 70px sans-serif';
ctx.fillText(text, mycanv.width / 2, mycanv.height / 2);
ctx.fill();

let data = ctx.getImageData(0, 0, mycanv.width, mycanv.height).data;

ctx.shadowOffsetX = skip > 4 ? -skip * 2/3 : -1;
ctx.shadowOffsetY = skip > 4 ? -skip * 2/3 : -1;
ctx.shadowBlur = skip * 2/3;
ctx.shadowColor = 'black';

for (var y = 0; y < mycanv.height; y += skip) {
        for (var x = 0; x < mycanv.width; x += skip) {
                var opt = (x + y * mycanv.width) * 4 + 3;
                if (data > 0) {
                        ctx.fillStyle = `#${Math.random().toString(16).substr(-6)}`;
                        ctx.fillRect(x, y, skip - 1, skip - 1);
                }
        }
}

</script>

红影 发表于 2024-5-10 13:41

原来这个帘子是可以被掀开的,哈哈,来,掀起帘子,客官请进{:4_172:}

红影 发表于 2024-5-10 13:43

我的天,这到底怎么做的啊,掀起帘子感觉帘布的其他部分也跟着互动,像真的现实里掀开帘子一样呢{:4_199:}

红影 发表于 2024-5-10 13:45

哎呀,我扯动帘子的力道大了点,把帘子扯了个大洞{:4_200:}{:4_193:}

红影 发表于 2024-5-10 13:46

哈哈,又使劲拉扯一下,帘子彻底废了,落在地上。而且安不上去了。好吧,不要帘子也罢{:4_170:}

山人 发表于 2024-5-10 13:48

红影 发表于 2024-5-10 13:45
哎呀,我扯动帘子的力道大了点,把帘子扯了个大洞

右击复原

红影 发表于 2024-5-10 13:48

掉在地上的帘字也能玩呢,跟着鼠标互动,还能被拎起来{:4_196:}

红影 发表于 2024-5-10 13:51

又玩了一会,这次是扯了一半的帘子掉落了。这个好玩,跟玩游戏似的{:4_173:}

红影 发表于 2024-5-10 13:52

这帘子的弹性真好啊,玩这个跟小时候跳小皮筋似的{:4_375:}

红影 发表于 2024-5-10 13:52

山人 发表于 2024-5-10 13:48
右击复原

原来右键也可以,我直接f5刷新了。刷新帘子还变色的呢{:4_173:}

马黑黑 发表于 2024-5-10 13:54

红影 发表于 2024-5-10 13:52
原来右键也可以,我直接f5刷新了。刷新帘子还变色的呢

右击复原也是变色的

红影 发表于 2024-5-10 14:12

马黑黑 发表于 2024-5-10 13:54
右击复原也是变色的

去试了试
<canvas id="canv" width="400" height="400"></canvas>
修改这个其实没法改变帘子大小呢,变大则移位,变小则和这个效果不同了呢{:4_204:}

红影 发表于 2024-5-10 14:16

比如我宽度不变,高度变200,则有一部分帘子拖在地上了{:4_173:}

红影 发表于 2024-5-10 14:22

#canv { position: absolute; bottom: 0; left: 490px; }

这个设置也奇怪,明明它在背景图上的位置不是bottom: 0呢{:4_173:}

南无月 发表于 2024-5-10 17:55

马黑黑 发表于 2024-5-10 12:28
本帖最后由 马黑黑 于 2024-5-10 12:30 编辑




这个梦想练习手指灵活度{:4_173:}

南无月 发表于 2024-5-10 17:58

代码实现的不仅有静态和动态。
还有力度的感觉
轻轻扯拉,和用力拉扯的完全不同
摸拟真实场景,完美地呈现出来
所以,这个效果更让人感觉亲切
互动感更强。。{:4_199:}

南无月 发表于 2024-5-10 18:01

鼠标划过时的破裂感,碎片感。。好象是真的用手扯出来的。。
感觉好真实。。
体验感强
代码神手非常厉害 。。{:4_199:}

马黑黑 发表于 2024-5-10 18:04

南无月 发表于 2024-5-10 17:58
代码实现的不仅有静态和动态。
还有力度的感觉
轻轻扯拉,和用力拉扯的完全不同

从版权声明看,这个特效是作者2013年写的,次年他还发布了一个3d版本的。这两个版本我都找到了,可惜的是作者的GitHub貌似已经不能访问了,也不知后来有没有更新过。

2d版本,就是这个扯布料的,它是没有复原功能的,复原代码是我补上去的。

3d版本没那么优秀,但也可以玩一玩,现在我要做的是扯烂后怎么复原,其代码要比2d版本复杂得多。
页: [1] 2 3 4 5 6
查看完整版本: 梦想