LoginSignup
2
2

More than 3 years have passed since last update.

【CSSinJS】 emotionまとめ

Last updated at Posted at 2020-08-02

概要

create-react-app(ts)での実装でcomponentのstyleをemotionを使って実現したのでそれの共有。

そもそもemotionって何?

JSXファイルの中にスタイルを直接書き込むタイプのCSSinJSライブラリの一つ
最近だとstyled-componentsはよく聞きますよね。。その中で注目度上げてきてるemotionを発見!!
emotionの機能としてとてもCSS prop形式というのがあるんですが、
なんとstyled-componentsと比べてコンポーネントのマウント速度で約4倍、レンダリング速度で約3倍は速いらしい!
使わないわけにいかないと思い使ってみました。

決まり事

emotionをreactで使うにあたって決まりごとがある

- emotionを使う場合は、`JSX Pragma`が必要
- emotionを使っているコンポーネントではフラグメントを使えない

ここだけ守ればemotionは通常に動作するはずです。

二つ目はなんとなくわかると思うので、一つ目を少し詳しく説明すると
JSX Pragmaとは簡単にいうと「僕, emotionで使ってJSX書いてるよ。少し特殊だからEmotion用のコンパイラ通します」
っていうのを明示的に表しています。emotionを使って書いたJSXファイルの冒頭に下記のように記述する感じです!

/** @jsx jsx */
import { jsx } from '@emotion/core';

[注意] 親コンポーネントで JSX Pragma を使 用したら、子のコンポーネントでも JSX Pragma を使わなければなりません

基本的な使い方

適用したいスタイルを定義する。
その変数を適用したいElementにCSS prop形式を使って渡してあげる。
これだけです!!

/** @jsx jsx */
import React from 'react';
import { css, jsx } from '@emotion/core';

const heading = css`
  color: #000;
`;

export const Sample: React.FC = () => {
  return <p css={heading}>サンプル</p>
}

共通スタイル適用

少し使い方を工夫すると以下のように、
共通のスタイルを他のスタイルの変数にextendsみたいなことができます!
直感的でわかりやすいですよね!

/** @jsx jsx */
import React from 'react';
import { css, jsx } from '@emotion/core';

const base = css`
 margin: 0;
`;

const heading = css`
  ${base}
  color: #000;
`;

export const Sample: React.FC = () => {
  return <p css={heading}>サンプル</p>
}

その他の情報

メディアクエリだって簡単!

/** @jsx jsx */
import React from 'react';
import { css, jsx } from '@emotion/core';

const heading = css`
  font-size: 30px;
  @media (min-width: 420px) {
    font-size: 50px;
  }
`;

export const Sample: React.FC = () => {
  return <p css={heading}>サンプル</p>
}

イベントだって簡単!!

/** @jsx jsx */
import React from 'react';
import { css, jsx } from '@emotion/core';

const heading = css`
  opacity: 1;
  &:hover {
    opacity: 0.5;
  }
`;

export const Sample: React.FC = () => {
  return <p css={heading}>サンプル</p>
}

アニメーションだって簡単!!!

/** @jsx jsx */
import React from 'react';
import { css, jsx } from '@emotion/core';

const heading = css`
  animation: fadeIn 1s linear;
  @keyframes fadeIn {
    0% {
      opacity: 0;
    }
    100% {
      opacity: 1;
    }
  }
`;

export const Sample: React.FC = () => {
  return <p css={heading}>サンプル</p>
}
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2