emotion은 css-in-js (JavaScript코드에서 CSS를 작성하는 방식) 라이브러리 중 하나로 다음의 특징이있다.
패키지 설치
npm install --save @emotion/react // styled 방식 사용할시 npm install --save @emotion/styled // 스타일을 압축하고 끌어 올려 스타일을 최적화하고 // 소스 맵과 레이블을 사용하여 더 나은 개발자 환경을 만드는 선택적 Babel 플러그인 npm install --save-dev @emotion/babel-plugin
아래와 같이 루트에 .babelrc를 작성하면 /* @jsxImportSource @emotion/react / 를 매 페이지마다 작성 안 해도 됨
// .babelrc { "presets": [ [ "next/babel", { "preset-react": { "runtime": "automatic", "importSource": "@emotion/react" } } ] ], "plugins": ["@emotion/babel-plugin"] }
사용법
import { css } from "@emotion/react"; //css 1 function Home() { return ( <div css={css({ color: "red", })} > css 1 </div> ); } //css 2 function Home() { return ( <div css={css` color: red; `} > css 2 </div> ); } //css 3 // 여러개일 경우 예) css={[abc, def, { paddingBottom: 0 }]} function Home() { return ( <div css={homeContainer} > <p>css 3 </p> </div> ); } const homeContainer = css` width: 100%; p { font-size: 1.4rem; } `;
Global 스타일
//Global.ts import { css } from "@emotion/react"; export const reset = css` * { margin: 0; padding: 0; box-sizing: border-box; font-family: "Pretendard"; font-weight: 400; } html { font-size: 62.5%; } body { width: 100%; height: 100%; font-size: 1.6rem; color: ${colors.black}; background: ${colors.white}; word-break: keep-all; } ul, li { list-style: none; } input, select, textarea { border: 1px solid ${colors.black}; color: ${colors.black}; background: ${colors.white}; } input:focus, select:focus, textarea:focus { outline: none; } a { text-decoration: none; color: ${colors.black}; } button { border: none; outline: 0; background-color: transparent; cursor: pointer; } input:autofill, input:autofill:hover, input:autofill:focus, input:autofill:active { box-shadow: 0 0 0 100rem ${colors.white} inset; -webkit-box-shadow: 0 0 0 3rem ${colors.white} inset !important; -webkit-text-fill-color: ${colors.black} !important; transition: background-color 5000s ease-in-out 0s; } `; //_app.tsx import type { AppProps } from "next/app"; import { Global } from "@emotion/react"; import { reset } from "@/styles/Global"; export default function App({ Component, pageProps }: AppProps) { return ( <> <Global styles={reset} /> <Component {...pageProps} /> </> ); }
참고