【问题标题】:Webkit CSS Animation issue - persisting the end state of the animation? [duplicate]Webkit CSS Animation 问题 - 保持动画的结束状态? [复制]
【发布时间】:2011-03-17 10:52:26
【问题描述】:

鉴于以下 CSS3 动画......

<style type="text/css" media="screen">

.drop_box {
  -webkit-animation-name: drop;
  -webkit-animation-duration: 2s;
  -webkit-animation-iteration-count: 1;
}

@-webkit-keyframes drop {

  from {
    -webkit-transform: translateY(0px);
  }

  to {
    -webkit-transform: translateY(100px);
  }

}
</style>

<div class="drop_box">  
    Hello world
</div>

Hello World 文本按预期动画下降 100 像素。但是,在动画结束时,它会跳回原来的位置。

显然这在 CSSland 中是有意义的。动画已应用且不再作用于元素,因此原始样式生效。不过,这对我来说似乎有点奇怪 - 如果有人将一个元素设置为动画,那么人们会期望这种放置会持续存在吗?

有没有什么方法可以让结束位置变得“粘性”,而无需借助 Javascript 在动画结束时将类名或样式标记到元素上以修复其更改的属性?我知道transitions persist,但是对于我有问题的动画(示例仅用于演示目的)过渡并没有提供所需的控制级别。没有这个,复杂的动画似乎只能用于元素最终回到其原始状态的循环过程。

【问题讨论】:

    标签: css css-animations


    【解决方案1】:

    还有另一种方法,只是为了好玩,

        <style type="text/css" media="screen">
    
    .drop_box {
       position:absolute;
       top:100px;
      -webkit-animation-name: drop;
      -webkit-animation-duration: 2s;
      -webkit-animation-iteration-count: 1;
    }
    
    @-webkit-keyframes drop {
    
      from {
      -webkit-transform: translateY(-100px);
      }
    
      to {
      -webkit-transform: translateY(0px);
      }
    
    }
    </style>
    
    <div class="drop_box">  
    Hello world
    </div>
    

    【讨论】:

      【解决方案2】:

      只是为了在此处添加出色的答案,您可以使用诸如 jQuery Transit 之类的 JavaScript 框架来为您处理 CSS3 转换。

      根据您将要执行的过渡/效果的数量,这可能是保持代码整洁的更好解决方案,而不是跟上包含所有效果的大型 CSS 文件。

      这是一个非常简单的单线,可以完成您想要的:

      Javascript:

      $(".drop_box").transition({y: "+=100px"}, 2000);
      

      JS Fiddle Demo

      【讨论】:

        【解决方案3】:

        如果您在类中定义结束状态,那么它应该在示例中执行您想要的操作:

        .drop_box {
            -webkit-transform: translateY(100px);
            -webkit-animation-name: drop;
            -webkit-animation-duration: 2s;
            -webkit-animation-iteration-count: 1;
        }
        

        但是,如果您的动画无论如何都是事件驱动的,那么您最终可能不得不使用一点 JavaScript。最简单的方法是添加带有结束状态的类来触发动画开始。

        --编辑

        有关April 2012 WD 中添加的animation-fill-mode 属性的信息,请参阅dino's answer。

        【讨论】:

        • 刚回来发帖 :-) 是的,似乎一个 必须 使用 javascript 来实现这一点。不是一个大问题,但对于动画模块的意义还是有点失望。
        • @Govan 早在 3 月份,关于 W3C www 样式列表的一些相当长的讨论就该标准最终应该是什么样子 (lists.w3.org/Archives/Public/www-style/2010Mar/0469.html) 以及是否有单独的动画和过渡完全没有(lists.w3.org/Archives/Public/www-style/2010Mar/0230.html)。完全有可能,如果标准向前发展,将会有更好的方法来指定静态结束状态。
        • 似乎 JS 在所有情况下都不是必需的。正如 Robertc 所建议的,实际上可以在类中定义最终状态。例如,如果您为顶部设置动画,则将类中的顶部设置为您希望它在末尾的任何值,然后为动画设置您的值。这至少适用于 Safari。这样
        【解决方案4】:

        您可以使用 -webkit-animation-fill-mode 来保持结束状态(甚至向后扩展开始状态)。它不久前被添​​加到 WebKit 中,并在 iOS 4 和 Safari 5 中发布。

        -webkit-animation-fill-mode: forwards;
        

        【讨论】:

        • 你确定这在 iOS 4 中受支持吗?这适用于我们的 Chrome,但不适用于 iOS 4 上的 Mobile Safari。
        • 确认在 iOS 4 和 iOS 5 上工作。
        • 我一直被告知要做pause 和-webkit-animation-play-state,但你必须在动画完成后使用 JS 将其放入其中(丑陋)。这是完美的!
        • 完美答案。非常感谢!
        • Mozilla 也支持:-moz-animation-fill-mode: forwards;
        【解决方案5】:

        我认为您可能正在寻找的是:

        0% {
          -webkit-transform: translateY(0px);
        }
        
        100% {
          -webkit-transform: translateY(100px);
        }
        

        这应该把它留在正确的地方。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-19
          • 1970-01-01
          • 2012-10-11
          • 2013-03-18
          • 1970-01-01
          相关资源
          最近更新 更多