前几天看到了这一篇文章, 纯CSS来实现这种还算比较复杂的动画, 感觉蛮有意思的, 就打算自己跟着写一个 Dome 跑起来看看
纯css模拟下雪效果
我这使用的是React + Less, 会更原文有很多差异, 但是思路都是一样的.
CSS绘制雪花
利用CSS多条线性渐变既可以
1 | .snowflake{ |
飘落效果
上下直接使用相对定位就行, 左右动画使用 translateX 就很方便的, 主要还是随机方面比较麻烦, 原文很多东西都直接使用SCSS的循环来做, 我觉得完全没必要, 不是必要的我还是喜欢直接用行内样式, MVVM模式渲染不会增大加载速度的
一些随机的准备
1 | interface snowItemProps { |
雪花组件
1 | const SnowFlake = ({ position, delay, duration, name, timing }:snowItemProps) => { |
然后直接使用Array.map直接渲染出100个雪花, 然后加上飘落的CSS样式, 雪花就可以起飞了
1 | Array(100).fill(0).map((v, i)=><SnowFlake key={i} position={position()} delay={delay()} duration={duration()} name={name()} timing={timing()} />) |
上下动画
1 | @keyframes fall { |
左右横跳
1 | .loop(@i) when (@i <= 4){ |
然后给雪花加上定位样式就可以直接好了
.
这雪花是飘起来了, 但是丑还是有点丑, 然后有点肉眼可见的生硬感. 感觉这种比较复杂的动画还是交给canvas来做会好一点.