위코드 파운데이션 과정을 들으며 정리한 내용입니다.
기존 CSS
문법의 불편함을 개선하고자 나온 기술이 CSS
전처리기입니다. CSS
전처리기의 문법으로 파일을 작성하면, 실제 실행 전 브라우저가 읽을 수 있는 CSS
파일로 변환해줍니다. CSS
전처리기에는 많은 종류가 있는데 그 중 Sass
를 알아보겠습니다.
Sass
는 Syntactically Awesome Style Sheets
의 약자입니다. 문법적으로 굉장한 스타일 시트라는 의미입니다. 기존 CSS
에서 겪었던 불편들을 해결할 수 있습니다.
Sass
라이브러리를 설치해야 사용할 수 있습니다. 프로젝트 폴더에서 아래와 같은 명령어를 입력합니다.
npm install sass
설치 된 후에는 package.json 의 dependencies 항목에서 확인 가능합니다.
사수를 작성하는 문법은 sass
와 scss
두가지인데, scss
문법 사용을 권장합니다. scss
가 sass
문법을 개선한 최신의 문법이고 범용성과 css
와의 호환성이 좋습니다.
// sass
nav
ul
margin: 0
padding: 0
// scss
nav {
ul {
marign: 0;
padding: 0;
}
}
기존 css
파일의 확장자명을 scss
로 변경하고 해당 css
를 적용한 js
파일에서 Import
한 css
파일 확장자도 변경합니다. 변경 후 스타일이 깨지는 부분을 발견할 수 있습니다. SPA
에서는 각각의 js
파일이 독립적으로 css
를 가져왔더라도, 라우터에서 모든 페이지 컴포넌트가 모이기 때문에 각 css
파일에 겹치는 선택자가 있다면, 스타일이 깨지게 됩니다. 문제를 해결하기 위해선 모든 태그의 클래스 이름을 다르게 주거나 css
의 자손결합자를 사용하면 됩니다. 클래스 이름을 변경하는 방법은 이후 유지보수를 하거나 에러를 고치는데 복잡할 수 있으므로 자손결합자 방식을 추천합니다.
보통 최상위 부모 태그의 클래스 이름은 컴포넌트의 이름으로 적습니다. (카멜케이스로) 클래스 이름은 겹칠 수 있지만, 컴포넌트 이름은 겹치면 안되기 때문에, 중복을 피할 수 있습니다.
// js
const Login = () => {
return (
<div className="login">
<h1 className="title">로그인 페이지</h1>
</div>
);
}
// scss
.login .title {
color: red;
}
자손결합자 방식은 적용할 스타일이 많아지면 불편하기 때문에 Sass
에서는 Nesting
방식을 사용합니다. html
구조처럼 부모 자식 관계로 스타일을 표현할 수 있습니다.
nav {
ul {
marign: 0;
}
li {
display: inline-block;
}
}
여러 곳에 사용하거나 오타가 나기 쉬운 속성은 변수로 지정할 수 있습니다.
$primary-color: #333;
body {
color: $primary-color;
}
div {
background-color: $primary-color;
}
네스팅 내부에서 부로 선택자는 &
로 표기합니다. button
태그에 hover
효과를 부여하고 싶다면 아래와 같이 작성합니다.
button {
width: 200px;
height: 50px;
&:hover {
width: 400px;
height: 100px;
}
}
@mixin 변수이름 {스타일 속성}
은 중복되는 스타일 속성을 여러개로 묶어 변수에 담을 수 있습니다. 담긴 변수를 사용할 때는 @include 변수이름
을 써줍니다.
@mixin flexCenter {
display: flex;
justify-content: center;
align-items: center;
}
.info {
@include flexCenter;
}
함수를 사용하는 것처럼 인자를 넣어서 스타일 속성 틀은 유지하고 속성 값만 변경할 수도 있습니다. 사용할 때 인자로 속성값을 입력합니다.
@mixin flexCenter($justify, $alignItems) {
display: flex;
justify-content: $justify;
align-items: $alignItems;
}
.info {
@include flexCenter('space-between', 'center');
}
변수
나 mixin
으로 만든 스타일 틀은 별도 파일로 만들어 관리하면 좋습니다. variable.scss
파일을 만들어 따로 저장하고 기존 scss
파일에서 Import
하고 사용하면 됩니다.