论不同动画衔接之间的小技巧
起初
今天在看到 3D轨道分割图像 这个示例的时候起初没有在意图片背后的悬浮动画,觉得这个只是加载了一张图片然后分成4块,hover上去的时候就合并在一起,就是4块图片的transition-delay不同,后来看着看着发现其实4块图片整体是有一个3D浮动的动画,而且当我hover上去的时候不管现在整体悬浮到那个位置都会顺滑的回到平面,勾起了我的好奇心。
当初
当初如果是要我做的话,我会给整体它一个 infinite
的 animation
给个5s的时间让他自己不断悬浮,然后hover上去的时候回到平面,不过这样做的一个非常大的弊端就是:
在hover上的那一瞬间,不管animation进行到哪一帧,都会立马回到最初的css
所以在这个animation和transition之间的衔接就会很突兀,以前也没有去细想,如今看到了之后发现这是我需要的东西。
审查
刚开始检查类名为 block__image
的元素因为它装载了这4张图片,也是它进行的rotate3D,他有一条css引起了我的好奇
|
|
起初我还在好奇怎么用的不是animation,后来它的style亮了一下发生了改变,内容变为 transform: rotate3d(1.6, 0.7, 0, 1deg);
,突然有所感悟,接着审查的结果证明了我的想法。
用chrome去hover了一下类名为 block__content
的元素看看 block__image
发生了什么改变
|
|
block__image
这个整体的 transition-duration
变成了0.5s,我把他改成了5s,发现它回归平面的时间变久了,同时也可以发现下方的duration已经被覆盖,说明这正是让他回到平面的时间,之后的 transform: rotate3d(0, 0, 0, 0deg) !important;
让他强制回到平面,因为js控制的style优先级最高。最后去js中证实一下自己。
|
|
正是16-18行每隔5s执行一次update函数,update用来改变它的rotate3D。
技巧
以后遇到这种需求的时候,可以考虑利用transition的优点 —— 动画衔接连续。
- 用js控制 操作之前 的动画,css中用transition实现 操作之前 的动画的
duration
- 操作后用 css伪元素 控制新的
duration
和新的终点属性,记得要用!important
让它覆盖js控制的样式 - 鼠标离开前加上塞贝尔曲线
cubic-bezier(0.65, 0.05, 0.36, 1)
,鼠标离开后还可以加上回弹效果0.25s cubic-bezier(0.175, 0.885, 0.32, 1.275)
会有一种难以合拢,一松开就回弹的效果,让用户感觉更有活力
一个简单的动画衔接就是这样,一些小技巧没什么多深的知识点也说不上有非常大的作用,因为对于我而言用户体验非常重要,这一点小细节可以看出作者的认真。希望日后可以用到自己的实践中。
记录于 2017-05-02 17:38