好玩的蹦床效果 日常翻译六
今天分享一个有趣的小动画。主要的想法是在切换导航(navigating)图片时模拟蹦床的弹性效果。其中的图片拖拽效果我们使用的是Elastic STack。而svg的动画,我们使用了snap.svg。当然我们在整个过程中会使用css 的transitions属性。
demo中的图片使用得是Leonard Nimoy,是为了向他致敬,其上周逝去了。(外国程序员好有情怀)
最好看看Elastic Stack的教程并理解其如何工作。而Elastci Stack使用了David Desandro的Draggabilly。
在body里面的第一个元素是SVG形状元素,在我们切换图片时我们将控制它从一个矩形变成挤压后的矩形。
1 | <div id="morph-shape" class="morph-shape" data-morph-next="M301,301c0,0-83.8-21-151-21C71.8,280-1,301-1,301s21-65.7,21-151C20,79.936-1-1-1-1s73,11,151,11c85 0,151-11,151-11s-21,66.43-21,151C280,229.646,301,301,301,301z"> |
初始的矩形定义在svg的path中,然后我们将压缩后的矩形形状存储在data-morph-next中,以便后面动画使用。
照片堆的html结构:
1 | <div class="stack"> |
上面构成了图片堆(image stack),一个导航按钮去显示下一张图片,和每个图片的一句描述的话。我们适当调整了Elastic stack,使得能够将标题从image元素中提取出来,从而能在其上应用一些不同的效果。
前面的svg变换图形,我们需要将它延伸到整个屏幕。
1 | .morph-shape { |
而加在图片堆上面的样式是我们改边后的Elastic Stack样式。我们在对ul中的images设置perspective(建议了解下,3d效果会经常用到)值,这样我们就能在3d空间中定位它。下面最后两个类将会被动态加入,是我们用来创建动画效果的。
1 | .stack ul { |
对于其他得元素,比如导航按钮还有标题的样式:
1 | .stack__next { |
标题元素在变换时渐入渐出。
如果你是Yosemite系统这里的光标可能会有一个问题。
最后,我们需要做的就是在样式表中定义一些transitions。当我们执行这个蹦床效果时,SVG将会改变它的填充大小,同时我们主要的内容区(container)将会使用3D transform在z轴上做3D变换从而看起来更小。对于container这段变换的样式你可以在base.css中找到。
当我们点击变换的按钮(navigate)时,我们将navigate-next这个类加给body。在demo2中我们加入了一个微小的变化,我们将内容区(container)在z轴上旋转10度,在x轴上旋转-5度。
1 | .morph-shape svg { |
对于javascript部分,我们需要包含三个外部库:snap、modernizr、Draggabilly[http://draggabilly.desandro.com/]。另外还需要一部分[Elastic Stack](http://tympanus.net/codrops/2013/11/12/elastic-stack-elastic-dragging-interaction/)的代码。
然后我们定义好,我们的代码,管理好SVG图形变换和导航键点击之间的逻辑:
1 | (function() { |
ok,搞定了。
本文翻译自Playful Trampoline Effect,如果有问题请在评论中指出,谢谢