리액트에서 CSS를 사용할 때에는 다양한 방식을 사용할 수 있다. 그 중 알아볼 몇 가지에 대해 나열해보자면 다음과 같다.
- 일반CSS : 컴포넌트를 스타일링하는 가장 기본적인 방식
- Sass : 자주 사용되는 CSS 전처리기 중 하나로 확장된 CSS 문법을 사용해 CSS 코드를 더욱 쉽게 작성할 수 있도록 해준다.
- CSS Module : 스타일을 작성할 때 CSS 클래스가 다른 CSS 클래스의 이름과 절대 충돌하지 않도록 파일마다 고유한 이름을 자동으로 생성해주는 옵션
- styled-components : 스타일을 자바스크립트 파일에 내장시키는 방식으로 스타일을 작성함과 동시에 해당 스타일이 적용된 컴포넌트를 만들 수 있게 해준다.
일반 CSS
먼저, 리액트로 처음 프로젝트를 생성하게 되면, 다음과 같은 화면이 보일것이다.
이 화면은 App 컴포넌트의 화면을 렌더링한 것인데, App.tsx와 App.css 파일로 이 화면을 만들 수 있다.
// App.tsx
import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.tsx</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App;
/* 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 클래스가 중복되는 것을 방지하기 위해 여러 방식을 차용하고 있는데, 그 중 하나는 이름을 지을 때 특별한 규칙을 이용하는 것이고, 다른 하나는 CSS Selector를 활용하는 것이다.
- 이름 짓는 규칙
프로젝트에 자동으로 생성된 App.css를 읽어보면 클래스 이름이 [컴포넌트 이름-클래스] 형태로 지어져 있다. 클래스 이름에 컴포넌트 이름을 포함시킴으로써 다른 컴포넌트에서 실수로 중복되는 클래스를 만들어 사용하는 것을 방지할 수 있다.
- CSS Selector
CSS Selector를 사용하면 CSS 클래스가 특정 클래스 내부에 있는 경우에만 스타일을 적용할 수 있다. 만약 .App 안에 들어 있는 .logo에 스타일을 적용하고 싶다면 다음과 같이 작성한다.
.App .logo {
animation: App-logo-spin infinite 20s linear;
height: 40vmin;
}
CSS 작성 규칙
CSS 작성 시 규칙을 지켜야 코드의 가독성과 유지보수성이 좋아지며, 스타일이 일관되고 예측 가능한 결과를 나타낸다. 아래는 CSS 작성 시 규칙 중 일부이다.
- 들여쓰기
들여쓰기는 가독성을 높이는 데 매우 중요하다. 보통 공백 2칸 혹은 4칸을 이용해 들여쓰기를 한다.
.container {
padding: 20px;
margin: 0 auto;
}
- 세미콜론
CSS에서는 각 스타일 규칙의 마지막에 세미콜론(;)을 넣어주어야 한다.
- 하이픈
CSS에서는 클래스 이름에 하이픈(-)을 사용해 구분한다. 이는 가독성을 높이는 데에 도움이 된다.
.header-container {
padding: 20px;
margin-bottom: 20px;
}
- 색상 표현
CSS에서는 색상을 RGB, RGBA, HEX, HSL, HSLA 등 다양한 방법으로 표현할 수 있다. HEX 코드는 16진수로 색상을 표현하며, 각각의 색상을 두 자리씩 나누어 표기한다.
.color {
background-color: #f5f5f5;
color: rgba(0, 0, 0, 0.8);
}
- 주석
CSS 코드 내에서는 주석을 추가해 스타일이 어디에서 사용되는지 설명할 수 있다.
/* 전체 컨테이너 스타일 */
.container {
padding: 20px;
margin: 0 auto;
}
/* 헤더 컨테이너 스타일 */
.header-container {
padding: 20px;
margin-bottom: 20px;
}
Sass 사용
Sass는 CSS를 보완해 더 유지보수하기 쉽고 확장 가능한 스타일 시트 언어이다. Sass는 CSS의 확장된 문법을 사용하여 변수, 중첩 규칙, mixin 등을 지원하여 CSS 코드를 간결하고 효율적으로 작성할 수 있다.
Sass에서는 두 가지 확장자인 scss와 sass를 지원한다. 두 확장자 간 문법이 꽤 다른데, 차이는 다음과 같다.
/* sass */
$font-stack: Helvetica, sans-serif
#primary-color: #333
body
font: 100% $font-stack
color: $primary-color
/* scss */
$font-stack: Helventica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}
// SassComponent.scss
$red: #fa5252;
$orange: #fd7e14;
$yellow: #fcc419;
$green: #40c057;
$blue: #339af0;
$indigo: #5c7cfa;
$violet: #7950f2;
@mixin square($size) {
$calculated: 32px * $size;
width: $calculated;
height: $calculated;
}
.SassComponent {
display: flex;
.box {
background: red;
cursor: pointer;
transition: all 0.3s ease-in;
&.red {
background: $red;
@include square(1);
}
&.orange {
background: $orange;
@include square(2);
}
&.yellow {
background: $yellow;
@include square(3);
}
&.green {
background: $green;
@include square(4);
}
&.blue {
background: $blue;
@include square(5);
}
&.indigo {
background: $indigo;
@include square(6);
}
&.violet {
background: $violet;
@include square(7);
}
&:hover {
background: black;
}
}
}
다음은 Sass 사용의 예시이다.
// SassComponent.tsx
import "./SassComponent.scss";
function SassComponent() {
return (
<div className="SassComponent">
<div className="box red" />
<div className="box orange" />
<div className="box yellow" />
<div className="box green" />
<div className="box blue" />
<div className="box indigo" />
<div className="box violet" />
</div>
);
}
export default SassComponent;
위 예시 코드를 렌더링해주면 다음과 같은 화면이 나온다.
CSS Module
CSS Module은 리액트 프로젝트에서 CSS를 사용할 때, 전역적으로 CSS를 작성하는 것이 아니라 컴포넌트 단위로 CSS를 작성할 수 있게 해주는 기술이다. 각 컴포넌트에 대해 고유한 클래스 이름을 생성하여 CSS 스타일을 적용하고, 이를 다른 컴포넌트와 겹치지 않도록 보장한다.
사용 예시는 다음과 같다.
/* CSSModule.module.css */
.wrapper {
background: black;
padding: 1rem;
color: white;
font-size: 2rem;
}
.something {
font-weight: 800;
color: aqua;
}
// CSSModule.tsx
import styles from "./CSSModule.module.css";
function CSSModule() {
return (
<div className={styles.wrapper}>
Hello, I'm <span className={styles.something}>CSS Module!</span>
</div>
);
}
export default CSSModule;
CSS 클래스를 두개 이상 사용할 경우, 다음과 같이 코드를 작성해줄 수 있다.
/* CSSModule.module.css */
.wrapper {
background: black;
padding: 1rem;
color: white;
font-size: 2rem;
}
.inverted {
color: black;
background: white;
border: 1px solid black;
}
.something {
font-weight: 800;
color: aqua;
}
// CSSModule.tsx
import styles from "./CSSModule.module.css";
function CSSModule() {
return (
<div className={`${styles.wrapper} ${styles.inverted}`}>
Hello, I'm <span className={styles.something}>CSS Module!</span>
</div>
);
}
export default CSSModule;
styled-components
styled-components는 리액트 컴포넌트를 정의할 때 CSS를 작성하는 방식 중 하나이다. 이를 사용하면 CSS와 컴포넌트가 서로 강하게 결합될 수 있어 유지보수성과 재사용성이 높아진다.
styled-components는 패키지 설치를 해주어야 한다.
// 자바스크립트의 경우
npm install styled-components
// 타입스크립트의 경우
npm install --save-dev @types/styled-components
다음으로, button 컴포넌트를 만드는 예시이다.
import * as React from "react";
import styled from "styled-components";
interface ButtonProps {
primary?: boolean;
}
const Button = styled.button<ButtonProps>`
background-color: ${(props) => (props.primary ? "blue" : "white")};
color: ${(props) => (props.primary ? "white" : "blue")};
border: 2px solid blue;
font-size: 16px;
padding: 18px;
border-radius: 4px;
`;
export default Button;
styled-components를 사용하면 스크립트 파일 하나로 스타일까지 작성할 수 있기 때문에 .css 또는 .scss 확장자를 가진 파일을 따로 만들지 않아도 된다는 장점이 있다.
'WEB > React' 카테고리의 다른 글
리액트 컴포넌트 성능 최적화 [react/component/typescript] (0) | 2023.03.18 |
---|---|
리액트 일정관리 웹 만들기 [react/typescript] (0) | 2023.03.17 |
리액트 Hooks 이해하기 [react/hooks/typescript] (0) | 2023.03.15 |
리액트 라이프사이클 메서드 사용하기 [react/life cycle/typescript] (0) | 2023.03.13 |
리액트 라이프사이클 이해하기 [react/life cycle/typescript] (0) | 2023.03.13 |