ReactJS - アニメーション:コンポーネントを生き生きとする
こんにちは、未来のReactアニメーションの魔術師たち!このエキサイティングなReactJSアニメーションの旅にあなたを案内できることを誇りに思います。コンピュータサイエンスを教えてきた者として、アニメーションはアプリケーションを単なる機能的なものから、非常に楽しいものにする秘伝のソースのようなものだと言えます。それでは、さっそくコンポーネントを踊らせましょう!
React Transition Groupの魔法
アニメーションを始める前に、React Transition Groupについて理解しましょう。これをツールボックスに例えると、スムーズで目を引くトランジションをReactアプリケーションで作成するのに役立つ素晴らしいガジェットが詰まっています。
React Transition Groupのインストール
まず第一に、React Transition Groupをプロジェクトに招待しましょう。ターミナルを開き、以下のコマンドを入力します:
npm install react-transition-group
または、yarnを使っている場合は:
yarn add react-transition-group
素晴らしい!今あなたはアニメーションのスーパーパワーの手に入れました。
トランジション:アニメーションの基本単位
Transition
コンポーネントは、家の基礎のようなものです。これを基盤にしてアニメーションを構築します。簡単な例で実際に見てみましょう:
import React, { useState } from 'react';
import { Transition } from 'react-transition-group';
const duration = 300;
const defaultStyle = {
transition: `opacity ${duration}ms ease-in-out`,
opacity: 0,
}
const transitionStyles = {
entering: { opacity: 1 },
entered: { opacity: 1 },
exiting: { opacity: 0 },
exited: { opacity: 0 },
};
const FadeInOut = () => {
const [inProp, setInProp] = useState(false);
return (
<div>
<Transition in={inProp} timeout={duration}>
{state => (
<div style={{
...defaultStyle,
...transitionStyles[state]
}}>
フェードイン・フェードアウトするテキストです!
</div>
)}
</Transition>
<button onClick={() => setInProp(!inProp)}>
クリックしてフェード
</button>
</div>
);
};
これを分解してみましょう:
-
Transition
をreact-transition-group
からインポートします。 - 初期状態の
defaultStyle
とトランジションの各段階のtransitionStyles
を設定します。 -
FadeInOut
コンポーネントは、表示状態を制御するためのinProp
という状態を持っています。 -
Transition
コンポーネントには、表示状態のin
とアニメーション時間のtimeout
という主要なプロパティがあります。 -
Transition
内部では、現在のトランジション状態を受け取る関数を使用して、適切なスタイルを適用します。
ボタンをクリックすると、テキストがスムーズにフェードインしてフェードアウトします。魔法のように感じますよね?
CSSTransition:CSSとReactの遭遇
それでは、CSSTransition
でゲームをレベルアップしましょう。これはTransition
の cooler な兄弟で、CSSクラスとシームレスに働きます。楽しい例を見てみましょう:
import React, { useState } from 'react';
import { CSSTransition } from 'react-transition-group';
import './styles.css'; // これをすぐに作成します
const Superhero = () => {
const [inProp, setInProp] = useState(false);
return (
<div>
<CSSTransition in={inProp} timeout={300} classNames="super">
<div className="superhero">
私はスーパーヒーローだ!
</div>
</CSSTransition>
<button onClick={() => setInProp(!inProp)}>
変身!
</button>
</div>
);
};
そして、CSS (styles.css
) は以下の通りです:
.superhero {
background-color: #f0f0f0;
padding: 20px;
border-radius: 5px;
}
.super-enter {
opacity: 0;
transform: scale(0.9);
}
.super-enter-active {
opacity: 1;
transform: translateX(0);
transition: opacity 300ms, transform 300ms;
}
.super-exit {
opacity: 1;
}
.super-exit-active {
opacity: 0;
transform: scale(0.9);
transition: opacity 300ms, transform 300ms;
}
以下のようになります:
-
CSSTransition
を使います。 -
classNames="super"
を指定して、super-enter
、super-enter-active
などのクラスを使います。 - CSSで各トランジション段階の見た目を定義します。
「変身!」をクリックすると、スーパーヒーローが壮大に現れて消えます。まるでスーパーヒーロー映画を見ているようなものです!
TransitionGroup:複数のトランジションを管理する
最後に、TransitionGroup
について話しましょう。これはオーケストラの指揮者のように、複数のトランジションを一度に管理します。実用的な例を見てみましょう:
import React, { useState } from 'react';
import { CSSTransition, TransitionGroup } from 'react-transition-group';
import './list-styles.css';
const TodoList = () => {
const [items, setItems] = useState([]);
const [inputValue, setInputValue] = useState('');
const addItem = () => {
setItems([...items, { id: Date.now(), text: inputValue }]);
setInputValue('');
};
const removeItem = (id) => {
setItems(items.filter(item => item.id !== id));
};
return (
<div>
<input
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
placeholder="タスクを入力"
/>
<button onClick={addItem}>追加</button>
<TransitionGroup className="todo-list">
{items.map(({ id, text }) => (
<CSSTransition
key={id}
timeout={500}
classNames="item"
>
<div className="todo-item">
{text}
<button onClick={() => removeItem(id)}>X</button>
</div>
</CSSTransition>
))}
</TransitionGroup>
</div>
);
};
対応するCSS (list-styles.css
):
.todo-list {
list-style-type: none;
padding: 0;
}
.todo-item {
background-color: #f9f9f9;
border: 1px solid #ddd;
padding: 10px;
margin-bottom: 10px;
display: flex;
justify-content: space-between;
}
.item-enter {
opacity: 0;
}
.item-enter-active {
opacity: 1;
transition: opacity 500ms ease-in;
}
.item-exit {
opacity: 1;
}
.item-exit-active {
opacity: 0;
transition: opacity 500ms ease-in;
}
この例では、アイテムが追加されたときにフェードインし、削除されたときにフェードアウトします。以下のようになります:
-
TransitionGroup
でリストをラップします。 - 各アイテムを
CSSTransition
でラップします。 - アイテムが追加または削除されたときに、
TransitionGroup
がトランジションを自動的に管理します。
結果として、プロジェクトマネージャーも誇りに思えるスムーズでプロフェッショナルなトゥードリストが完成します!
締め括り
そしてここまで、Reactアニメーションの世界を旅しました。基本的なTransition
から強力なTransitionGroup
まで。忘れてはならないのは、アニメーションはただ見た目を華やかにするだけではなく、ユーザーをアプリケーションの中で導く直感的なインターフェースを作成するためのものです。
以下に、カバーしたメソッドの簡単な参照表を示します:
コンポーネント | 使用用途 | 主要なプロパティ |
---|---|---|
Transition | 基本的なトランジション |
in , timeout
|
CSSTransition | CSSベースのトランジション |
in , timeout , classNames
|
TransitionGroup | 複数のトランジションを管理 |
component (オプション) |
それでは、アニメーションを試みましょう!そして、強力な力は責任と共に来ます。アニメーションを賢く使えば、ユーザーは感謝してくれるでしょう。ハッピーコーディング!
Credits: Image by storyset