User avatar

Jeroen Reumkens PRO

Motion animate opacity with strict mode

Unlock Playgrounds

Build, test and share frontend ideas right in your browser.

Choose a plan

Cancel anytime. Playgrounds are also included in PRO. Upgrade later and we credit 100% of your first 3 months and 50% of the rest toward it.

Already a member? Log in

Playground settings

Playground

Anyone with the link can view it. Private playgrounds are only visible to you.

Editor

Applied right away

Files in the same folder share one tab.

Packages

Importable from your code, loaded from esm.sh

import { useAnimate, useInView } from "motion/react";
import { useEffect, useRef } from "react";

export const App = () => {
return (
<div className="px-8">
<p className="text-white text-center pt-8 pb-[100vh]">Scroll down and see the logo animate in</p>
<Card title="Hello" />
</div>
);
};

const Card = ({ title }) => {
const [scope, animate] = useAnimate();
const inViewRef = useRef(null);
const isInView = useInView(inViewRef);
const controlsRef = useRef(null);
useEffect(() => {
controlsRef.current = animate([
[scope.current, { opacity: 1 }],
], {autoplay: false});
}, []);
useEffect(() => {
if (!controlsRef.current) return;
controlsRef.current.speed = isInView ? 1 : -1;
controlsRef.current.play();
}, [isInView])
return (
<>
<section className="h-[20vh] bg-gray-100 mb-8 p-6" ref={inViewRef}>
When this block is in view, the aside should fade in
<aside
ref={scope}
className="fixed top-0 left-0 bar text-black bg-white rounded-2xl px-6 py-12 opacity-0">
<p>{title}</p>
</aside>
</section>
</>
);
}

  • No matching files
↵ open⌘↵ open to the sideesc close