Emotion: css()とstyled()
Emotionのcss()ヘルパーとstyled()コンポーネントファクトリを使って、動的なスタイルを適用します。
「Emotion: css()とstyled()」はCoddyKit上の無料CSS Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCSS Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 CSS Academyコースには全4レッスンが含まれています。
Emotionとは
Emotionは、柔軟なAPIを備えたCSS-in-JSライブラリです。主に2つのアプローチがあります。css()関数(フレームワーク非依存)とstyled() API(styled-componentsに類似)です。どちらもスコープ化されたクラス名を自動生成します。
Emotionのインストール
必要に応じて、2つのパッケージから選択できます。
npm install @emotion/react # css prop and Global
npm install @emotion/styled # styled() API
npm install @emotion/css # framework-agnosticcss()関数
css()関数は、CSSオブジェクトまたはテンプレートリテラルからクラス名を生成します。
import { css } from '@emotion/css';
const buttonStyle = css`
background: royalblue;
color: white;
padding: 10px 20px;
border-radius: 4px;
`;
function Button({ children }) {
return <button className={buttonStyle}>{children}</button>;
}css()でCSSオブジェクトを使用する
オブジェクト構文はテンプレートリテラルの代替手段です。TypeScriptの自動補完が利用できるため便利です。
const cardStyle = css({
background: 'white',
borderRadius: '8px',
padding: '24px',
boxShadow: '0 4px 16px rgba(0,0,0,0.1)'
});styled() API
Emotionのstyledは、両者の移行を容易にするため、styled-componentsと同じように動作します。
import styled from '@emotion/styled';
const Card = styled.div`
background: white;
border-radius: 8px;
padding: 24px;
`;
const FeaturedCard = styled(Card)`
border: 2px solid gold;
`;css prop(インラインスタイル)
Emotionのcss propを使うと、追加のコンポーネントなしでJSX要素に直接スタイルを記述できます。@emotion/reactパッケージと、BabelまたはSWCのプラグインが必要です。
/** @jsxImportSource @emotion/react */
function Component() {
return (
<div css={{ background: 'white', padding: '24px' }}>
Content
</div>
);
}Emotionで動的なスタイルを設定する
どちらのAPIも、動的な値を受け取るprops用の関数に対応しています。
const Badge = styled.span`
background: ${({ variant }) => variant === 'error' ? 'crimson' : 'royalblue'};
color: white;
padding: 2px 8px;
border-radius: 9999px;
`;グローバルスタイル
グローバルCSSには、@emotion/reactのGlobalを使用します。
import { Global, css } from '@emotion/react';
function App() {
return (
<>
<Global styles={css`
*, *::before, *::after { box-sizing: border-box; }
body { margin: 0; }
`} />
</>
);
}Emotionとstyled-componentsの比較
Emotionとstyled-componentsのAPIはほぼ同じです。ベンチマークでは、Emotionのほうがパフォーマンスがやや優れており、バンドルサイズも小さく、追加のAPIとしてcss propも利用できます。どちらもReactアプリで実績のある選択肢です。
Emotionでキーフレームを使用する
keyframesヘルパーを使ってアニメーションを定義します。
import { keyframes, css } from '@emotion/react';
const bounce = keyframes`
from { transform: translateY(0); }
to { transform: translateY(-20px); }
`;
const animated = css`
animation: ${bounce} 1s ease-in-out infinite alternate;
`;サーバーサイドレンダリング
Emotionは、extractCriticalToChunks()を使ってクリティカルCSSを収集し、サーバーレンダリング中に挿入することで、Next.jsのようなReactフレームワークでのSSRに対応します。
確認問題
Emotionのcss()関数とstyled() APIの主な違いは何ですか。
まとめ
Emotionには主に2つのスタイリングAPIがあります。css()はクラス名を生成し、classNameを通じて適用します。styled()はスタイル付きのReactコンポーネントを作成します。css propを使うと、インラインスタイルのように記述しながら、CSSの機能を完全に利用できます。Emotionはstyled-componentsとAPIの互換性が高く、多くの場合より高速です。どちらのアプローチも、生成したクラス名でスタイルを自動的にスコープ化します。
よくある質問
「Emotion: css()とstyled()」レッスンは無料ですか?
はい。「Emotion: css()とstyled()」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、CSS Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 CSS Academyコースには全4レッスンが含まれています。
「Emotion: css()とstyled()」で何を学びますか?
Emotionのcss()ヘルパーとstyled()コンポーネントファクトリを使って、動的なスタイルを適用します。 ブラウザで直接実行するハンズオンコードでCSS Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
CSS Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCSS Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Emotion: css()とstyled()」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCSS Academyレッスンでコードを書いて実行できますか?
はい。すべてのCSS Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Styled-components: Tagged Template Literals
- Emotion: css()とstyled()
- CSS Modules: スコープ付きスタイル
- Vanilla Extract: ゼロランタイムCSS-in-JS