我有一组动画,我排队一个接一个,创建一个更大的整体动画。为了简单起见,我创建了一个简单的小提琴来演示我的意思,但它是我想实现的一个简化版本(底部代码)…
http://jsfiddle.net/UnsungHero97/qgvrs/5/
我想做的是将所有这些组合成一个动画,而不是几个。目前,我添加了一个类来触发动画的不同阶段,但我想要做的是只添加一个类来启动动画,然后它会去。
我不知道如何将动画组合成一个,因为他们工作在不同的元素。我还是相当新的CSS3动画,所以有可能做到这一点吗?
有什么想法吗?
HTML
<div class="outside"> <div class="inside"></div> </div>
CSS
.outside { border: 1px solid magenta; height: 100px; width: 100px; position: relative; } .inside { border: 1px solid skyblue; height: 60px; width: 60px; margin-top: -31px; margin-left: -31px; position: absolute; top: 50%; left: 50%; } @-webkit-keyframes scale-in { 0% { -webkit-transform: scale(0); } 100% { -webkit-transform: scale(1); } } @-webkit-keyframes bounce { 0% { -webkit-transform: scale(1); } 25% { -webkit-transform: scale(.8); } 50% { -webkit-transform: scale(1); } 75% { -webkit-transform: scale(.9); } 100% { -webkit-transform: scale(1); } } @-webkit-keyframes rotate { 0% { -webkit-transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); } } .bounce { -webkit-animation-duration: 500ms; -webkit-animation-name: bounce; } .animate { -webkit-animation-delay: 0s; -webkit-animation-fill-mode: forwards; -webkit-animation-timing-function: ease; -webkit-transform: translateZ(0); } .click { border: 1px solid skyblue; -webkit-animation-duration: 1000ms; -webkit-animation-name: rotate; } .click .inside { border: 1px solid magenta; -webkit-animation-duration: 1000ms; -webkit-animation-name: rotate; } .clicked { border: 1px solid magenta; } .clicked .inside { border: 1px solid skyblue; -webkit-animation-duration: 750ms; -webkit-animation-name: scale-in; }
JS
$(document).ready(function() { $(document).click(function() { var jqElement = $('.outside'); jqElement .off() .addClass('animate') .addClass('bounce'); jqElement.on('animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd',function(event) { event.stopPropagation(); jqElement .removeClass('bounce') .removeClass('animate') .off() .addClass('animate') .addClass('click'); jqElement.on('animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd',function(event) { event.stopPropagation(); jqElement .removeClass('click') .removeClass('animate') .off() .addClass('clicked'); setTimeout(function() { jqElement.removeClass('clicked'); },500); }); }); }); });
解决方法
一个动画一个元素是它如何工作,因为动画改变单个元素的风格。然而,你可以应用延迟的动画来实现你想要的,允许你移动几乎所有的JS。
这个例子合并你的.outside一个.inside动画,通过基本上附加一个逗号到规则,你的JS现在只是添加类-webkit-animation-name:button-bounce,rotate,skyblue;
CSS
.outside.animate { -webkit-animation-delay: 0s,.5s,.5s; -webkit-animation-duration: 500ms,1000ms,1000ms; -webkit-animation-name: button-bounce,rotate,skyblue; } .animate { -webkit-animation-fill-mode: forwards; -webkit-animation-timing-function: ease; -webkit-transform: translateZ(0); } .outside.animate .inside { -webkit-animation-delay: .5s,1.5s; -webkit-animation-duration: 1000ms,750ms; -webkit-animation-name: rotate,magenta,scale-in; }
新动画
@-webkit-keyframes magenta { 0% { border: 1px solid magenta; } 99.99% { border: 1px solid magenta; } 100% { border: 1px solid skyblue; } } @-webkit-keyframes skyblue { 0% { border: 1px solid skyblue; } 99.99% { border: 1px solid skyblue; } 100% { border: 1px solid magenta; } }
JavaScript
$(document).ready(function() { $(document).click(function() { var count = 0; var jqElement = $('.outside'); if (!jqElement.hasClass('animate')) { jqElement.addClass('animate'); jqElement.on('animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd',function(event) { count++; if (count >= 6) { jqElement.off('animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd'); jqElement.removeClass('animate'); } }); } }); });