当前位置: 首页 > Web前端 > CSS

纯htmlcss实现炫酷的无限滚动动效

时间:2023-03-30 22:01:41 CSS

1。先看需求某次迭代接到的需求是做一个无限滚动的倾斜模块,如下图,不断有一定数量的游戏图标从右上方滑出,如此循环往复。可以先看看下面的实现效果~codepen体验(因为图片的大小,只截取了一部分,实际效果是一直滚动,没有动画重置的碎片感。)2.问题拆分看到这个需求的时候,感觉有点复杂,图标错位,倾斜滚动,无限滚动……想了想,我把这个问题拆分成了以下几步:写出整体的各个容器和图标的基本样式布局(包括倾斜等)添加无限水平滚动动画不多说了,滚代码3.开始行动(为了方便查看边框,在一些doms上添加了边框)3.1创建容器container是固定大小的圆角区域,写起来比较方便。框{高度:666px;宽度:1182px;边界半径:36px;边框:1px实心;溢出:隐藏;文本对齐:居中;font-size:30px;}3.2然后推出一个icon,使用下面的mockicon~.icon{width:267px;高度:267px;边界半径:计算(267px*0.23);背景图像:圆锥梯度(hsl(360,100%,50%),hsl(315,100%,50%),hsl(270,100%,50%),hsl(225,100%,50%),hsl(180,100%,50%),hsl(135,100%,50%),hsl(90,100%,50%),hsl(45,100%,50%),hsl(0,100%,50%));}3.3将图标排列到包装器中我们将脖子逆时针旋转30°,一看这个排列其实就是两排图标匀称排列。我们按图片显示静态的摆放一下:html1

2
3
45678css.lean-box{显示:flex;变换:旋转(-30度);}.wrapper{margin-top:180px;显示:弹性;文件x-wrap:nowrap;}.wrapper.icon:nth-child(even){margin-top:45px;transform:translate(155px);}.icon-pair{margin-left:45px;}.icon{display:flex;对齐项目:居中;证明内容:居中;白颜色;字体大小:66px;font-weight:bold;}这个看起来很有气势,然后需要添加动画效果让图标动起来3.4添加动画这里用到了动画,所以写如下代码添加到wrapper中:@keyframesrowup{from{转换:translateX(0%);}到{转换:translateX(-500px);}}.wrapper{margin-top:180px;显示:弹性;弹性包装:nowrap;animation:rowup5slinearinfinite;}这样上一步完成后整个wrapper会移动3.5个无缝滚动。机芯是动的,但是每轮结束都会回到原来的位置,这显然不是想要的结果。直观上认为图标是右侧不断添加wrapper,左侧滑出的无限破坏,但是这样会存在以下问题:创建图标的时机不好,以及性能难免会差(这样用js处理,比较麻烦)会在无限动画结束的时候回到原来的位置。如果您创建图标的副本并在动画结束时使副本与动画的第一帧重合,它看起来就像一个无限滚动。看起来是这样的:其实是这样的:计算移动距离:这里是一组8个图标,排成两行,移动的宽度应该是4个图标宽度+4个外边距,(2674)+(454)=1248px,这样动画B调整后正好可以移动到A。更新下动画:@keyframesrowup{from{transform:translateX(0%);}到{转换:translateX(-1248px);}}html也相应更新下:1234567812345678这样就完成了无限倾斜滚动动效3.6改进:每次动画移动距离都要根据内容计算吗?如果每次都按照组件个数计算的话,确实是有点low每次放置两个相同的图标,所以translateX的距离不用计算,设置为-50%即可。最终代码如下(可以在codepen上体验):HTML1234567812345678CSS@keyframesrowup{来自{transform:translateX(0%);}到{转换:translateX(-50%);}}.box{高度:666px;宽度:1182px;边界半径:36px;边框:1px实心;溢出:隐藏;文本对齐:居中;字体大小:30px;}.icon{宽度:267px;高度:267px;边界半径:calc(267px*0.23);背景图像:圆锥渐变(hsl(360,100%,50%),hsl(315,100%,50%),hsl(270,100%,50%),hsl(225,100%,50%),hsl(180,100%,50%),hsl(135,100%,50%),hsl(90,100%,50%),hsl(45,100%,50%),hsl(0,100%,50%));}.lean-box{显示:flex;变换:旋转(-30度);}.wrapper{margin-top:180px;显示:弹性;弹性包装:nowrap;动画:rowup5slinearinfinite;}.wrapper.icon:nth-child(even){margin-top:45px;transform:translate(155px);}.icon-pair{margin-left:45px;}.icon{display:flex;对齐项目:居中;证明内容:居中;白颜色;字体大小:66px;字体粗细:粗体;}