Sass는 CSS로 컴파일 되는 스타일 시트 확장 언어이며 CSS 전처리기의 하나이다. 브라우저가 Sass를 직접 로딩하는 것이 아니라 개발은 Sass를 기반으로 한 후, CSS로 익스포트하는 과정을 거친다.
body안에 div태그 선택하기
body {
div {
color : red;
}
}
&(앤퍼센트)
연산자를 통해서 부모 선택자를 선택할 수 있다!body {
.box {
width: 100%;
background-color: red;
&:hover{
background-color: white;
}
}
}
기호 + 작명 : 저장할 내용
extend
를 통해서 스타일 확장.btn {
border: 1px solid white;
}
.btn-1 {
@extend .btn; // .btn의 스타일을 가져옴
border: 1px solid red; // 수정하고 싶은 스타일만 바꿔주면 됨
}
%
→ 임시 클래스%btn {
border: 1px solid white;
}
.btn-1 {
@extend %btn;
border: 1px solid red;
}
@mixin 선택자() {}
→ 보낼 선택자클래스명 { @include 선택자()}
→ 선택자 받을 때@mixin 버튼() {
border: 1px solid white;
}
.btn-1 {
@include 버튼();
border: 1px solid red;
}
mixin
은 extend
와 차이가 있다.extend
보다 유연하게 확장 가능하다. 이때, 반드시 인자 개수만큼 적어주어야 한다. @mixin 버튼($테두리, $글자색) {
border: 1px solid $테두리;
color : $글자색;
}
.btn-1 {
@include 버튼(red, red);
}
.btn-1 {
@include 버튼(blue, blue);
}
node.js를 설치하면 자동적으로 npm도 설치된다. 홈페이지(http://www.nodejs.org)에서 다운로드 받을 수 있다.
npm init -y
npm i node-sass
→ node_modules와 package-lock.json이 생성된다.
→ git commit을 할 경우, node_modules와 package-lock.json 파일은 .gitignore파일안에 작성하여 git commit에서 제외시켜야 한다.
"sass": "node-sass -w -r scss/input.scss src/output.css "
나의 프로젝트에서
"sass": "node-sass -w -r scss/style.scss src/style.css "
npm run sass
터미널에서 npm run sass
를 입력하게 되면 아래와 같이 해당경로의 파일로 컴파일 된 것을 볼 수 있다.
node-sass -w -r scss/style.scss src/style.css
Sass 프로젝트를 구성하는 방법중 가장 대중적인 방식은 7-1 패턴
이다.
즉 7개의 폴더에 속한 파일들을 단 하나의 파일 통해서 사용한다는 뜻이다. 하지만 프로젝트의 규모상 vendors와 themes 폴더를 제외하여 5-1 패턴
을 프로젝트에 적용해 보고자 한다.
scss/
|
|– abstracts/
| |– _variables.scss # Sass Variables
| |– _mixins.scss # Sass Mixins
|
|– base/
| |– _reset.scss # Reset
| |– _font.scss # Typography rules
| |- _base.scss # Base
|– layout/
| |– _grid.scss # Grid system
| |– _header.scss # Header
| |– _footer.scss # Footer
| |- _main.scss # main
|
|– components/
| |– _buttons.scss # Buttons
|
|– pages/
| |– _home.scss # Home specific styles
| |– _login.scss # Login specific styles
|
– style.scss # Main Sass input file
abstracts 폴더는 프로젝트 전체에 사용되는 모든 Sass 도구와 도우미를 담고 있다.
ex) 모든 전역 변수, 함수, mixin 및 표시자
// color
$main-color: #59362f;
$light-gray-color: #f5f5f5;
$gray-color: #bdbdbd;
$dark-gray-color: #828282;
$white-color: #ffffff;
$red-color: #C03615;
$black-color: #000000;
$kakao-color: #f2c94c;
// font
$base-font: "Archivo", sans-serif;
$font-weights: (
"regular": 400,
"medium": 600,
"bold": 700,
);
@mixin space-between {
display: flex;
justify-content: space-between;
align-items: center;
}
@mixin center-xy {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
프로젝트의 상용구 코드를 담고 있다. 사이트 전반에 사용될 폰트, 디폴트 스타일이 해당된다.
body {
width: 100vw;
max-width: 100%;
height: 100vh;
margin: 0 auto;
}
@import url("https://fonts.googleapis.com/css2?family=Archivo&family=Noto+Sans+KR:wght@400;700;900&family=Roboto&display=swap");
사이트 구조에 해당하는 레이아웃을 담고 있다.
@media screen and (max-width: 1127px) {
main {
.posts {
grid-template-columns: repeat(3, 1fr);
}
}
}
@media screen and (max-width: 949px) {
main {
.posts {
grid-template-columns: repeat(2, 1fr);
}
}
}
@media screen and (max-width: 549px) {
main {
.posts {
display: grid;
grid-template-columns: repeat(1, 1fr);
}
}
}
header {
position: fixed;
z-index: 20;
width: 100%;
background-color: $white-color;
}
footer {
position: fixed;
width: 100vw;
padding: 30px 30px 15px;
bottom: 0;
background: $light-gray-color;
z-index: 10;
border-top: 1px solid $gray-color;
}
main {
max-width: 1300px;
margin: 0 auto;
padding: 170px 40px 0;
}
layout보다 더 작은 구성요소를 담고 있으며 사이트 내에서 재사용이 가능한 부분들을 의미한다.
Ex) button, slider, loader …
#app {
.button-switch {
position: fixed;
bottom: 200px;
right: 100px;
width: 120px;
height: 40px;
padding: 10px;
border-radius: 20px;
background-color: $main-color;
color: $white-color;
z-index: 20;
}
}
페이지 고유의 스타일이 있는 경우 페이지 이름을 딴 파일을 만들어 사용한다.
위와 같이 각 폴더 기준에 따라 scss 파일들을 분류했다면, 이 모든 파일들을 단 하나의 파일로 모아서 사용한다. 해당 파일은 직접적으로 스타일을 정의하지 않고 단지 import만 담당하는 파일이다.
ex)
@import "./abstracts/mixins";
@import "./abstracts/variables";
@import "./base/base";
@import "./base/font";
@import "./base/reset";
@import "./components/buttons";
@import "./layout/footer";
@import "./layout/grid";
@import "./layout/header";
@import "./layout/main";
@import "./pages/home.scss";
@import "./pages/login.scss";