【问题标题】:How to animate a div using css3如何使用 css3 为 div 设置动画
【发布时间】:2015-04-28 19:17:07
【问题描述】:

我有以下代码:

$('.div-1').on('click', function() {
  $('.block').addClass('animated');
});
$('.div-2').on('click', function() {
  $('.block2').addClass('animated');
});
html,
body {
  height: 100%;
}
.div-1 {
  display: inline-block;
  padding: 40px;
  background: tomato;
}
.div-2 {
  display: inline-block;
  padding: 40px;
  background: tan;
}
.block2 {
  background: green;
}
.animated {
  -webkit-animation: animateThis 0.2s ease;
  animation: animateThis 0.2s ease;
  -webkit-animation-fill-mode: forwards;
  animation-fill-mode: forwards;
}
.block {
  background: red;
}
@-webkit-keyframes animateThis {
  0% {
    height: 0;
    width: 0;
  }
  100% {
    height: 100%;
    width: 100%;
  }
}
keyframes animateThis {
  0% {
    height: 0;
    width: 0;
  }
  100% {
    height: 100%;
    width: 100%;
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="div-1"></div>
<div class="div-2"></div>

<section class="block"></section>
<section class="block2"></section>

这是一个PEN

我要做什么:当单击div-1div-2 时,blockblock2 部分的相应动画应该来自div-1底部中心div-2。它目前从左角开始动画。

我的问题是:如何让动画源自div-1div-2底部中心,而不是左角。此外,当单击div-1div-2 时,当前打开的部分应关闭(带有打开方式的反向动画),相应的单击div 应作为新动画打开。这如何通过脚本来完成?我不想使用外部库(animate.css)。我已经尝试了几种方法,但我不知道该怎么做,因为我无法弄清楚逻辑。

【问题讨论】:

    标签: jquery html css css-animations


    【解决方案1】:

    如果您想按照您的要求使用动画的起点,您可以使用 transform-origin CSS 属性。 写

    transform-origin: 50% 100%;
    -webkit-transform-origin: 50% 100%;
    

    让它从底部中心开始。

    要使用反向动画,只需在动画指令后添加关键字alternate。它会播放完成后还原的动画。

    例子:

    .animated {
      -webkit-animation: animateThis 0.2s ease alternate;
      animation: animateThis 0.2s ease alternate;
      -webkit-animation-fill-mode: forwards;
      animation-fill-mode: forwards;
    }
    

    【讨论】:

    • 我不熟悉如何使用以下内容,您能否提供一个小提琴将是最有帮助的。
    • 我做了一些搜索,“transform-origin”可以与 css3 关键帧动画一起使用吗?
    • 当然可以!当我有 5 分钟的时间帮助您了解它的工作原理时,我会为您提供一个小提琴。
    • 我带着一个在 cssdesk 上制作的小例子回来了:cssdeck.com/labs/myo0lzi1 平滑向后的动画在这里不起作用,但是通过使用变换比例和变换原点,你肯定能够使轴位于中心底部。
    • 动画工作正常,我可以从那里跟进更改切换类,这有助于继续。
    【解决方案2】:

    使用单独的动画隐藏方块

     @-webkit-keyframes shrinkThis {
          0% {
            height: 100%;
            width: 100%;
      }
    
      100% {
        height: 0;
        width: 0;
      }
    } 
    

    并且可以通过回调知道该块被隐藏,然后展开对应的块

    $(".block").bind("animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd", 
      function() {
          $('.block2').removeClass('shrink');
          $('.block2').addClass('expand');
          $('.block2').unbind();
      });
    

    这里是PEN

    编辑定位: 正如某人指出的那样,您可以使用 transform-origin 。但它只适用于缩放、平移等转换。

    块的 css 应该如下所示:

    .block {
      /*background: red;*/
      position:absolute;
      border:solid 1px;
        height: 100%;
        width: 100%;
      transform-origin: 20px 0%;
    -webkit-transform-origin: 20px 0%;
    }
    

    变换是使用缩放而不是修改高度和宽度:

    @-webkit-keyframes animateThis {
      0% {
        -webkit-transform: scale(0.1,0.1);
      }
      100% {
        -webkit-transform: scale(1,1);
      }
    } 
    

    这是更新后的PEN

    需要改进的地方:应该动态计算变换原点。

    【讨论】:

    • 动画回滚工作正常,但我需要关注它加载动画的位置。
    • @Shanaka 我已经更新了动画加载位置的答案
    • 是的,干得好!这里只是一点点评论: -webkit- 也被 chrome 使用。而且您不必将 -webkit-xxx 转换放在 @keyframes 子句中,对于带有转换线的 @-webkit-keyframes 也是如此。它不会被使用。
    • @Alex 和 Dilip 谢谢你的回答对我的问题最有帮助和相关。
    • Dilip mhh 我的意思是响应浏览器规范,您应该使用相同的语法:在 @-webkit-keyframes { -... -webkit-transform : ... } 和 @keyframes { 中。 .. 转换 : ....} 。就是这样:)
    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    相关资源
    最近更新 更多