들어가며
오늘도 SCSS를 공부했다. 확실히 CSS만 사용하는 것보다 훨씬 간편한 것 같다.
@extend
특정한 선택자로 이미 만들어진 스타일을 가져와서 사용할 수 있다.
12 .btn {3 width: 100px;4 height: 100px;5 background-color: gray;6 }78910 .btn-primary {11 background-color: blue;12 }
위와 같이 스타일이 정의되어 있다고 하자. .btn 선택자에 스타일이 정의되어 있고, .btn-primary 선택자에 .btn 에 정의된 스타일을 상속(또는 확장) 받고 싶다. 이 때 .btn-primary 내부에 @extend 규칙을 통해 스타일을 상속 받을 수 있다.
1 /* SCSS */2 .btn {3 width: 100px;4 height: 100px;5 background-color: gray;6 }78 .btn-primary {9 @extend .btn;10 background-color: blue;11 }
1 /* 컴파일 된 CSS */2 .btn, .btn-primary {3 width: 100px;4 height: 100px;5 background-color: gray;6 }78 .btn-primary {9 background-color: blue;10 }
.btn 선택자와 .btn-primary 선택자에 같은 속성이 적용되는 것을 볼 수 있다.
주의할 점: 전혀 의도하지 않은 선택자가 만들어지는 선택자 폭발이라는 부작용이 발생할 수 있다. 중첩을 사용할 때에는 @extend 규칙을 사용하지 않는 것이 좋다. 꼭 필요한 경우가 아니라면 @mixin 규칙을 사용하는 것이 좋다.
placeholder 선택자
% 기호를 사용한다. 기존에 클래스 선택자나 id 선택자를 사용하기 위해서 . 이나 # 을 사용했는데, %도 사용할 수 있다. @extend 규칙을 사용하는 확장을 위해서만 사용하는 선택자이다.
1 %btn {2 width: 100px;3 height: 100px;4 background-color: gray;5 }67 .btn-primary {8 @extend %btn;9 background-color: blue;10 }
@media 규칙을 사용할 때 외부에서 선언한 placeholder 선택자를 사용하려고 하면 오류가 발생한다. 이때에도 @extend 대신 @mixin 규칙을 사용하면 해결할 수 있다.
함수
자바스크립트에서 사용하는 함수의 개념과 동일하다. @mixin 규칙과도 비슷하게 사용할 수 있다. @function 키워드를 사용해 함수를 선언할 수 있다. 값 반환을 위해서 @return 을 사용한다.
1 @function grid() {2 @return 123;3 }45 .box1 {6 width: grid();7 }
@function 키워드는 믹스인에서 사용한 것처럼 매개변수를 받을 수 있고, 매개변수의 기본값을 지정하거나 전개 연산자를 사용할 수 있고, 키워드 인자를 전달할 수도 있다.
주의할 점
SCSS에는 내장 함수들이 있다. 함수를 정의할 때 내장함수의 이름과 중복될 수 있기 때문에 함수 이름을 두 개 이상의 단어로 정의하고 단어와 단어사이를 붙임표로 연결해 작성하면 중복을 피할 수 있다.
조건과 반복
@if 키워드를 사용해 조건문을 사용한다. 자바스크립트에서는 조건문을 작성할 때 소괄호 안에 조건을 작성했는데, SCSS의 경우 소괄호를 생략해서 사용할 수 있다.
1 @function test($condition:true) {2 @if $condition {3 background-color: green;4 }5 }
자바스크립트와 마찬가지로 else, else if 를 사용할 수 있는데 if를 사용한 것과 같이 앞에 @ 기호를 붙여서 사용하면 된다.
1 @if $condition == cond1 {2 ...3 } @else if $condition == cond2 {4 ...5 } @else {6 ...7 }
@each ... in 키워드를 사용해 반복문을 사용할 수 있다. List 데이터와 Map 데이터를 순회할 수 있다.
1 /* SCSS */2 $sizes: 20px, 40px, 80px;3 $fruits: (apple: 'A', banana: 'B', cherry: 'C');45 //List6 @each $size in $sizes {7 .box-size-#{$size} {8 width: $size;9 height: $size;10 }11 }1213 // Map14 @each $key, $value in $fruits {15 .fruit-#{$key}::after {16 content: $value;17 }18 }
1 /* 컴파일 된 CSS */2 .box-size-20px {3 width: 20px;4 height: 20px;5 }67 .box-size-40px {8 width: 40px;9 height: 40px;10 }1112 .box-size-80px {13 width: 80px;14 height: 80px;15 }1617 .fruit-apple::after {18 content: "A";19 }2021 .fruit-banana::after {22 content: "B";23 }2425 .fruit-cherry::after {26 content: "C";27 }
@for 키워드를 사용해 자바스크립트의 for문 처럼 사용할 수 있다. 단 from과 through 키워드를 사용한다.
1 .list {2 position: relative;3 top: 0;4 @for $i from 1 through 3 {5 .item {6 width: 100px * $i;7 }8 }9 }
through 키워드 대신 to 키워드를 사용할 수 있는데, through는 <=, to는 <를 의미한다.
@while 을 사용할 수도 있다. 자바스크립트의 while문과 동일하다. 소괄호는 생략할 수 있다.
1 .list {2 position: relative;3 .item {4 $i: 1;5 $n: 8;6 @while ($n > 0) {7 &:nth-child(#{$i}) {8 width: 100px * $n;9 height: 100px * $i;10 }11 $i: $i + 1;12 $n: $n - 2;13 }14 }15 }
@import
CSS에서 사용하는 @import 키워드와 동일하다. 다른 파일을 가져와서 사용할 수 있다.
1 // variables.scss2 $primary: blue;3 $error: red;4 $success: green;
1 // main.scss2 @import "./variables.scss";34 .main {5 background-color: $success;6 }
위와 같이 사용한다. 그런데 만약 위와 같이 main.scss와 variables.scss 파일을 만들어서 CSS로 컴파일을 하게 되면 variables.scss 파일은 변수 선언만 하기 때문에 CSS로 변환하면 해당 CSS 파일에는 아무 내용도 들어가있지 않다. 이 때 variables.scss 파일명 앞에 언더바를 붙이면 컴파일 과정에서 별도의 CSS 파일로 컴파일 하지 않는다.
@use를 사용해 네임스페이스를 사용할 수 있다.
1 @use "./variables"
위와 같은 방법으로 파일을 불러올 수 있고 해당 파일 내의 변수는 아래와 같이 사용할 수 있다.
1 background-color: variables.$primary;
기본적으로 네임스페이스는 파일명으로 지정되는데 다른 값으로 사용하고 싶다면 파일명 뒤에 as 키워드를 사용해 정의할 수 있다.
@forward
현재 파일에서 사용하는 모듈을 파일 외부로 전달하기 위해 사용한다. @use 키워드와 마찬가지로 as를 사용해 이름을 정의할 수 있지만 앞에 접두사를 적용해서 사용해야한다.
1 @forward "./variables" as var-*;
컴파일
SCSS는 컴파일을 통해 CSS 파일을 생성한다. 컴파일을 위해서 sass 패키지를 설치한다.
1 npm install -g sass
내장 모듈
Sass에는 이미 만들어진 내장 모듈이 존재한다. 내장 모듈을 불러오기 위해서는 잠깐 위에서 살펴봤던 @use 키워드를 사용한다.
1 @use "sass:color";
@use 를 사용하고 sass: 와 함께 내장 모듈의 이름을 붙여 가져올 수 있다. 다양한 내장 모듈이 있는데 공식 문서에 설명이 자세히 나와 있는 것 같다. sass 내장 모듈 바로가기
디버그
자바스크립트에서 console.log() 를 사용해 디버그 하는 것처럼 SCSS에서도 디버그를 진행할 수 있다.
1 .box {2 width: 100px;3 height: 200px;4 @debug "Hello SCSS!";5 }
위와 같이 작성한 후에 CSS로 컴파일 하면, 컴파일 과정에서 콘솔에 디버그에 작성한 메시지를 출력해준다.
@debug 이외에도 @warn, @error 가 있다. @error 를 사용해 메시지를 작성하면 컴파일이 정상적으로 이뤄지지 않는다.
정리
사실 과제 마감 기한이 얼마 안남아서 과제에 집중하느라 공부한 내용을 엄청 대충 정리했다. 과제할 때 SCSS 사용하면서 복습해보고 과제 제출하면 다시 한번 정리해봐야겠다.