SASS 간략히 이해하고 사용하기
SASS는 기본적으로 CSS 에 대한 전처리기(preprocessor)이다. CSS 가 제공하지 못하는 여러 언어적 특징들을 제공한다. 예를 들어서 변수(variables), 중첩(nesting), 믹스인(mixin), 상속(inheritance) 과 같은 특징들이다.
SASS안에는 SASS, SCSS 2가지 문법(Syntax) 스타일의 프리프로세서가 존재한다.
SASS는 인덴트 기반, SCSS는 브라켓({,}) 기반의 스타일이다
SASS 파일은 확장자가 sass, SCSS는 확장자가 scss 이다.
// SASS
$font-stack:    Helvetica, sans-serif
$primary-color: #333
body
  font: 100% $font-stack
  color: $primary-color// SCSS
$font-stack:    Helvetica, sans-serif;
$primary-color: #333;
body {
  font: 100% $font-stack;
  color: $primary-color;
}복잡해지는 CSS를 그냥 쓰기에는 유지보수,확장이 용이하지 않다. 그래서 이러한 형태의 전처리기를 사용하는데 semantic-ui 와 같은 프론트엔드 기반의 라이브러리들이 이러한 전처리기를 적극적으로 활용한다.
http://sass-lang.com/ 를 통해서 상세한 정보를 얻을 수 있고 아래와 같이 설치한다.
SASS/SCSS 라이브러리는 루비로 작성된 라이브러리라서 루비젬을 이용해서 설치할 수 있다.
$ gem install sass다른 방식(ex application)으로 설치 하는 것에 대해서는 공식 사이트를 참고하면 된다. http://sass-lang.com/install
커맨드라인에서 SASS 전처리기를 수행하려면 아래와 같이 수행한다.
$ sass input.scss // ex: sass [SASS 파일]CSS로 변환된 결과를 표준출력(stdout) 즉 모니터 화면으로 얻을 수 있으며
$ sass input.scss output.css와 같이 css 형식으로 출력인자를 추가함으로써 파일로 출력할 수도 있다.
아래와 같이 —watch 옵션을 추가하면 디렉토리 단위로 파일 변경사항을 감시해서 전처리를 수행하게 할 수 있다.
$ sass —watch app/sass:public/stylesheets위의 명령어는 콜론(:)으로 구분된 app/sass 폴더와 public/stylesheets 폴더 안에 있는 scss 파일의 변경 내역을 찾아서 수행한다.
➜  $ sass --watch sass
>>> Sass is watching for changes. Press Ctrl-C to stop.
      write sass/variables.css
      write sass/variables.css.map
>>> New template detected: sass/test.scss
      write sass/test.css
      write sass/test.css.map
>>> Change detected to: sass/variables.scss
      write sass/variables.css
      write sass/variables.css.map디렉토리 지정 후 폴더내에 sass 파일들(sass, scss)이 추가 되거나 변경되면 그 즉시 다시 전처리가 실행된다.
현재 SASS 스타일 보다 SCSS 스타일이 많이 쓰이고 있어서 문법 설명은 SCSS 기준으로 설명하겠다.
(1) 변수(Variables)
$variable 와 같은 형태로 앞에 $를 이용해서 변수를 정의할 수 있다.
$font-stack: Helvetica, sans-serif;
body {
	font: 100% $font-stack;
}위의 코드를 전처리하면 아래와 같이 CSS 파일이 생성되는데 출력물을 보고 있으면 변수라기 보다는 치환 매크로에 가깝다.
body {
	font: 100% Helvetica, sans-serif;
}(2) 중첩(Nesting)
CSS 는 셀렉터 사이에 포함하는 관계로 서술할 수 없다. 이는 중복된 코드를 작성하게 된다.
예를 들어서 아래와 같이 CSS를 서술 해보자.
// CSS
nav ul {
	margin: 0;
	padding: 0;
	list-style: none;
}
nav li {
	display: inline-block;
}
nav a {
	padding: 6px 12px;
	text-decoration: none;
}이것을 중첩 형태로 SCSS 식으로 다시 표기하면 아래와 같다.
// SCSS
nav {
	ul {
	    margin: 0;
	    padding: 0;
	    list-style: none;
	}
	li {
	    display: inline-block;
	}
	a {
	    padding: 6px; 12px;
	    text-decoration: none;
	}
}중첩된 식으로 나열하니 구조적으로 보기가 쉬워졌다.
(3) 파셜(Partials) and 임포트(import)
CSS 는 부분적으로 파일을 분리해서 파셜 형태로 작성 후에 불러오게끔 하는 @import 문을 지원하나 동적으로 HTTP request 요청을 하게 만드는 단점이 있다.
이러한 부분은 SASS의 파셜로 처리하면 CSS 를 생성하는 시점에서 합쳐서 처리할 수 있다.
SASS의 파셜 형태는 파일이름의 시작을 언더스코어(_)로 시작한다.
@import 지시어로 파셜 파일을 포함할 수 있다.
예를 들어서 아래의 @import ‘reset’ 은 _reset.scss 파일을 찾아서 포함한다. 전처리를 할 때 파일을 하나로 합쳐서 CSS 파일을 생성해준다.
// _reset.scss
html,
body,
ul,
ol {
	margin: 0;
	padding: 0;
}// base.scss
@import ‘reset’;
body {
	font: 100% Helvetica, sans-serif;
	background-color: #efefef;
}
// css 결과
html, body, ul, ol {
	margin: 0;
	padding: 0;
}
body {
	font: 100% Helvetica, sans-serif;
	background-color: #efefef;
}(4) 믹스인(Mixins)
CSS는 CSS3 이후 아주 많은 크롬 파이어폭스 브라우저 등의 벤더(vender-prefix) 가 존재한다. 믹스인은 @mixin 지시어로 CSS 그룹을 만들 수 있는데 이런 벤더 프리픽스를 모아서 처리할 때 유용하다.
믹스인을 정의하고 나서 해당 믹스인을 포함 시킬 때는 @include 지시어를 사용한다.
예를 들면 아래와 같다.
@mixin border-radius($radius) {
	-webkit-border-radius: $radius;
	-moz-border-radius: $radius;
	-ms-border-radius: $radius;
		border-radius: $radius;
}
.box { @include border-radius(10px); }// CSS 결과
.box {
	-webkit-border-radius: 10px;
	-moz-border-radius: 10px;
	-ms-border-radius: 10px;
	border-radius: 10px;
}여기서는 변수를 활용해서 border-radius 값을 일괄 치환했다.
(5) 확장/상속(Extend/Inheritance)
일반적인 언어에서 상속 개념과 매우 흡사하다. 특정 셀렉터의 속성을 @extend 지시어를 이용해서 상속할 수 있다.
// SCSS
.message {
	border: 1px solid #ccc;
	padding: 10px;
	color: #333;
}
.success {
	@extend .message;
	border-color: green;
}전처리 결과는 아래와 같다.
// CSS 결과
.message, .success {
	border: 1px solid #cccccc;
	padding: 10px;
	color: #333;
}
.success {
	border-color: green;
}(6) 연산자(Operators)
CSS 에서 수학 연산자 (+, -, *, /, %)가 지원 되듯이 sass 도 지원한다.
// SCSS
.container {
	width: 100%;
}
article[color=“main”] {
	float: left;
	width: 600px / 960px * 100%;
}// CSS 결과
.container {
	width: 100%;
}
article[color=“main”] {
	float: left;
	width: 62.5%;
}CSS 파일로 변환하면서 수치가 계산되었다는 것이 보인다.