CSS3 旋转动画导致 Animate.css 抖动动画消失

Posted

技术标签:

【中文标题】CSS3 旋转动画导致 Animate.css 抖动动画消失【英文标题】:CSS3 rotate animation causes Animate.css shake animation to disappear 【发布时间】:2014-02-24 18:17:51 【问题描述】:

每当我在 CSS3 旋转动画之后执行 Animate.css 摇动动画时,被摇动的 div 都会消失。这只发生在旋转 div 的背面。正面没有这个问题。

我已经整理了一个 jsfiddle 来演示这个问题。

http://jsfiddle.net/kG9Ld/1/

html

<div class="wrappers">
  <div class="wrapper shaker front">
    <p>Front</p>
    <p><a href="#" class="flip">Flip</a></p>
    <p><a href="#" class="shake">Shake</a></p>
  </div>
  <div class="wrapper shaker back">
    <p>Back</p>
    <p><a href="#" class="flip">Flip</a></p>
    <p><a href="#" class="shake">Shake</a></p>
  </div>
</div>

CSS

.wrappers 
  -webkit-transition:-webkit-transform 1s;
  -moz-transition:-moz-transform 1s;
  -ms-transition:-ms-transform 1s;
  -o-transition:-o-transform 1s;
  transition: transform 1s;
  -webkit-transform-style: preserve-3d;
  -moz-transform-style: preserve-3d;
  -ms-transform-style: preserve-3d;
  -o-transform-style: preserve-3d;
  transform-style: preserve-3d;

.wrapper 
    height: 100px;
    -webkit-backface-visibility: hidden;
    -moz-backface-visibility: hidden;
    -ms-backface-visibility: hidden;
    -o-backface-visibility: hidden;
    backface-visibility: hidden;
    -webkit-transform-style: preserve-3d;
    -moz-transform-style: preserve-3d;
    -ms-transform-style: preserve-3d;
    -o-transform-style: preserve-3d;
    transform-style: preserve-3d;
    position: absolute;
    width: 100px;

.front 
    background-color: red;
    z-index: 3;

.back 
    background-color: green;
    -webkit-transform: rotateY(180deg);
    -moz-transform: rotateY(180deg);
    -ms-transform: rotateY(180deg);
    -o-transform: rotateY(180deg);
    transform: rotateY(180deg);
    z-index: 1;

.flipped 
    -webkit-transform: rotateY(180deg);
    -moz-transform: rotateY(180deg);
    -ms-transform: rotateY(180deg);
    -o-transform: rotateY(180deg);
    transform: rotateY(180deg);

.flipped .back 
    z-index: 3;

javascript

$('.flip').on('click', function (e) 
    $wrappers = $('.wrappers');

    $wrappers.toggleClass('flipped');
);

$('.shake').on('click', function (e) 
    $('.shaker').addClass('animated shake');
);

$('.shaker').on('webkitAnimationEnd mozAnimationEnd oAnimationEnd animationEnd', function(e) 
    $('.shaker').removeClass('animated shake');
);

【问题讨论】:

【参考方案1】:

问题在于晃动动画的 transform 属性覆盖了 .back 元素的 transform 属性:rotateY(180deg)

解决方案就是修改动画并使用转换组合:

WORKING EXAMPLE HERE

-webkit-transform: translateX(0) rotateY(180deg);

这当然需要新的关键帧:

@-webkit-keyframes shakeBack 
  0%, 100% 
    -webkit-transform: translateX(0) rotateY(180deg);
    transform: translateX(0) rotateY(180deg);
  

  10%, 30%, 50%, 70%, 90% 
    -webkit-transform: translateX(-10px) rotateY(180deg);
    transform: translateX(-10px) rotateY(180deg);
  

  20%, 40%, 60%, 80% 
    -webkit-transform: translateX(10px) rotateY(180deg);
    transform: translateX(10px) rotateY(180deg);
  

您现在需要根据元素的前/后是否可见添加不同的动画。

.shakeBack 
  -webkit-animation-name: shakeBack;
  animation-name: shakeBack;

修改后的 JS - 这可以写得更好,但你明白了。

$('.shaker.front .shake').on('click', function (e) 
    $(this).parents('.shaker').addClass('animated shake');
);
$('.shaker.back .shake').on('click', function (e) 
    $(this).parents('.shaker').addClass('animated shakeBack');
);

【讨论】:

以上是关于CSS3 旋转动画导致 Animate.css 抖动动画消失的主要内容,如果未能解决你的问题,请参考以下文章

7.1 万 Star!超实用,60 多种动画效果的 CSS 库

webpack中使用wowjs和animate.css

如何将css3动画添加到bootstrap中

animate.css不生效

通过CSS实现炫酷的动画效果

css3 动画库Animate.css使用