Reactでは、いろんな方法でCSSを当てることができます。
それら複数ある方法についてまとめた。
まず前提知識として、React内にCSSを記述する場合は、CSS-in-JSと言われる、純粋なCSSとは異なる記法で記述します。
CSS記法とJavaScript埋め込みのCSS(CSS-in-JS)の記法の違い
異なるのは以下3点
- キャメルケース
- 末尾のセミコロン;有無
- 文字列とするか
純粋なCSSの記法
border-radius: 8px;
これを、JavaScript 埋め込みのCSSで書くと
borderRadius: "8px"
それでは、Reactで使われる、CSSの異なる4種類の方法について見ていきましょう!
- CSS module
- Styled JSX
- Styled components
- Emotion
違いを表にまとめました!
この中から、どれを使用するかは人、またはチームの好みでうので、ご自身でご選択して使用してください。
style入れ込み | CSS module | Styled JSX | Styled components | Emotion | |||
バッククウォートを使った書き方 | inlinestyleと似た書き方 | styledを使った記法 | |||||
CSS記法 | React | CSS |
CSS |
CSS | CSS | React | CSS |
CSS記述場所 | タグ内 | 別ファイル |
JSX内 |
コンポーネント内 | JSX内 | JSX内 | 同ファイル内 |
とは言っても、どれ使ったら良いのかわからないですよね!
同ファイル内に記述ができて、且つ、JSXの外に記述することでスッキリするStyled componentsがおすすめです。
style入れ込み
タグに入れ込む形で記述することができます。
<div style={{ alignItems: "center" }}>
CSS module
まずは、node-sassをインストールします。
$ npm install node-sass
インストールされているかどうかはpackage.jsonでの確認が可能。
CSSファイルを.module.sassファイルで作成します。
.container {
border: solid 2px green;
}
このCSSをApp.jsでimportし、コンポーネントとして記述します。
import { CssModules } from "./components/CssModules";
export default function App() {
return (
<div className="App">
<CssModules />
</div>
);
}
CssModules.module.scssファイルに記述したCSSを呼び出す変数をclassesとし、classes.containerでCSSの呼び出しができます。
import classes from "./CssModules.module.scss";
export const CssModules = () => {
return (
<div className={classes.container}>
<p>CSS MODULES</p>
<button>Push</button>
</div>
);
};
Styled JSX
これは、CSSをJavaScriptに書くことができる方法です。
ますは、styled-jsxをインストールします。
$ npm install styled-jsx
StyledJSXコンポーネントを作成し、親コンポーネントApp.jsでimportします。
import { StyledJsx } from "./components/StyledJsx";
import "./styles.css";
export default function App() {
return (
<div className="App">
<StyledJsx />
</div>
);
}
StyledJSXコンポーネントの中で以下を記述します。
- styleタグを設け、その中にjsxを明記しJavaScriptを書く
- CSSは{` `}の形で、テンプレート文字列で書く
- CSSを当てるタグにclassNameを指定する
export const StyledJsx = () => {
return (
<>
<div className="container">
<p>Styled JSX</p>
<button>Push</button>
</div>
<style jsx="true">{`
.container {
border: solid 2px green;
}
`}</style>
</>
);
};
Styled components
styled-componentsをインストール
$ npm install styled-components
StyledComponentsコンポーネントを作成し、親コンポーネントApp.jsでimportする。
import { StyledComponents } from "./components/StyledComponents";
export default function App() {
return (
<div className="App">
<StyledComponents />
</div>
);
}
変数名をstyledとして、styled-componentsをimport。
変数をContainerとし、CSSを記述
divタグを、ここで作ったContainerに置き換える。
import styled from "styled-components";
export const StyledComponents = () => {
return (
<Container>
<p>Styled Components</p>
<button>Push</button>
</Container>
);
};
const Container = styled.div`
border: solid 2px green;
`;
これの問題点
このコンポーネントがstyleを当てただけのものなのか、他のコンポーネントからインポートしたコンポーネントなのかがわかりにくいので、頭にStyleのイニシャルであるSを付けるなど、わかりやすい目印を付けるとよい!
Emotion
Emotionを使ったCSSの書き方は3種類あります。
- バッククウォートを使った書き方
- inlinestyleと似た書き方
- styledを使った書き方
@emotion/react と @emotion/styled をインストール
$ yarn add @emotion/react @emotion/styled
Emotionコンポーネントを作成し、親コンポーネントApp.jsでimportします。
import { Emotion } from "./components/Emotion";
import "./styles.css";
export default function App() {
return (
<div className="App">
<Emotion />
</div>
);
}
jsxをimport する。
ReactでEmotionを使用するときのルールとして、importの前に以下を記述する。
/** @jsxRuntime classic */
/** @jsx jsx*/
import { jsx } from "@emotion/react";
Emotionからcssをimport
バッククウォートを使った書き方
変数containerStyleにcssを設定し、divタグで指定する。
/** @jsxRuntime classic */
/** @jsx jsx*/
import { jsx, css } from "@emotion/react";
export const Emotion = () => {
const containerStyle = css`
border: solid 2px green;
`;
return (
<div css={containerStyle}>
<p>Emotion</p>
<button>Push</button>
</div>
);
};
inlinestyleと似た書き方
上記との違いはcssの後の( )部とCSSの書き方。
これは、CSSをReactの記法とする必要がある。
/** @jsxRuntime classic */
/** @jsx jsx*/
import { jsx, css } from "@emotion/react";
export const Emotion = () => {
const containerStyle = css({
border: "solid 2px green"
});
return (
<div css={containerStyle}>
<p>Emotion</p>
<button>Push</button>
</div>
);
};
styledを使った記法
styledをimport
Containerという変数でCSSを定義し、divタグを置き換える。
/** @jsxRuntime classic */
/** @jsx jsx*/
import styled from "@emotion/styled";
export const Emotion = () => {
return (
<Container>
<p>Emotion</p>
<button>Push</button>
</Container>
);
};
const Container = styled.div`
border: solid 2px green;
`;
まとめ
以上、いろいろなCSSの書き方についてまとめました。
基本的なところはあまり違いがないものの、少しずつ異なるのが厄介ですね。
ただ、手間なのは一番最初の記述だけです。一個覚えてしまっておじゃれなデザインをつくっていきましょう!
ご覧いただきありがとうございました。
コメント