React
SCSS와 SASS: 효율적인 CSS 전처리기 사용법
startfront
2025. 4. 8. 17:22
CSS전처리기
CSS 전처리기는 CSS 코드를 작성할 때 보다 효과적이고 조직적으로 스타일을 관리하기 위한 스크립팅 언어
이 전처리기는 특별한 문법을 사용하여 작성되며, 웹 사이트를 실행하기 전에 일반 CSS로 컴파일
(vs code extension - compile hero)해서 배포합니다
종류
Sass와 SCSS가 있다.
특징 | SCSS | SASS |
문법 | CSS와 유사한 문법 사용 | 들여쓰기를 기반으로 한 문법 사용 |
세미콜론 및 중괄호 | ;와 {} 사용 | 세미콜론과 중괄호 없이 들여쓰기로 구분 |
CSS 호환성 | 기존 CSS 파일을 SCSS로 변환 가능 |
CSS와 호환되지 않음, 별도의 문법 사용 |
간결성 | 상대적으로 덜 간결하지만 직관적 | 더 간결하고 읽기 쉬운 문법 |
문법 예시 | scss<br> .btn { color: red; } | sass<br> .btn<br> color: red |
파일 확장자 | .scss | .sass |
주로 사용되는 환경 | 대부분의 프로젝트에서 사용됨 | 예전부터 SASS 사용자가 많지만, 현재는 SCSS가 더 일반적 |
=> SCSS는 기존 CSS 파일을 그대로 사용할 수 있고, SASS는 조금 더 간결하게 작성
SASS 사용의 장점
✔️코드 재사용 : 믹스인, 변수, 함수 등을 사용하여 코드 중복을 줄인다.
✔️유지 및 관리 용의성 : 분할 및 구조화 된 코드로 관리한다.
✔️고급 기능 사용 : 조건문, 반복문, 연산 등
브라우저는 Sass의 문법을 알지 못하기 때문에
Sass(.scss) 파일을 css 파일로 트랜스파일링(컴파일)하여야 한다.
Sass 환경의 설치
npm install -g sass
=> Sass 컴파일러는 SCSS와 전통적인 Sass 문법 모두를 처리
=>
컴파일
sass <변환할 SCSS 파일명> <변환될 CSS 파일명> [옵션]
예시 1: 기본 변환
sass style.scss style.css
# SCSS 파일을 CSS로 변환
예시 2: 자동 컴파일 (Watch 모드)
sass --watch style.scss style.css
# SCSS 파일을 감시하고, 변경 시 자동으로 CSS로 변환
예시 3: 자동 컴파일 + 소스 맵 제외
sass --watch style.scss style.css --no-source-map
# SCSS 파일을 감시하며 변환하고, 소스 맵 파일은 생성하지 않음 (배포 시 사용)
옵션 설명:
--watch : SCSS 파일을 감시하여 변경 시 자동으로 CSS로 컴파일
--no-source-map : 소스 맵을 생성하지 않음 (배포 시 사용)
--source-map : 기본적으로 소스 맵을 생성 (디버깅 시 유용)
=> 혹은 VS code extension – compile here 사용 우클릭하여 자동 컴파일
SCSS 기본 문법
- 변 수(Variables)
CSS의 값을 저장하고 재사용하는 방법
주로 중복해서 사용하는 font-family와 베이스 color 들을 변수로 지정한다.
선언 형식] $변수명 : 값;
사용 형식] 속성: $변수명;
$font-stack: Helvetica, sans-serif;
$primary-color: gray;
body {
font: $font-stack;
color: $primary-color;
}
- 중첩(Nesting)
계층적으로 상속되는 CSS를 더욱 계층적으로 보이게 만드는 기능
계층을 선택자로 표시하던 것을 그룹으로 묶을 수 있게 되어 더욱 깔끔하고 가독성 좋은 방식으로 코딩
=> 중첩은 3 depth 이내로 하는것 이 권장된다.
nav {
ul {
margin: 0;
padding: 0;
list-style: none;
}
li {
display: inline;
}
a {
display: block;
text-decoration: none;
padding: 6px 12px;
}
}
- 파일 분리와 임포트(Partials & Import)
.scss 파일을 여러 파일로 나누고 필요한 곳에서 임포트하는 기능
부분 파일 이름은 _로 시작하고, import 할때는 생략
=>
_(언더스코어)로 시작하는 파일 이름은 독립적이지 않음
: stand alone으로 컴파일 되지 않는 것을 의미. 다른 SCSS 파일에 import되어 사용될 목적으로 만들어진다
_base.scss
$font-stack: Helvetica, sans-serif;
$primary-color: #e2efa8;
body {
font: 100% $font-stack;
color: $primary-color;
}
modules.scss
@use "base";
.inverse {
height: 200px;
width: 300px;
background-color: base.$primary-color;
}
- Mixins
재사용 가능한 스타일의 그룹을 정의하는 사용
- 형식
// 기본 Mixin 선언
@mixin 이름 { }
// Mixin 사용
@include 이름;
// 인자를 사용하는 Mixin
@mixin 이름($인자) {
속성: $인자;
}
// 인자 전달
@include 이름(값);
// 여러 인자 전달
@include 이름(값1, 값2);
// 이름 기반으로 인자 전달
@include 이름($인자명: 값);
-예시
// 테마 설정: 배경색, 그림자, 텍스트 색상
@mixin theme($theme: Darkgray) {
background-color: $theme;
box-shadow: 5px 5px 1px rgba($theme, 0.25);
color: white;
}
// 박스 크기 및 여백 설정
@mixin box {
height: 50px;
width: 10px;
margin: 10px auto;
padding: 5px;
}
// 클래스에 스타일 적용
.info {
@include theme; // 기본 테마
@include box; // 박스 스타일
}
.alert {
@include theme(Darkred); // 다른 테마
@include box;
}
.success {
@include theme(green); // 다른 테마
@include box;
}
- Extend
재사용 가능한 스타일 상속 받은 선택자들이 공유하는 방식
=> 선택자 병합 방식이기 때문에 예기치 못한 사이드 이펙트가 발생할 수 있음
.button-basic {
padding: 15px;
font-size: 16px;
margin: 10px;
border: none;
text-align: center;
cursor: pointer;
background-color: pink;
width: 100px;
height: 30px;
}
.button-report {
@extend .button-basic;
background-color: orange;
}
- & 연산자 (and)
Nesting 에서 자식이 아닌 부모(self)를 참조하는 역할
.button {
color: white;
background: blue;
font-size: 16px;
// 1. &를 사용하여 중첩된 선택자가 부모 선택자를 참조
&:hover {
background: darkblue;
}
// 2. 미디어 쿼리에서 부모 선택자를 유지하여 스타일 적용
@media (max-width: 600px) {
& {
font-size: 14px;
}
}
}
// 3. 부모 선택자와 연결된 새로운 클래스명 만들기
.card {
&-header {
font-size: 20px;
}
&-body {
font-size: 15px;
}
}
// 4. 부모 선택자가 포함된 구조 만들기
.icon {
&.large {
width: 50px;
height: 50px;
}
}
- 조건문(@if, @else if, @else)
주어진 조건에 따라 다른 스타일을 적용할 때 사용
$theme: light;
.button {
width: 100px;
height: 30px;
text-align: center;
border-radius: 5px;
// 테마에 따라 스타일 적용
@if $theme == light {
background-color: pink;
color: black;
border: 1px solid gray;
} @else {
background-color: gray;
color: white;
border: 1px solid black;
}
}
- #{변수명} : 변수 값을 클래스명이나 속성 값에 동적으로 적용
반복문을 활용해서 스타일 자동 생성
=> 여러 개의 버튼 스타일 자동 생성!!!!!
// for: 단순 반복
@for $반복변수명 from 시작 through 끝 {
#{반복변수}
}
// each: 리스트나 맵을 반복
@each $변수명 in list/map {}
- for 예시
// for: 반복문을 사용해 스타일 생성
$button-sizes: 100, 150, 200;
@for $i from 1 through 3 {
.btn-#{$i} {
width: nth($button-sizes, $i);
height: 40px;
background-color: #4CAF50;
color: white;
}
}
-each 예시
// each: 리스트나 맵을 반복하여 스타일 생성
$button-colors: red, blue, green;
@each $color in $button-colors {
.btn-#{$color} {
background-color: $color;
width: 150px;
height: 40px;
color: white;
}
}