React를 사용하기 전에도 혹시 CSS 파일을 작성하는데 불편하다고 느낀 적이 없으신가요? 예를 들어, 중복되는 속성이 있지만 그렇다고 완전히 속성이 일치하는 것이 아니라서 길게 코드를 작성해야 했다거나, 아니면 두 개의 CSS 파일을 불러와서 사용해야 할 때 클래스 이름이 혹시라도 겹치진 않는지 일일이 확인을 해야 했다거나 등등... 저는 특히 '코드의 가독성'측면에서 저는 불편함을 많이 느꼈던 것 같고, 이렇다보니 유지보수할 때도 복잡해 했던 것 같습니다... 그런데 React라고 다를까요? 심지어 React로는 더 복잡하고 규모가 큰 프로젝트를 진행하게 될텐데 그 많은 CSS 파일을 관리할 생각하니 머리가 터질 것 같습니다.
💡🙂 하지만, React에는 CSS Module, Sass, Styled-Component가 있죠✌️
이미 많은 선배 개발자분들께서 저처럼, 아니 저보다 훨씬 이러한 불편함을 느끼고 고민을 많이 하셨던 덕분에, 다행히도 React에서는 전과 달리 CSS 파일을 보다 쉽고 편리하게 관리하며, 스타일을 적용할 수 있게 됐습니다.
CSS Module은 CSS 파일을 불러와서 사용할 때 클래스명을 고유 이름으로 변환해주어 서로 다른 컴포넌트끼리 동일한 클래스명을 사용하더라도 중복 처리되지 않아 오류가 발생하지 않습니다.
[파일명].moudle.css
.container {
display: flex;
}
.box {
width: 100px;
height: 100px;
}
.red {
background-color: red;
}
.orange {
background-color: orange;
}
.yellowgreen {
background-color: yellowgreen;
}
한 개의 styles.선택자
만 작성할 수도 있고, 여러 개를 적용하고자 할 경우 아래처럼 연결시켜 작성할 수도 있습니다.
import React from 'react';
import styles from '../Styles/CssModule.module.css'
const CssModule = () => {
console.log(styles)
return (
<div className={styles.container}>
<div className={[styles.box, styles.red].join(' ')}></div>
<div className={[styles.box, styles.orange].join(' ')}></div>
<div className={`${styles.box} ${styles.yellowgreen}`}></div>
</div>
);
};
export default CssModule;
Sass는 CSS의 코드 복잡성이나 유지보수하기 불편한 점을 보완하고자 등장한 개념으로, 컴파일 과정에서 CSS 파일을 빌드해주는 CSS확장 언어 & 전처리기입니다. 쉽게 말해 CSS를 전보다 더 효율적으로 작성할 수 있도록 돕는 일종의 도구입니다.
Sass는 CSS 문법과 비슷하지만 약간 다릅니다.
_
(under bar)를 붙여주면 CSS로 컴파일되지 않습니다.npm i sass
import React from 'react';
import '../Styles/SassComponent.scss'
const SassComponent = () => {
return (
<>
<div className='container'>
<h1>Sass Styling</h1>
<div className='box red'></div>
<div className='box orange'></div>
<div className='box yellowgreen'></div>
</div>
<button className='btn'>Button</button>
<button className='btn-primary'>Button Primary</button>
</>
);
};
export default SassComponent;
별도로 변수 scss파일을 생성하여 이 안에 작성해보겠습니다.
$color-red: red;
$color-yellowgreen: yellowgreen;
$color-orange: orange;
$animation-duration: 0.4s
@mixin
믹스인도 따로 파일을 만들어서 작성해봅니다.
@mixin box($size) {
width: $size;
height: $size;
}
@include
@import './utils';
@import './variables';
.container {
display: flex;
.box{
@include box(150px);
}
}
&
.container {
display: flex;
.box{
@include box(150px);
&.red {
// $.red = .box.red
background-color: $color-red;
}
&.orange {
background-color: $color-orange;
}
&.yellowgreen {
background-color: $color-yellowgreen;
}
}
}
//.box.hover
&:hover {
// _variables.scss에 선언했던 $animation-duration 활용
$box-animation: $animation-duration * 2;
transform: translateY(-20px);
transition: transform $box-animation;
}
@extend
.btn {
padding: 10px;
margin: 10px;
border: 1px solid black;
}
.btn-primary{
@extend .btn;
background-color: pink;
}
styled-components, emotion, styled-jsx
등, React 어플리케이션에서 스타일을 작성할 수 있는 CSS-in-JS 라이브러리들이 있습니다. Styled-Components는 그 중 하나이고, 이를 사용하는 이유는 컴포넌트 기반으로 스타일을 관리하고 또 동적으로 적용하기 위함입니다.
컴포넌트 기반이기에 각각의 컴포넌트에 중복되는 id명이 존재하더라도 스타일을 독립적으로 관리할 수 있고, 재사용이 가능합니다. (ex. 컴포넌트 안에 import해서 사용할 수 잇는 것은 물론, 기존에 만들어뒀던 특정 태그의 스타일을 다른 종류의 태그에 상속할 때as
라는 속성으로 태그 변경을 하면 다른 태그에서도 동일한 스타일을 그대로 적용할 수 있습니다.) 그리고 Styled-Components는 글로벌 스타일 및 테마 메소드를 지원해줘서 적용하기 쉽다고도 합니다.
Styled-Components는 JS로 스타일을 적용하는 것이다보니 CSS로 작성할 때완 달리 오류가 자주 발생할 수 있겠다는 생각이 들었는데, 역시나 Jest라는 테스팅 라이브러를 이용하면 Styled-Componentsf로 적용한 스타일을 테스트할 수 있다고 합니다. (최고👍!)
npm i styled-components
import styled from 'styled-components'
💡컴포넌트이기에 styled-component 또한 부모로부터 props로 값을 전달받아 사용할 수도 있습니다.
const StyledContainer = styled.div `
display : flex;
`;
const StyledBox = styled.div `
width: 100px;
height: 100px;
background-color: ${(props) => props.bgColor || 'blue'};
&:hover{
transform: translateY(-20px);
}
`;
스타일 컴포넌트를 중첩해서 사용하려고 할 때는 아래처럼 스타일 컴포넌트 태그 안에 또 하나의 스타일 컴포넌트를 넣어서 활용해주면 됩니다.
const StyledComponent = () => {
return (
<StyledContainer >
<StyledBox bgColor='red'></StyledBox>
<StyledBox bgColor='red'></StyledBox>
<StyledBox></StyledBox>
</StyledContainer>
);
};
export default StyledComponent;