리액트에서 스타일링을 하는 방식은 3가지가 있다.
기존의 방식과 동일하게 css 파일을 따로 분리하여 사용하는 방식이다.
기존에 html 파일에서 css 파일을 연결할 때는 <link> 태그를 사용하여 연결하였지만, 리액트에서 css를 연결할 때는 import
를 사용한다. import시 js 파일은 확장자를 생략해도 무관했지만 css 파일은 확장자를 명시해줘야 한다.
import 'css 파일 경로.css(scss)'
Sass와 SCSS를 사용하여 css를 더 편리하게 작성할 수 있다.
Sass
(Syntactically Awesome Style Sheets)와 SCSS
(Sassy CSS)는 CSS pre-processor로서, 복잡한 작업을 쉽게 할 수 있게 해주고, 코드의 재활용성을 높여줄 뿐 만 아니라, 코드의 가독성을 높여주어 유지보수를 쉽게 해준다.
① 자주 사용하는 색이나 폰트 등을 변수로 지정하여 재사용할 수 있다.
② &(자기 자신을 나타내는 중첩선택자)
를 사용하여 css를 중첩(Nesting) 작성할 수 있다.
③ 모듈화가 가능하다.
④ 믹스인(Mixin)을 사용하여 함수처럼 인자를 받아서 속성을 부여할 수 있다.
⑤ 중복되는 스타일을 상속(Extend)하여 사용할 수 있다.
SASS는 중첩으로 들여 쓰기를 사용하고 속성 구분은 줄 바꿈을 이용한다.
SCSS의 경우 중괄호로 중첩을 표현하고 세미콜론으로 속성을 구분한다. 또한, SCSS는 CSS 문법과 완벽하게 호환되기 때문에 SCSS의 선호도가 더 높고 사용자수도 많다.
/* Sass와 scss의 비교 */
/* Sass */
/* 들여쓰기와 줄바꿈을 사용 */
$font-stack: Helvetica, sans-serif
$primary-color: #333
body
font: 100% $font-stack
color: $primary-colo
/* scss */
/* css와 문법 동일 */
$font-stack: Helvetica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}
.box{
position: relative;
background: blue;
color: #fff;
/* 여기서 &는 자기 자신인 .box를 의미함 */
/* .box:hover를 &:hover로 간략화*/
&:hover{
background: red;
}
&:first-child{
border: 1px solid black;
}
}
/* 자주 사용되는 코드를 box-center라는 mixin으로 선언*/
@mixin box-center {
display: flex;
align-items: center;
justify-content: center;
}
/* include로 box-center mixin을 상속받음 */
.container {
@include box-center;
background: red;
}
CSS Module
은 CSS 클래스가 중첩되는 것을 완벽히 방지할 수 있는 방식이다.
클래스명의 중복을 방지할 수 있는 이유는 클래스명 뒤에 hash가 붙어서 고유한 클래스를 만들어주기 때문이다. 이렇게 하면 스타일이 겹쳐서 덮어씌워지는 현상을 막을 수 있다.
① CSS 파일의 확장자는 .module.css
이다.
② 클래스명은 camelCase로 짓는다.
③ styles
를 import하고 객체 안에 있는 값을 조회하듯이 요소의 클래스에 styles(다른이름도 가능).클래스명
을 지정해주면 된다.
ex) className={styles.클래스명}
④ 여러 개의 클래스를 적용할 때는 `(백틱)` 안에 템플릿 리터럴(${ }
)로 작성한다.
ex) className={`${styles.클래스1} ${styles.클래스2] ${styles.클래스3}...`}
📦 Box.module.css
.Container {
display: flex;
align-items: center;
justify-content: center;
}
.Button {
background: black;
border: none;
border-radius: 10%;
padding: 10px;
}
.Checked {
color: white;
}
📦 Box.js
import React from "react";
import styles from "./Box.module.css";
function Box() {
// 스타일 한 개 적용
return <div className={styles.Container}>
// 스타일 여러 개 적용
<button className={`${styles.Button} ${styles.Checked}`}>버튼</button>
</div>;
}
export default Box;
✏️ Sass에서도 CSS Module을 사용 할 수 있다. 확장자를 .module.scss
로 바꿔주면 된다.
✏️ 또한, 클래스를 전역적으로 사용하고 싶다면 :global
을 사용하면 된다.
✏️ 반대로 클래스를 지역적으로 사용하고 싶다면 :local
을 사용하면 된다.
styled-components
는 CSS in JS 라이브러리로, js 안에 css를 작성하는 방식이다.
① css 파일을 별도로 작성하지 않고 하나의 컴포넌트 안에 스타일을 작성한다.
② 자바스크립트 문법을 그대로 활용하여 작성 가능하다.
③ 스타일을 컴포넌트 사용하는 것처럼 사용 가능하다.
④ Sass 문법을 활용하여 작성 가능하다.
⑤ 컴포넌트의 props를 전달 받아 스타일링을 할 수 있다.
① styled-components 패키지에서 styled
를 임포트한다.
import styled from 'styled-components
② styled.html element
로 html 태그를 지정하고 `(백틱)` 안에 해당 요소에 대한 스타일을 지정한다. 작성한 스타일은 변수에 담는다.
ex) const Box = styled.div` display: flex; `
③ 생성한 스타일을 적용할 때는 컴포넌트 사용하듯이 <스타일명 />
으로 사용한다.
<Box />
④ 중복되는 스타일은 styled(스타일명)
으로 상속하여 코드를 재사용할 수 있다.
const SecondBox = styled(Box)``
⑤ 모든 컴포넌트에 동일한 스타일을 적용하고 싶을 때는 createGlobalStyle()
함수를 활용하여 스타일을 전역적으로 사용할 수 있다.
⑥ props를 활용한 스타일링도 가능하다.
가변 스타일링 - ${(props) => props에 따른 스타일}
조건부 스타일링 - ${({ props }) => { 삼항연산자 }}
📦 Box.js
import React from 'react';
import styled from 'styled-components';
const Box = styled.div`
display: flex;
align-items: center;
justify-content: center;
`;
// 버튼 공통 스타일
const Button = styled.button`
background: black;
border: none;
border-radius: 10%;
padding: 10px;
`;
// Button 스타일 상속
const OkButton = styled(Button)`
color: blue;
`;
// Button 스타일 상속
const NoButton = styled(Button)`
color: red;
`;
function Box() {
return <Box>
<OkButton>확인</OkButton>
<NoButton>취소</NoButton>
</Box>;
}
export default Box;
🌏 GlobalStyle.js
import { createGlobalStyle } from "styled-components";
// 전역적으로 적용되는 공통 스타일
const GlobalStyle = createGlobalStyle`
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-size: 1rem;
display: flex;
justify-content: center;
align-items: center;
}
`;
export default GlobalStyle;
참고자료
📑 리액트 컴포넌트 스타일링하기