framer-motion ライブラリを使用して div マウントをアニメーション化しています
これは私が持っているものです:
(:require [framer-motion :refer (motion MagicMotion AnimateSharedLayout AnimatePresence useSpring useMotionValue useTransform useViewportScroll) :as motion])
(def div (.-div motion))
(defn my-component []
[:> div {
:initial {:opacity 0}
:animate {:opacity 1}
:exit {:opacity 0}}
"Show Me"])
そして、ブール値のshow-my-component? ボタンをクリックすると false から true に変更されます (ブール値の show-my-component を管理するために re-frame を使用していますが、ここではコードを簡略化しています):
[:button {:on-click (change-show-my-component-boolean-to-true)}]
(if show-my-component? [my-component])
ただし、:>div を使用している場合はボタンをクリックしてもコンポーネントはすぐには表示されませんが、通常の :div を使用している場合は表示されますが、後者の場合はもちろんアニメーションはありません。
:> div を使用する場合、my-component を表示するには、Web ページのどこかを再度フォーカスするかクリックする必要があります。
- 編集 -
0 から 1 までの不透明度アニメーションは、ページの読み込み時ではなく、クリック時にトリガーされます。コンポーネントは初めてフォーカスされていません。ウィンドウが再フォーカスされるとフォーカスされ、アニメーションがトリガーされます。Reagent は、ページの読み込み時にフレーマー モーションの motion.div オブジェクトを自動的にフォーカスしません。同じ状況で反応します。
Framer Motion の状態:
https://www.framer.com/api/motion/animation/#mount-animations "マウントアニメーション
コンポーネントがマウントされると、スタイルまたはイニシャルで定義された値と異なる場合、animate の値に自動的にアニメーション化されます。初期プロパティを false に設定して、animate の値をコンポーネントのマウント状態として使用し、マウント アニメーションを無効にすることができます。
<motion.div animate={{ x: 100 }} initial={false} /> これは、サーバー側のレンダリングでも機能します。"
コンポーネントは次のようにマウントされます。
<div class="flex flex-col items-center border-5" style="opacity: 0;"></div>
不透明度は 0 です。マウントされた div は :initial に固定されています。
- 編集 -
これらを :> div マップに追加してクリックをシミュレートすると、アニメーションはトリガーされません。
{:ref simulate-click
:on-click #(prn "element clicked!")}
シミュレートクリックは次のとおりです。
(defn simulate-click [e]
(prn "event is " e)
(-> e .click)
)