리액트에서 컴포넌트를 스타일링할 때는 다양한 방식을 사용할 수 있다.
일반 css
컴포넌트를 스타일링하는 가장 기본적인 방법
Sass
css pre-processor 중 하나로 확장된 css 문법을 사용해 css 코드를 쉽게 작성할 수 있다.
CSS Module
css 클래스 이름이 절대 충돌하지 않도록 파일마다 고유한 이름을 자동으로 생성해 주는 옵션
styled-components
스타일을 자바스크립트 파일에 내장시키는 방식
프로젝트 준비하기
$ yarn create react-app styling-react
$ cd styling-react
$ yarn start
Ex) App.css
.App {
text-align: center;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
CSS를 작성할 때 가장 중요한 점은 CSS 클래스를 중복되지 않게 만드는 것이다. 중복을 막는 여러가지 방식이 있는데 그 중 하나는 이름을 지을 때 특별한 규칙을 사용하는 것이고, 또 다른 하나는 CSS selector를 활용하는 것이다.
ex) [컴포넌트 이름-클래스 이름] → App-header
ex) CSS selector → .App header
CSS
SASS
CSS pre-processor
CSS를 확장하는 스크립팅 언어로, 컴파일러를 통해 브라우저에서 사용할 수 있는 일반 CSS 문법 형태로 변환한다.
SASS는 CSS 전처리기로 스타일 코드의 재활용성을 높여주고 코드의 가독성을 높여준다.
SASS에서는 2가지 확장자 .scss
, .sass
를 지원한다. 보통 .scss
문법이 더 많이 사용되므로, 우리는 .scss
확장자를 사용해 스타일을 작성할 것이다.
// .sass
// 중괄호와 세미콜론을 사용하지 않는다.
$font-stack: Helvetica, sans-serif
$primary-color: #333
body
font: 100% $font-stack
color: $primary-color
// .scss
$font-stack: Helvetica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}
CSS Module은 CSS를 불러와 사용할 때 클래스 이름을 [파일이름_클래스 이름_해시값
] 형태로 자동으로 만들어서 클래스 이름의 중첩을 막는 기술이다.
CSS in JS는 자바스크립트 파일 안에 CSS를 작성하는 방식이다. styled-components
는 현존하는 CSS in JS 관련 리액트 라이브러리 중 가장 인기 있는 라이브러리이다. 이에 대한 대안으로는 emotion
이 대표적이다.
$ yarn add styled-components
Template Literal을 사용 할 때 ${}
안에 일반 문자열, 숫자가 아닌 객체나 함수를 넣는다면 어떻게 될까?
const object = { a: 1 };
const text = `${object}`
console.log(text);
// "[object Object]"
const fn = () => true
const msg = `${fn}`;
console.log(msg);
// "() => true"
만약 내부에 넣은 자바스크립트 값을 조회하고 싶을 땐 Tagged Template Literal 문법을 사용하면 된다. Tagged 템플릿 리터럴은 일반 템플릿 리터럴과 달리 템플릿 안에 객체나 함수를 전달할 때 온전히 추출할 수 있다.
import React from 'react';
import styled from 'styled-components';
const Circle = styled.div`
width: 5rem;
height: 5rem;
background: black;
border-radius: 50%;
`;
function App() {
return <Circle />;
}
export default App;
styled-components를 사용하면 이렇게 스타일을 입력함과 동시에 해당 스타일을 가진 컴포넌트를 만들 수 있다. 만약에 div를 스타일링 하고 싶으면 styled.div
, input을 스타일링 하고 싶으면 styled.input
이런 식으로 사용하면 된다.
이번에는 Circle 컴포넌트에 color, huge라는 props가 설정됐을 때, 색깔을 넣고 크기를 더 키우는 작업을 해보자.
import React from 'react';
import styled, { css } from 'styled-components';
const Circle = styled.div`
width: 5rem;
height: 5rem;
background: ${props => props.color || 'black'};
border-radius: 50%;
${props =>
props.huge &&
css`
width: 10rem;
height: 10rem;
`}
`;
function App() {
return <Circle color="red" huge />;
}
export default App;
Circle 컴포넌트에서 color props 값을 설정해줬으면 해당 값을 배경색으로 설정하고, 그렇지 않으면 검정색을 배경색으로 사용하도록 설정하였다.
prop에 따라 바꾸고 싶은 CSS 속성이 위와 같이 여러 개일 경우, Styled Components에서 제공하는 css
함수를 사용해 여러 개의 CSS 속성을 묶어서 정의할 수 있다.