马黑黑 发表于 2022-5-17 22:36

《孔雀舞》代码解释

本帖最后由 马黑黑 于 2022-5-17 22:44 编辑 <br /><br />《孔雀舞》帖子地址:<a href="https://www.huachaowang.com/forum.php?mod=viewthread&amp;tid=59575&amp;extra=page%3D1" target="_blank">https://www.huachaowang.com/foru ... 9575&amp;extra=page%3D1</a>
<br><br>HTML是两层结构,代码如下:

<div><br></div><div><div><font color="#8b0000">&lt;div class="outerbox"&gt;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>&lt;div class="innerbox"&gt;&lt;/div&gt;</font></div><div><font color="#8b0000">&lt;/div&gt;</font></div></div><div><br></div><div>很简洁,没什么可说的,要实现的样式与功能,通过CSS和JS来完成。先说说CSS:</div><div><br></div><div><div><font color="#8b0000">&lt;style&gt;</font></div><div><font color="#8b0000">.outerbox {</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>position: relative;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>left: -242px;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>display: flex;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>justify-content: center;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>align-items: center;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>width: 1080px;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>height: 666px;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>background: #888 url('https://638183.freep.cn/638183/t22/51/peacock.jpg') no-repeat center/cover;;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>box-shadow: 2px 2px 8px rgba(0,0,0,.95);</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>perspective: 3000px;</font></div><div><font color="#8b0000">}</font></div><div><font color="#8b0000">.innerbox {</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>background: #666;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>box-shadow: 2px 2px 6px rgba(0,0,0,.85);</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>transform-style: preserve-3d;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>animation: flyout 6s linear infinite alternate;</font></div><div><font color="#8b0000">}</font></div><div><font color="#8b0000">@keyframes flyout {</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>0% { transform: rotate(0turn); width: 1px; height: 1px; }</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>80%, 100% { transform: rotate(2turn); width: 600px; height: 600px; }</font></div><div><font color="#8b0000">}</font></div><div><font color="#8b0000">&lt;/style&gt;</font></div></div><div><br></div><div>父元素 .outerbox&nbsp;使用弹性布局并令子元素水平、垂直两个方向居中,这样会给子元素的运动提供一个完美的场所。景深要有,设为3000px,令帖子的整体效果有3d观感。</div><div><br></div><div>子元素 .innerbox&nbsp;设定&nbsp;transform-style,配合父元素的景深设置展示3d效果。它的背景图片留给JS设置。animation&nbsp;动画设为 6&nbsp;秒,循环(infinite)、反向(alternate)运行。</div><div><br></div><div>关键帧动画,flyout,0% 时旋转 0&nbsp;圈,大小为 1&nbsp;个像素;80% 和 100%&nbsp;时动画的状态一样,旋转两圈,大小变为600*600。之所以80%和100%之时状态一样,是为了让图片推到最前方时停留一下下。</div><div><br></div><div>下面说说JS:</div><div><br></div><div><div><font color="#8b0000">&lt;script&gt;</font></div><div><font color="#8b0000"><br></font></div><div><font color="#8b0000">let picAr = Array.from({length:13}, (v,k) =&gt; k + 1);</font></div><div><font color="#8b0000">let idx = 0;</font></div><div><font color="#8b0000">let outer = document.querySelector('.outerbox');</font></div><div><font color="#8b0000">let inner = document.querySelector('.innerbox');</font></div><div><font color="#8b0000">let aud = document.createElement('iframe');</font></div><div><font color="#8b0000">aud.src = 'https://music.163.com/outchain/player?type=2&amp;id=1840766699&amp;auto=1&amp;height=66';</font></div><div><font color="#8b0000">aud.style.display = 'none';</font></div><div><font color="#8b0000">outer.appendChild(aud);</font></div><div><font color="#8b0000">setBgImg();</font></div><div><font color="#8b0000">setInterval(setBgImg, 12000);</font></div><div><font color="#8b0000"><br></font></div><div><font color="#8b0000">function setBgImg(){</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>inner.style = `background: url('https://638183.freep.cn/638183/t22/51/${picAr}.jpg') no-repeat center/cover`;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>idx += 1;</font></div><div><font color="#8b0000"><span style="white-space:pre">        </span>if(idx &gt;= picAr.length) idx = 0;</font></div><div><font color="#8b0000">}</font></div><div><font color="#8b0000"><br></font></div><div><font color="#8b0000">&lt;/script&gt;</font></div></div><div><br></div><div>第一行,快捷构建一个有13个元素的数组&nbsp;picAr,这是为了节省代码量,前提是图片的命名规则是 1.jpg、2.jpg、……、13.jpg,然后在函数&nbsp;setBgImg()&nbsp;里加入url的前面部分和后缀得出完整图片地址。</div><div><br></div><div>变量&nbsp;idx&nbsp;是图片数组的标识,从0开始,运行中每一次加1,加到 13&nbsp;时变回0,都在&nbsp;setBgImg()&nbsp;函数里完成计算。</div><div><br></div><div>定时器&nbsp;setInterval&nbsp;是少不了的,它结合并配合&nbsp;CSS&nbsp;的关键帧动画&nbsp;flyout,以 flyout&nbsp;被子元素的 animation 调用的周期运行时长为依据,6*2 = 12(秒),这是关键所在。为什么是 6*2 ?因为animation有个参数&nbsp;alternate,反向运行,同样会花一个周期时长的时间。</div>

红影 发表于 2022-5-17 22:59

“前提是图片的命名规则是 1.jpg、2.jpg、……、”
可是很多地方上传后的地址并不是和命名一致的呢{:4_173:}

马黑黑 发表于 2022-5-17 23:51

红影 发表于 2022-5-17 22:59
“前提是图片的命名规则是 1.jpg、2.jpg、……、”
可是很多地方上传后的地址并不是和命名一致的呢{:4_173 ...

那就需要将地址一个一个的建立数组。当然还可以有讨巧的做法。例如,图片网址假设如此:

相同部分/图片1.jpg
相同部分/图片2.jpg
…………
相同部分/图片n.jpg

则可以这样建立数组:

picAr = ['图片1', '图片2','…', '图片n' ];

后面在函数 setBgImg() 中补全相同部分和后缀。

加林森 发表于 2022-5-18 09:45

来学习

马黑黑 发表于 2022-5-19 07:33

马黑黑 发表于 2022-5-17 23:51
那就需要将地址一个一个的建立数组。当然还可以有讨巧的做法。例如,图片网址假设如此:

相同部分/图 ...

举例说明一下。先声明 图片url数组并赋值:

let picAr = [
'图片1完整地址',
'图片2完整地址',
'.......',
'图片N完整地址'
];

下一步,也是最后一步,将函数 setBgImg() 的 下面这句,

inner.style = `background: url('https://638183.freep.cn/638183/t22/51/${picAr}.jpg') no-repeat center/cover`;

改为,

inner.style = `background: url('${picAr}') no-repeat center/cover`;

红影 发表于 2022-5-19 12:40

马黑黑 发表于 2022-5-17 23:51
那就需要将地址一个一个的建立数组。当然还可以有讨巧的做法。例如,图片网址假设如此:

相同部分/图 ...

嗯嗯,你这个就是这样做的吧。

马黑黑 发表于 2022-5-19 12:40

红影 发表于 2022-5-19 12:40
嗯嗯,你这个就是这样做的吧。

差不多

红影 发表于 2022-5-19 20:38

马黑黑 发表于 2022-5-19 12:40
差不多

这个效果很漂亮{:4_187:}

马黑黑 发表于 2022-5-19 20:39

红影 发表于 2022-5-19 20:38
这个效果很漂亮

过得去

醉美水芙蓉 发表于 2022-5-19 20:58

马黑黑 发表于 2022-5-19 21:30

醉美水芙蓉 发表于 2022-5-19 20:58
https://638183.freep.cn/638183/t22/51/${picAr}.jpg这个最关键的一步没有学会,太难了!

链接打不开

醉美水芙蓉 发表于 2022-5-19 21:41

马黑黑 发表于 2022-5-19 21:44

醉美水芙蓉 发表于 2022-5-19 21:41
这个是老师教程里的!

额,可是你的链接不对

醉美水芙蓉 发表于 2022-5-19 21:46

马黑黑 发表于 2022-5-19 21:50

醉美水芙蓉 发表于 2022-5-19 21:46
黑黑老师中间这么多图怎么做出来的?有点难度?

好像不能,关键是JS里给出图片地址,用数组方式,我把代码再改改,套用起来就方便了

醉美水芙蓉 发表于 2022-5-19 21:52

马黑黑 发表于 2022-5-19 22:04

醉美水芙蓉 发表于 2022-5-19 21:52
谢谢黑黑老师!辛苦了,明天再来学习!

我在水吧贴出了修改码
页: [1]
查看完整版本: 《孔雀舞》代码解释