作者:PBitW
要写出钉钉官网动画,首先第一步就是分析钉钉官网动画是怎么实现的!
滚动滚轮发现:到了动画这里,界面是不会继续滚动的,而是等待动画执行完成后,才继续滚动!我们要实现的第一点就是:如何固定动画区域!只有搞定这个问题,下一个问题才是如何实现动画!
如何固定动画区域
这是一个解析图:灰色部分是网页内容比较长,蓝色部分是动画的执行区域,相对来说比较高(不然滚动条一滚动就被带走了),但是只有这两个是不行的,还需要红色这个粘性定位的内容,等内容滚动到红色区域时,会一直固定,等父元素(蓝色部分)滚动到最上面的时候,底部会将红色部分一起带走(保证了红色区域不管怎么滚动,有一段时间一直在可视区域内)!
不懂粘性定位可以异步: 重学前端 css 详解Position,sticky定位的坑你知道吗?(第二十四天)
创建项目
现在我们一步一步来,配合 豆包MarsCode 完成代码 !首先在vscode里准备好我们的前端三件套文件!
其中:body 是灰色部分,playground 是蓝色部分,红色部分是 animation_container,这里只是模仿钉钉这个动画,所以里面用的是小方格 list-item!
豆包MarsCode 设置样式
使用 豆包MarsCode 设置样式!
豆包MarsCode 优点1
简单注释, 豆包MarsCode 生成的代码还是挺好用的
豆包MarsCode 优点2
可以通过尝试换书写注释来生成正确的代码,但是比较难试!
通过菜鸟不断的尝试,豆包MarsCode 居然真的自己写出来了:
效果如下:
然后我们自己优化一下:
结果
到此元素结构和样式搞定了!
js实现动画
现在到了实现动画的阶段了,首先要知道css动画是什么?css就是数值随时间的变化,但是这里没有时间,细心的同学就会发现虽然和时间无关,但是和滚动条相关了,所以要抽象成这个图
值随滚动条变化的图,而不是时间了!
实现获取动画曲线的函数
现在就是要写一个动画曲线函数,给我一个x,算出一个y,为了知道曲线函数需要传入scrollStart、scrollEnd、valueStart、valueEnd,然后剩下的就交给豆包MarsCode了!
写函数,然后输入几个参数后,MarsCode 自己就帮助我们生成好了!
自己想要完善一下(写的时候,MarsCode 也可以直接帮你,实在是牛)
为什么实现这个函数?
就是用于备用,直接传值进函数,获得一个根据滚动条和属性直接的关系函数( 豆包MarsCode 也直接帮你完成,但是暂时不需要)
这里解释一下
opacity 这个函数就是:滚动条从0 到 100,那么透明度就从 0 到 1的函数曲线!
当然这里的滚动值不是很对,这个就是后面我们按需求修改!
根据当前滚动位置,计算每一个元素不同的数值
既然是动态变化的值,那肯定是这样的数据结构
所以要建立映射关系,将对象给每一个 dom
然后就是两件事:
- 更新 animationMap
- 更新 dom 的 style
所以写出这两个函数
更新 dom 的 style
其中比较好写的就是 更新 dom 的 style
思路:获取整个界面的滚动距离,循环 Map 去获取上面的对象,再循环对象获取值并调用函数!
有了思路, 豆包MarsCode 会直接帮你写好(写两个for,自己就出来了)
写完之后就调用,豆包MarsCode 也会帮你完成
更新 animationMap
思路:循环dom节点,并设置Map
写一个for, 豆包MarsCode 直接就帮你写好了
只是这里没这么简单,设置的是那个数据结构的对象,所以我们只保留设置部分!
getDomAnimation
返回的是一个对象
这里的 opacity,transform 又可以通过 createAnimation 来获取!然后发现 scrollStart,scrollEnd 所有的dom是一样的,所以直接当参数传入!
确定什么时候滚动、什么时候滚动结束
这个时候透明度的变化已经完成!
剩下的就是transform的一些属性,也可以按照 opacity 一样,不同的是这个 transformx\transformy ,需要计算。
都是从中间出来的,所以:
至此,效果基本实现,再就是动画需要延时,通过data-设置delay来实现
到此,钉钉官网动画基本上主要内容完成了,剩下的都是些图标什么的,还是比较简单的!
体验完 豆包MarsCode ,感觉智能提示等都很不错,但是 AI 只是辅助,重要的还是自己的能力过关!
所有评论(0)