Transition
Transitionコンポーネントを使用すると、条件付きでレンダリングされる要素にエンター/リーブトランジションを追加できます。トランジションのさまざまな段階で実際のトランジションスタイルを制御するために、CSSクラスを使用します。
開始するには、npm経由でHeadless UIをインストールします。
npm install @headlessui/react
Transition
は、子要素を表示または非表示にするかどうかを制御するshow
プロップと、トランジションの特定のフェーズでCSSクラスを追加できる一連のライフサイクルプロップ(enterFrom
、leaveTo
など)を受け入れます。
import { Transition } from '@headlessui/react' import { useState } from 'react' function MyComponent() { const [isShowing, setIsShowing] = useState(false) return ( <> <button onClick={() => setIsShowing((isShowing) => !isShowing)}> Toggle </button> <Transition show={isShowing} enter="transition-opacity duration-75" enterFrom="opacity-0" enterTo="opacity-100" leave="transition-opacity duration-150" leaveFrom="opacity-100" leaveTo="opacity-0" > I will fade in and out </Transition> </> ) }
条件付きでレンダリングするコンテンツを<Transition>
コンポーネントでラップし、show
プロップを使用してコンテンツを表示または非表示にするかどうかを制御します。
import { Transition } from '@headlessui/react' import { useState } from 'react' function MyComponent() { const [isShowing, setIsShowing] = useState(false) return ( <> <button onClick={() => setIsShowing((isShowing) => !isShowing)}>
Toggle</button> <Transition show={isShowing}>I will appear and disappear.</Transition> </> ) }
デフォルトでは、トランジションコンポーネントはdiv
要素をレンダリングします。
as
プロップを使用して、異なる要素または独自のカスタムコンポーネントとしてコンポーネントをレンダリングします。カスタムコンポーネントがforward refsを使用していることを確認して、Headless UIが正しく接続できるようにします。
import { forwardRef, useState, Fragment } from 'react' import { Dialog, Transition } from '@headlessui/react'
let MyDialogPanel = forwardRef(function (props, ref) {return <Dialog.Panel className="…" ref={ref} {...props} />})function MyDialog() { let [isOpen, setIsOpen] = useState(true) return ( <Transitionas={Dialog}show={isOpen} onClose={() => setIsOpen(false)} > <Transition.Childas={MyDialogPanel}enter="ease-out duration-300" enterFrom="opacity-0 scale-95" enterTo="opacity-100 scale-100" leave="ease-in duration-200" leaveFrom="opacity-100 scale-100" leaveTo="opacity-0 scale-95" > <Dialog.Title>Deactivate account</Dialog.Title> {/* ... */} </Transition.Child> </Transition> ) }
デフォルトでは、Transition
は瞬時にエンターおよびリーブします。このコンポーネントを使用している場合、おそらくこれは望ましい動作ではありません。
エンター/リーブトランジションをアニメーション化するには、これらのプロップを使用して、トランジションの各フェーズのスタイルを提供するクラスを追加します。
- enter:要素がエンターしている間ずっと適用されます。通常、ここでは期間とトランジションさせたいプロパティを定義します。たとえば、
transition-opacity duration-75
など。 - enterFrom:エンターを開始する時点。たとえば、フェードインする場合は
opacity-0
。 - enterTo:エンターが終了する時点。たとえば、フェードイン後なら
opacity-100
。 - leave:要素がリーブしている間ずっと適用されます。通常、ここでは期間とトランジションさせたいプロパティを定義します。たとえば、
transition-opacity duration-75
など。 - leaveFrom:リーブを開始する時点。たとえば、フェードアウトする場合は
opacity-100
。 - leaveTo:リーブが終了する時点。たとえば、フェードアウト後なら
opacity-0
。
例を示します。
import { Transition } from '@headlessui/react' import { useState } from 'react' function MyComponent() { const [isShowing, setIsShowing] = useState(false) return ( <> <button onClick={() => setIsShowing((isShowing) => !isShowing)}> Toggle </button>
<Transitionshow={isShowing}enter="transition-opacity duration-75"enterFrom="opacity-0"enterTo="opacity-100"leave="transition-opacity duration-150"leaveFrom="opacity-100" leaveTo="opacity-0" > I will fade in and out </Transition> </> ) }
この例では、トランジション要素はエンターに75ミリ秒かかります(duration-75
クラス)。その間、opacityプロパティがトランジションします(transition-opacity
)。
エンターする前は完全に透明になり(enterFrom
フェーズのopacity-0
)、完了すると完全に不透明になります(enterTo
フェーズのopacity-100
)。
要素が削除されている場合(leave
フェーズ)、opacityプロパティがトランジションし、150ミリ秒かかります(transition-opacity duration-150
)。
完全に不透明な状態から開始し(leaveFrom
フェーズのopacity-100
)、完全に透明な状態に終了します(leaveTo
フェーズのopacity-0
)。
これらのプロップはすべてオプションであり、デフォルトでは空の文字列になります。
複数の要素を異なるアニメーションでトランジションさせる必要がある場合がありますが、すべて同じ状態に基づいています。たとえば、ユーザーがボタンをクリックして画面上にスライドするサイドバーを開き、同時に背景オーバーレイをフェードインする必要があるとします。
親Transition
コンポーネントで関連する要素をラップし、独自のトランジションスタイルが必要な各子をTransition.Child
コンポーネントでラップすることで、これを実行できます。これにより、親Transition
と自動的に通信し、親のshow
状態を継承します。
import { Transition } from '@headlessui/react' function Sidebar({ isShowing }) { return ( /* The `show` prop controls all nested `Transition.Child` components. */ <Transition show={isShowing}> {/* Background overlay */} <Transition.Child enter="transition-opacity ease-linear duration-300" enterFrom="opacity-0" enterTo="opacity-100" leave="transition-opacity ease-linear duration-300" leaveFrom="opacity-100" leaveTo="opacity-0" > {/* ... */} </Transition.Child> {/* Sliding sidebar */} <Transition.Child enter="transition ease-in-out duration-300 transform" enterFrom="-translate-x-full" enterTo="translate-x-0" leave="transition ease-in-out duration-300 transform" leaveFrom="translate-x-0" leaveTo="-translate-x-full" > {/* ... */} </Transition.Child> </Transition> ) }
Transition.Child
コンポーネントのAPIはTransition
コンポーネントとまったく同じですが、show
値は親によって制御されるため、show
プロップはありません。
親Transition
コンポーネントは、アンマウントする前に、常にすべての子のトランジションが完了するのを自動的に待機するため、タイミングを自分で管理する必要はありません。
要素を最初にレンダリングしたときにトランジションさせたい場合は、appear
プロップをtrue
に設定します。
これは、最初のページ読み込み時や親が条件付きでレンダリングされるときに、何かをトランジションさせたい場合に便利です。
import { Transition } from '@headlessui/react' function MyComponent({ isShowing }) { return ( <Transition
appear={true}show={isShowing} enter="transition-opacity duration-75" enterFrom="opacity-0" enterTo="opacity-100" leave="transition-opacity duration-150" leaveFrom="opacity-100" leaveTo="opacity-0" > {/* Your content goes here*/} </Transition> ) }
プロパティ | デフォルト | 説明 |
show | — | ブール値 子要素を表示または非表示にするかどうか。 |
as | div | 文字列 | コンポーネント Transition自体のかわりにレンダリングする要素またはコンポーネント。 |
appear | false | ブール値 初期マウント時にトランジションを実行するかどうか。 |
unmount | true | ブール値 show状態に基づいて要素をアンマウントまたは非表示にするかどうか。 |
enter | — | 文字列 エンターフェーズ全体でトランジション要素に追加するクラス。 |
enterFrom | — | 文字列 エンターフェーズが開始する前にトランジション要素に追加するクラス。 |
enterTo | — | 文字列 エンターフェーズが開始した直後にトランジション要素に追加するクラス。 |
entered | — | 文字列 トランジションが完了したらトランジション要素に追加するクラス。これらのクラスはその後、リーブするまで保持されます。 |
leave | — | 文字列 リーブフェーズ全体でトランジション要素に追加するクラス。 |
leaveFrom | — | 文字列 リーブフェーズが開始する前にトランジション要素に追加するクラス。 |
leaveTo | — | 文字列 リーブフェーズが開始した直後にトランジション要素に追加するクラス。 |
beforeEnter | — | () => void エンタートランジションを開始する前に呼び出されるコールバック。 |
afterEnter | — | () => void エンタートランジションが完了した後に呼び出されるコールバック。 |
beforeLeave | — | () => void リーブルトランジションを開始する前に呼び出されるコールバック。 |
afterLeave | — | () => void リーブルトランジションが完了した後に呼び出されるコールバック。 |
プロパティ | デフォルト | 説明 |
as | div | 文字列 | コンポーネント Transition自体のかわりにレンダリングする要素またはコンポーネント。 |
appear | false | ブール値 初期マウント時にトランジションを実行するかどうか。 |
unmount | true | ブール値 show状態に基づいて要素をアンマウントまたは非表示にするかどうか。 |
enter | — | 文字列 エンターフェーズ全体でトランジション要素に追加するクラス。 |
enterFrom | — | 文字列 エンターフェーズが開始する前にトランジション要素に追加するクラス。 |
enterTo | — | 文字列 エンターフェーズが開始した直後にトランジション要素に追加するクラス。 |
entered | — | 文字列 トランジションが完了したらトランジション要素に追加するクラス。これらのクラスはその後、リーブするまで保持されます。 |
leave | — | 文字列 リーブフェーズ全体でトランジション要素に追加するクラス。 |
leaveFrom | — | 文字列 リーブフェーズが開始する前にトランジション要素に追加するクラス。 |
leaveTo | — | 文字列 リーブフェーズが開始した直後にトランジション要素に追加するクラス。 |
beforeEnter | — | () => void エンタートランジションを開始する前に呼び出されるコールバック。 |
afterEnter | — | () => void エンタートランジションが完了した後に呼び出されるコールバック。 |
beforeLeave | — | () => void リーブルトランジションを開始する前に呼び出されるコールバック。 |
afterLeave | — | () => void リーブルトランジションが完了した後に呼び出されるコールバック。 |