npm install react-morph
# or
yarn add react-morph
- Create two states as you normally do (HTML + CSS).
- Wrap both in one
<ReactMorph>
- Label the elements you wanna morph with
from("a-key")
andto("a-key")
- Perform the magic with
go(0)
orgo(1)
import React from "react";
import ReactMorph from "react-morph";
<ReactMorph>
{({ from, to, fadeIn, go }) => (
<div>
<a onClick={() => go(1)}>
<strong {...from("title")}>ReactMorph 🐛</strong>
<br />
<p {...from("description")}>Morphing transitions was never so easy!</p>
</a>
<div>
<h1 {...to("title")}>ReactMorph 🦋</h1>
<br />
<h2 {...to("description")}>Morphing transitions was never so easy!</h2>
<a onClick={() => go(0)} {...fadeIn()}>
Back
</a>
</div>
</div>
)}
</ReactMorph>
- Simplicity
- No hardcoded absolute positions
- All GPU accelerated props
- No Layout or Paint browser rendering
Caveats:
- You need to remove extra white spaces, to match the real element's width, the solutions is
display: inline-block
or a wrapping element to the content. - Margins it's always tricky because create extra white space, you could either wrap the content in another element and animate it or be sure to match both state margins.
- Sometimes it's necessary to create a placeholder element for the transition to avoid child distortion.
- List items could be miss calculated, a simple solution is:
list-style: none;
. - Sometimes you need extra layers instead of nested children.
- Avoid animating both parent and children to avoid unpredicted results.
Warning wip
- Recalculate positions on window resize
- ? Optional portal for the second state ?