梦想
<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> <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"> #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"> #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"> #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"> @keyframes rot { to { <span class="tBlue">transform:</span> rotate(1turn); } }</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>=1897491808"</span> autoplay loop><<span class="tDarkRed">/audio</span>></cl-cd>
<cl-cd data-idx="10"> <<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>><<span class="tDarkRed">/canvas</span>></cl-cd>
<cl-cd data-idx="11"> <<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> /></cl-cd>
<cl-cd data-idx="12"><<span class="tDarkRed">/div</span>></cl-cd>
<cl-cd data-idx="13"> </cl-cd>
<cl-cd data-idx="14"><<span class="tDarkRed">script</span>></cl-cd>
<cl-cd data-idx="15"> <span class="tBlue">var</span> sF = <span class="tRed">document</span>.createElement(<span class="tMagenta">'script'</span>);</cl-cd>
<cl-cd data-idx="16"> sF.src = <span class="tMagenta">'https://638183.freep.cn/638183/web/js/cloth.js'</span>;</cl-cd>
<cl-cd data-idx="17"> <span class="tRed">document</span>.body.appendChild(sF);</cl-cd>
<cl-cd data-idx="18"> aud.onplaying = aud.onpause = () => 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"> player.onclick = () => aud.paused ? aud.play() : aud.pause();</cl-cd>
<cl-cd data-idx="20"><<span class="tDarkRed">/script</span>></cl-cd>
</div>
本帖最后由 马黑黑 于 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>
原来这个帘子是可以被掀开的,哈哈,来,掀起帘子,客官请进{:4_172:} 我的天,这到底怎么做的啊,掀起帘子感觉帘布的其他部分也跟着互动,像真的现实里掀开帘子一样呢{:4_199:} 哎呀,我扯动帘子的力道大了点,把帘子扯了个大洞{:4_200:}{:4_193:} 哈哈,又使劲拉扯一下,帘子彻底废了,落在地上。而且安不上去了。好吧,不要帘子也罢{:4_170:} 红影 发表于 2024-5-10 13:45
哎呀,我扯动帘子的力道大了点,把帘子扯了个大洞
右击复原 掉在地上的帘字也能玩呢,跟着鼠标互动,还能被拎起来{:4_196:} 又玩了一会,这次是扯了一半的帘子掉落了。这个好玩,跟玩游戏似的{:4_173:} 这帘子的弹性真好啊,玩这个跟小时候跳小皮筋似的{:4_375:} 山人 发表于 2024-5-10 13:48
右击复原
原来右键也可以,我直接f5刷新了。刷新帘子还变色的呢{:4_173:} 红影 发表于 2024-5-10 13:52
原来右键也可以,我直接f5刷新了。刷新帘子还变色的呢
右击复原也是变色的 马黑黑 发表于 2024-5-10 13:54
右击复原也是变色的
去试了试
<canvas id="canv" width="400" height="400"></canvas>
修改这个其实没法改变帘子大小呢,变大则移位,变小则和这个效果不同了呢{:4_204:} 比如我宽度不变,高度变200,则有一部分帘子拖在地上了{:4_173:} #canv { position: absolute; bottom: 0; left: 490px; }
这个设置也奇怪,明明它在背景图上的位置不是bottom: 0呢{:4_173:} 马黑黑 发表于 2024-5-10 12:28
本帖最后由 马黑黑 于 2024-5-10 12:30 编辑
这个梦想练习手指灵活度{:4_173:} 代码实现的不仅有静态和动态。
还有力度的感觉
轻轻扯拉,和用力拉扯的完全不同
摸拟真实场景,完美地呈现出来
所以,这个效果更让人感觉亲切
互动感更强。。{:4_199:} 鼠标划过时的破裂感,碎片感。。好象是真的用手扯出来的。。
感觉好真实。。
体验感强
代码神手非常厉害 。。{:4_199:} 南无月 发表于 2024-5-10 17:58
代码实现的不仅有静态和动态。
还有力度的感觉
轻轻扯拉,和用力拉扯的完全不同
从版权声明看,这个特效是作者2013年写的,次年他还发布了一个3d版本的。这两个版本我都找到了,可惜的是作者的GitHub貌似已经不能访问了,也不知后来有没有更新过。
2d版本,就是这个扯布料的,它是没有复原功能的,复原代码是我补上去的。
3d版本没那么优秀,但也可以玩一玩,现在我要做的是扯烂后怎么复原,其代码要比2d版本复杂得多。