## Transition [View live demo on CodeSandbox](https://codesandbox.io/s/headlessuireact-menu-example-b6xje?file=/src/App.js) The `Transition` component lets you add enter/leave transitions to conditionally rendered elements, using CSS classes to control the actual transition styles in the different stages of the transition. - [Installation](#installation) - [Basic example](#basic-example) - [Showing and hiding content](#showing-and-hiding-content) - [Animating transitions](#animating-transitions) - [Co-ordinating multiple transitions](#co-ordinating-multiple-transitions) - [Transitioning on initial mount](#transitioning-on-initial-mount) - [Component API](#component-api) ### Installation ```sh # npm npm install @headlessui/react # Yarn yarn add @headlessui/react ``` ### Basic example The `Transition` accepts a `show` prop that controls whether the children should be shown or hidden, and a set of lifecycle props (like `enterFrom`, and `leaveTo`) that let you add CSS classes at specific phases of a transition. ```tsx import { Transition } from '@headlessui/react' import { useState } from 'react' function MyComponent() { const [isOpen, setIsOpen] = useState(false) return ( <> I will fade in and out ) } ``` ### Showing and hiding content Wrap the content that should be conditionally rendered in a `` component, and use the `show` prop to control whether the content should be visible or hidden. ```tsx import { Transition } from '@headlessui/react' import { useState } from 'react' function MyComponent() { const [isOpen, setIsOpen] = useState(false) return ( <> I will fade in and out ) } ``` The `Transition` component will render a `div` by default, but you can use the `as` prop to render a different element instead if needed. Any other HTML attributes (like `className`) can be added directly to the `Transition` the same way they would be to regular elements. ```tsx import { Transition } from '@headlessui/react' import { useState } from 'react' function MyComponent() { const [isOpen, setIsOpen] = useState(false) return ( <> I will fade in and out ) } ``` ### Animating transitions By default, a `Transition` will enter and leave instantly, which is probably not what you're looking for if you're using this library. To animate your enter/leave transitions, add classes that provide the styling for each phase of the transitions using these props: - **enter**: Applied the entire time an element is entering. Usually you define your duration and what properties you want to transition here, for example `transition-opacity duration-75`. - **enterFrom**: The starting point to enter from, for example `opacity-0` if something should fade in. - **enterTo**: The ending point to enter to, for example `opacity-100` after fading in. - **leave**: Applied the entire time an element is leaving. Usually you define your duration and what properties you want to transition here, for example `transition-opacity duration-75`. - **leaveFrom**: The starting point to leave from, for example `opacity-100` if something should fade out. - **leaveTo**: The ending point to leave to, for example `opacity-0` after fading out. Here's an example: ```tsx import { Transition } from '@headlessui/react' import { useState } from 'react' function MyComponent() { const [isOpen, setIsOpen] = useState(false) return ( <> I will fade in and out ) } ``` In this example, the transitioning element will take 75ms to enter (that's the `duration-75` class), and will transition the opacity property during that time (that's `transition-opacity`). It will start completely transparent before entering (that's `opacity-0` in the `enterFrom` phase), and fade in to completely opaque (`opacity-100`) when finished (that's the `enterTo` phase). When the element is being removed (the `leave` phase), it will transition the opacity property, and spend 150ms doing it (`transition-opacity duration-150`). It will start as completely opaque (the `opacity-100` in the `leaveFrom` phase), and finish as completely transparent (the `opacity-0` in the `leaveTo` phase). All of these props are optional, and will default to just an empty string. ### Co-ordinating multiple transitions Sometimes you need to transition multiple elements with different animations but all based on the same state. For example, say the user clicks a button to open a sidebar that slides over the screen, and you also need to fade-in a background overlay at the same time. You can do this by wrapping the related elements with a parent `Transition` component, and wrapping each child that needs its own transition styles with a `Transition.Child` component, which will automatically communicate with the parent `Transition` and inherit the parent's `show` state. ```tsx import { Transition } from '@headlessui/react' function Sidebar({ isOpen }) { return ( {/* Background overlay */} {/* ... */} {/* Sliding sidebar */} {/* ... */} ) } ``` The `Transition.Child` component has the exact same API as the `Transition` component, but with no `show` prop, since the `show` value is controlled by the parent. Parent `Transition` components will always automatically wait for all children to finish transitioning before unmounting, so you don't need to manage any of that timing yourself. ### Transitioning on initial mount If you want an element to transition the very first time it's rendered, set the `appear` prop to `true`. This is useful if you want something to transition in on initial page load, or when its parent is conditionally rendered. ```tsx import { Transition } from '@headlessui/react' function MyComponent({ isShowing }) { return ( {/* Your content goes here*/} ) } ``` ### Component API #### Transition ```jsx {/* Your content goes here*/} ``` ##### Props | Prop | Type | Default | Description | | :------------ | :------------------ | :------ | :------------------------------------------------------------------------------------ | | `show` | Boolean | - | Whether the children should be shown or hidden. | | `as` | String \| Component | `div` | The element or component to render in place of the `Transition` itself. | | `appear` | Boolean | `false` | Whether the transition should run on initial mount. | | `unmount` | Boolean | `true` | Whether the element should be `unmounted` or `hidden` based on the show state. | | `enter` | String | `''` | Classes to add to the transitioning element during the entire enter phase. | | `enterFrom` | String | `''` | Classes to add to the transitioning element before the enter phase starts. | | `enterTo` | String | `''` | Classes to add to the transitioning element immediately after the enter phase starts. | | `leave` | String | `''` | Classes to add to the transitioning element during the entire leave phase. | | `leaveFrom` | String | `''` | Classes to add to the transitioning element before the leave phase starts. | | `leaveTo` | String | `''` | Classes to add to the transitioning element immediately after the leave phase starts. | | `beforeEnter` | Function | - | Callback which is called before we start the enter transition. | | `afterEnter` | Function | - | Callback which is called after we finished the enter transition. | | `beforeLeave` | Function | - | Callback which is called before we start the leave transition. | | `afterLeave` | Function | - | Callback which is called after we finished the leave transition. | ##### Render prop object - None #### Transition.Child ```jsx {/* ... */} {/* ... */} ``` ##### Props | Prop | Type | Default | Description | | :------------ | :------------------ | :------ | :------------------------------------------------------------------------------------ | | `as` | String \| Component | `div` | The element or component to render in place of the `Transition.Child` itself. | | `appear` | Boolean | `false` | Whether the transition should run on initial mount. | | `unmount` | Boolean | `true` | Whether the element should be `unmounted` or `hidden` based on the show state. | | `enter` | String | `''` | Classes to add to the transitioning element during the entire enter phase. | | `enterFrom` | String | `''` | Classes to add to the transitioning element before the enter phase starts. | | `enterTo` | String | `''` | Classes to add to the transitioning element immediately after the enter phase starts. | | `leave` | String | `''` | Classes to add to the transitioning element during the entire leave phase. | | `leaveFrom` | String | `''` | Classes to add to the transitioning element before the leave phase starts. | | `leaveTo` | String | `''` | Classes to add to the transitioning element immediately after the leave phase starts. | | `beforeEnter` | Function | - | Callback which is called before we start the enter transition. | | `afterEnter` | Function | - | Callback which is called after we finished the enter transition. | | `beforeLeave` | Function | - | Callback which is called before we start the leave transition. | | `afterLeave` | Function | - | Callback which is called after we finished the leave transition. | ##### Render prop object - None