【问题标题】:CSS3: Smooth transition between animations change on :hoverCSS3:动画之间的平滑过渡:hover
【发布时间】:2014-04-10 23:56:25
【问题描述】:

我有一个具有无限 css3 动画的元素,当元素悬停时会更改为另一个无限动画。一切都很好,但有时动画变化太有弹性了,有没有办法在 mouseenter 和 mouseleave 上使动画之间的过渡平滑(也许将元素带到动画之间的初始状态)?两个动画的开始和结束状态是一样的。

@keyframes first-animation {
0% { transform: scale3d(1,1,0);}
50% { transform: scale3d(0.8,0.8,0); }
100% { transform: scale3d(1,1,0); }
};

@keyframes second-animation {
0% { transform: scale3d(1,1,0); }
70% { transform: scale3d(0.7,0.7,0); }
80% { transform: scale3d(0.9,0.9,0); }
100% { transform: scale3d(1,1,0);  }
};

div{
animation: first-animation 1.7s ease-in-out infinite;
}

div:hover, div:focus{
animation: second-animation 1.1s ease-in-out infinite;
}

【问题讨论】:

  • 你的意思是纯CSS解决方案吗?如果是这样,答案是否定的。如果没有,那么您可以等待onAnimationEnd 事件来切换它
  • 为了更精确的动画,我会退出'ease-in-out'并尝试cubic-beizer() cubic-bezier.com

标签: css animation css-transitions css-animations


【解决方案1】:

我不认为可以使用比例变换来实现。

你可以做一个技巧,从 scale() 更改为 translateZ()。当应用透视时,净效果也将是一个比例。但有趣的一点是,将透视设置为高值,这种比例效应可以做得非常小。透视是一种动画属性。

缺点是我们需要添加 2 个环绕层……但最终结果是这样的。我保留了原始版本来比较

@keyframes first-animation {
0% { transform: scale(1,1);}
50% { transform: scale(0.8,0.8); }
100% { transform: scale(1,1); }
}

@keyframes second-animation {
0% { transform: scale(1,1); }
70% { transform: scale(0.7,0.7); }
80% { transform: scale(0.9,0.9); }
100% { transform: scale(1,1);  }
}

.sample {
    background-color: lightblue;
    animation: first-animation 1.7s ease-in-out infinite;
}

.sample:hover {
animation: second-animation 1.1s ease-in-out infinite;
}

.dim {
    width: 200px;
    height: 200px;
}

.base1 {
    perspective: 1000px;
    transition: perspective 2s ease-out;
    position: absolute;
    left: 300px;
  top: 10px;
}
.base1:hover {
    perspective: 9999px;
}

.base2 {
    width: 100%;
    height: 100%;
    animation: animation1 1.7s ease-in-out infinite;
    perspective: 9999px;
    transition: perspective 2s ease-in;
}
.base1:hover .base2 {
    perspective: 1000px;
}

.inner {
    width: 100%;
    height: 100%;
    background-color: lightgreen;
    animation: animation2 1.1s ease-in-out infinite;
    transform-style: preserve-3d;
    perspective: 99999px;
}

@keyframes animation1 {
0% { transform: translateZ(0px);}
50% { transform: translateZ(-200px); }
100% { transform: translateZ(0px); }
}

@keyframes animation2 {
      0% { transform: translateZ(0px);}
     70% { transform: translateZ(-300px); }
     80% { transform: translateZ(-100px); }
    100% { transform: translateZ(0px); }
}
<div class="sample dim">SAMPLE</div>
<div class="base1 dim">
    <div class="base2">
        <div class="inner">DEMO</div>
    </div>
</div>

【讨论】:

    【解决方案2】:

    你用过转场吗??如果没有,请在父div中添加过渡规则。

    div{
    -webkit-transition: all 500ms linear;
    -moz-transition: all 500ms linear;
    -ms-transition: all 500ms linear;
    -o-transition: all 500ms linear;
    transition: all 500ms linear;
    }
    

    【讨论】:

      【解决方案3】:

      为了获得所需的效果,您需要使用 css3 动画事件。在这种情况下,您需要使用“AnimationIteration”。因此,您可以在迭代后触发事件。我为第二个动画在这个事件的末尾添加了一个类。

      Codepen Demo

      $(document).ready(function() {
        var animationElement = $(".animation");
      
        $("body").on({
          mouseover: function() {
            animationElement.one('webkitAnimationIteration mozAnimationIteration AnimationIteration', function() {
              animationElement.addClass("second-animation");
            });
          },
          mouseleave: function() {
            animationElement.one('webkitAnimationIteration mozAnimationIteration AnimationIteration', function() {
              animationElement.removeClass("second-animation");
            });
          }
        });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-07
        • 2011-10-11
        • 2012-11-30
        • 1970-01-01
        • 2015-05-07
        • 2014-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多