首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Clojurescript Om创建动画

使用Clojurescript Om创建动画
EN

Stack Overflow用户
提问于 2014-04-29 23:06:18
回答 2查看 2.2K关注 0票数 10

我一直在寻找如何在Om中创建动画,我已经尝试创建了一个RaphaelJs组件,并取得了一定的成功。我得到了我想要的动画,但是由于某种原因,Om呈现了SVG元素的多个实例。

查看animation example in the Om github folder时,使用setInterval来更改要设置动画的值,这并不理想。

我知道CSSTransitionGroup插件,但它看起来你只能在CSS中定义的预设动画之间切换,你不能决定做一些事情,比如渲染一个路径,然后让一个形状跟随它并随机计时。如果你可以使用它动态定义动画,请随时纠正我。

有没有人有简单动画的好例子?只要平移或旋转简单的形状就可以让我知道如何从那里开始处理它。

EN

回答 2

Stack Overflow用户

发布于 2014-11-25 21:04:13

您可以使用CSSTransitionGroup设置位置/移动、方向和其他视觉属性的动画效果,如不透明度、颜色、边框或阴影(可能使用keyframes)或更多complex hacks。这种方法的主要限制是,它只允许您以动画的方式安装和卸载组件,然后只能通过CSS中定义的动画。

如果您需要在组件挂载的生命周期内为其设置动画,或者希望对可以设置动画的内容进行更细粒度的控制,则可能需要采用另一种方法like what I do in this code

这就是您在Om.中使用CSSTransitionGroup的方式

要实现这一点,你需要使用React的with-addons版本(例如react-with-addons-0.12.1.jsreact-with-addons-0.12.1.min.js)。

代码语言:javascript
复制
(def css-trans-group (-> js/React (aget "addons") (aget "CSSTransitionGroup"))) 
(defn transition-group
  [opts component]
  (let [[group-name enter? leave?] (if (map? opts)
                                     [(:name opts) (:enter opts) (:leave opts)]
                                     [opts true true])]
    (apply
      css-trans-group
      #js {:transitionName group-name
           :transitionEnter enter?
           :transitionLeave leave?}
      component)))

然后,您可以执行以下操作来使用它:

代码语言:javascript
复制
(transition-group "example" (when visible? (om/build my-component data)))

现在切换visible?以设置正在挂载和卸载的my-component的动画。如果要禁用enter或leave动画:

代码语言:javascript
复制
(transition-group
  {:name "example"
   :enter false} ; Only animate when component gets unmounted, not when mounted
  (when visible? (om/build my-component data)))

您还可以以动画形式在项目列表中添加或删除项目:

代码语言:javascript
复制
(transition-group "example" (om/build-all my-component list-of-data))

或者使用map,可能是这样的:

代码语言:javascript
复制
(transition-group "example" (map #(dom/li %) list-of-data))

您还需要添加正确的CSS:

代码语言:javascript
复制
.example-enter {
  opacity: 0.01;
  transition: opacity .5s ease-in;
}

.example-enter.example-enter-active {
  opacity: 1;
}

.example-leave {
  opacity: 1;
  transition: opacity .5s ease-in;
}

.example-leave.example-leave-active {
  opacity: 0.01;
}

请注意,除非禁用其中一个动画,否则需要在CSS中同时包含这两个动画。例如,如果省略leave动画,则组件可能无法卸载,因为React将挂起,等待动画完成。简单的解决方法是使用{:leave false}禁用它,或者在CSS中包含leave动画。

另一个需要注意的陷阱是:这个will only animate child components if the transition group is mounted before the children。如果同时挂载子对象和过渡组,则不会设置它们的动画。这有时可能有点尴尬。例如,上面的代码片段在没有(when visible? ...)的情况下将不会有动画效果,因为如果不切换,子对象将与转换组同时挂载。此外,如果list-of-data不是预先填充的,而是在挂载后填充的,则下面的build-all示例效果最好。因此,CSSTransitionGroups最适用于在视图/组件或用户修改的数据列表之间切换的代码,但不适用于页面加载时组件的初始动画显示。

可能是这样的:

代码语言:javascript
复制
(transition-group "view-selection"
  (condp = current-view
    "home" (om/build home-page data)
    "blog" (om/build blog-page data)
    "about" (om/build about-page data)
    :else (om/build error-404-page data)))

-

最后,如果您不希望使用助手函数,可以直接使用css-trans-group

代码语言:javascript
复制
    (css-trans-group
      #js {:transitionName "example"}
      (when visible? (om/build my-component data)))))

或者,如果使用子组件列表(例如通过mapbuild-all):

代码语言:javascript
复制
    (apply
      css-trans-group
      #js {:transitionName "example"}
      (om/build-all my-component list-of-data))))

我还没有用过low-level TransitionGroup API。更多信息可以在React CSSTransitionGroup page上找到。

票数 12
EN

Stack Overflow用户

发布于 2015-02-20 00:52:30

注意查看https://github.com/chenglou/react-tween-statehttps://github.com/chenglou/react-state-stream的ClojureScript端口

TransitionGroup只提供了一些帮助程序来挂钩一些生命周期事件。从理论上讲,它与动画无关。如果你想要一个真正的动画API,看看我上面做的两件事。readmes应该为其余部分提供足够的信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23368485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档