##6. SassScript
- Interactive Shell
- Variables: $
- Data Types
- Operations
- Parentheses
- Functions
- Interpolation: #{}
- & in SassScript
- Variable Defaults: !default
###Interactive Shell
SassScript를 테스트해 보고 싶을 때, terminal(터미널)이나 cmd 환경에서 -i option을 사용 후 SassScript 표현식의 문법 코드를 작성하여 결과를 Prompt로 출력해볼수 있습니다.
$ sass -i
>> "Hello, Sassy World!"
"Hello, Sassy World!"
>> 1px + 1px + 1px
3px
>> #777 + #777
#eeeeee
>> #777 + #888
white
###Variables (변수)
Sass는 stylesheet 전반에 걸쳐 재사용 할 정보를 저장하는 방법으로 변수
를 사용합니다.
이 변수에는 색상, 글꼴 등의 그 어떤 Css라도 저장할 수 있으며, 변수를 사용할 때는 $
기호를 이용합니다.
// _style.scss
$font-stack: Helvetica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}
/*style.css*/
body {
font: 100% Helvetica, sans-serif;
color: #333;
}
단, 적절한 이유 없이는 변수를 선언하면 안됩니다. CSS에는 변수 이름에 대한 유효범위가 없기 때문에, 충돌의 위험성이 큽니다.
### Data Types
SassScript는 일곱가지의 기본 데이터 유형을 지원합니다 :
- 숫자 (numbers) - e.g. 1.2, 13, 10px(단위도 포함하여 숫자타입입니다.)
- __문자열 : ""(겹따옴표), ''(홑따옴표), 따옴표가 없는 것들 모두 문자열로 인식 (string) __ - e.g. "foo", 'bar', baz)
- 색상 (colors) - e.g. blue, #04a3f9, rgba(255, 0, 0, 0.5)
- booleans - e.g. true, false
- nulls - e.g. null
- __list :바스크립트의 배열과 유사하며 공백이나 쉼표(,)로 구분된 목록을 말합니다 __ - e.g. 1.5em 1em 0 2em,
Helvetica, Arial, sans-serif
- _map: 키: 값 으로 구성된 그룹으로 자바스크립트의 객체와 유사하며 map 과 관련된 함수로 값을 얻을 수 있습니다. - e.g. (key1: value1, key2: value2)
SassScript는 Unicode
와 !important
등 과 같은 CSS 속성 값의 모든 종류를 지원합니다. 그러나, 이러한 유형에 대한 특별한 처리는 없습니다.
그들은 단지 인용되지 않은 문자열처럼 취급하고 있습니다.
CSS 2종류 문자열의 지정 : "Lucida Grande"
또는 'http://sass-lang.com'
와 같은 인용 부호를 가지는 것, sans-serif
또는 bold
같은 인용 부호가없는 것. SassScript는 일반적으로 SassScript에서 사용되는 문자열, CSS로 컴파일 후 사용되는 문자열의 두종류를 인식합니다.
그러나 하나의 예외는 있습니다.: #{}보간법을 사용할 때, 따옴표로 둘러싸인(인용부호를 가진) 문자열은 따옴표로 둘러싸여 있지 않습니다. 이것은 mixin 안에서 선택자 이름을 사용할 때 그것을 쉽게 사용할 수 있도록 해줍니다.
// _style.scss
@mixin firefox-message($selector) {
body.firefox #{$selector}:before {
content: "Hi, Firefox users!";
}
}
@include firefox-message(".header");
/*style.css*/
body.firefox .header:before {
content: "Hi, Firefox users!"; }
}
List는 Sass 에서 margin: 10px 15px 0 0 or font-face: Helvetica, Arial, sans-serif
와 같이 CSS의 선언 값을 나타내는 방법입니다.
List는 그 자체로는 동작을 하지 않지만 SassScript list functions 에서는 유용하게 사용됩니다. nth function
에서는 list 안의 item에 액세스 할수있고, join function에서는 여러개의 list를 연동할 수 있고, append function에서는 list의 item을 추가할 수 있습니다. 또한 @each directive 에서는 스타일 안에 list로 열거한 값들을 추가할 수 있습니다.
간단한 값들을 포함하는것 외에도 다른 리스트 목록도 포함 할 수 있습니다. 예를 들어, 1px 2px, 5px 6px 은 1px 2px로 이루어진 리스트, 5px 6px 로 이루어진 리스트 두개를 포함하는 큰 리스트 입니다. 만약 안쪽의 list 값을 시작과 끝을 명확히 하고 싶다면 괄호 ()를 사용하면 됩니다.
예를 들어, (1px 2px) (5px 6px)도 또한 (1px 2px)로 이루어진 리스트, (5px 6px) 로 이루어진 리스트 두개를 포함하는 큰 리스트 입니다. 두개의 차이는 내부 리스트의 구분을 공백
으로 구분하는가 ,
로 구분하는가 일 뿐입니다.
list는 일반 Css로 컴파일 될 경우 Css가 list를 이해하지 않기 때문에 Sass는 ()
를 추가하지 않습니다. 즉,(1px 2px) (5px 6px) 과 1px 2px 5px 6px 이 동일하게 컴파일 됩니다. 그러나 ㅡSass에서 두가지는 동일하지 않습니다. : 첫번째는 두개의 list를 포함한 하나의 리스트이고 두번째 네개의 숫자를 포함하는 list 입니다.
또, list는 빈 항목을 가질 수 있습니다. 이때는 빈 값의 ()로 표현합니다.
그러나 이 값은 Css에서는 컴파일 할 수 없기 때문에 예로 font-family: ()
같은 값을 사용한다면 Sass는 에서는 오류가 발생합니다.
만약 list 에서 1px 2px () 3px or 1px 2px null 3px
와 같은 빈 list 나 null 값을 포함한다면 Css로 컴파일 하기 전에 제거해야합니다.
쉼표로 구분 된 목록 뒤에 쉼표가있을 수 있습니다.
맵은 키로 값을 찾는 곳에서 키와 값 사이의 관계를 나타냅니다.
동적으로 이름지어진 그룹의 values에 쉽게 접근이 가능합니다. (key들의 그룹으로 값을 수집할 수 있도록 해당 그룹에 접근이 가능)
맵은 항상 괄호로 묶어야 하며 쉼표로 구분해야 합니다.
Map은 대부분 SassScript 기능을 사용하여 조작할 수 있습니다.
@each 지시어를 사용하여 맵 내에서 각각의 키/값 쌍에 스타일을 정의하는데 사용됩니다.
$map: (key1: value1, key2: value2, key3: value3);
### Operators (연산)
Sass에서는 +, -, *, /, %
등의 수학의 사칙연산과 (>, <, ==, >-, <=, !=)등의 비교연산, 문자접합 등을 지원합니다.
// _style.scss
p {
font: 10px/8px; // 일반적인 css 로는 나누기 연산을 할 수 없다
$width: 1000px;
width: $width/2; // 변수를 사용하여 나누기 연산을 실행
width: round(1.5)/2; // 사스함수를 사용하여 나누기 연산을 실행
height: (500px/2); // 괄호를 사용하여 나누기 연산을 실행
margin-left: 5px + 8px/2px; // 플러스 연산자와 함께 나누기 연산을 실행
font: (italic bold 10px/8px); // 리스트의 괄호에선 연산할 수 없다.
}
/*style.css*/
p {
font: 10px/8px;
width: 500px;
height: 250px;
margin-left: 9px; }
#{}을 사용했을 때의 예시 :
// _style.scss
p {
$font-size: 12px;
$line-height: 30px;
font: #{$font-size}/#{$line-height};
}
/*style.css*/
p {
font: 12px/30px; }
sass에서는 색깔연산도 가능합니다.
#112233 + #332211 이런식으로 사용가능하며 # 11 22 33 에서 11은 Red, 22는 Green 33은 Blue 값을 나타내는 RGB숫자로 구성이 되어있습니다. 각각 숫자는 16진수로 표시되고 서로 연산시 red는 red끼리 green은 green끼리 blue는 blue끼리 연산이 되게 됩니다.
ex) #128012 + #212223 = #33a235
}
\#552230 - #225010 = #330020
- green값이 22-50이 되어 마이너스로 가게되면 그냥 00으로 표시됩니다.
\#224400 * #aa02ff = #ff8800
- red값은 22*ff는 ff를 초과하였지만 그냥 ff로 표시됩니다. 또한 00*ff는 0은 곱셈을 하면 무조건 0이 나오기때문에 00이 나오게됩니다.
\#101010 / #102021 = #010100
- 여기서 확인할수 있는건 10/20 = 0.5 까지는 01을 반환하나 그이상가면 00을 반환하는거로 봐서 소수점은 반올림 한다는 것을 확인할 수 있습니다.
##### String Operations
sass는 문자열끼리의 연산도 지원합니다.
문자열끼리는 오로지 `'+'`연산만이 지원이되며 -,*,/ 는 무시합니다.
```SCSS
ex) 'ab'+'cd' = 'abcd'
}
##### Boolean Operations
참/거짓 연산자는 보통 언어에서 지원하는것과 동일합니다
```SCSS
ex) true and true = true
}
true and false = false
true or true = true
true or false = false
##### List Operations
sass에서는 list연산이 불가능합니다
(a,b) + (c,d) 를 하여도 (a,b,c,d) 가 나오질 않습니다.
list연산을 사용하려면 사스의 내장함수를 사용하시기 바랍니다.
[SassScript list functions](http://sass-lang.com/documentation/Sass/Script/Functions.html#list-functions)
<br><br>
아래는 width값을 알아내기 위한 간단한 연산 예문입니다.
```SCSS
/// _style.scss
.container { width: 100%; }
article[role="main"] {
float: left;
width: 600px / 960px * 100%;
}
aside[role="complimentary"] {
float: right;
width: 300px / 960px * 100%;
}
연산을 사용하면 모든 계산된 수치값을 지정할 필요 없이 값들을 유동적으로 뽑아낼 수 있습니다.
예시문에서는 container
클래스의 width
값만 변경한다면 article,aside
의 값도 자동으로 반영되어 변경됩니다.
유지보수가 훨씬 간단해질 수 있습니다.
/* style.css */
.container {
width: 100%;
}
article[role="main"] {
float: left;
width: 62.5%;
}
aside[role="complimentary"] {
float: right;
width: 31.25%;
}
p {
width: 1em + (2em * 3);
}
sass에서는 보통 수학에서의 계산과 마찬가지로 괄호연산이 우선적으로 이루어집니다.
p { width: 7em; }
sass자체에서 지원하는 내장함수들입니다.
sass Functions 링크를 통해 들어가셔서 api를 확인하실 수 있습니다.
SASS 는 변수를 "" 내부에서 처리할 수 있는 보간법을 지원하고 있습니다. 다시 말해서, #{} 구문을 사용하여 선택자 및 속성 이름에 변수를 사용할 수가 있습니다.
//style.scss
$name: foo;
$attr: border;
p.#{$name} {
#{$attr}-color: blue;
}
/* style.css */
p.foo {
border-color: blue; }
#{} 은 SassScript의 속성값에서 사용하는 것도 가능합니다. <해석불가>
//style.scss
p {
$font-size: 12px;
$line-height: 30px;
font: #{$font-size}/#{$line-height};
}
/* style.css */
p {
font: 12px/30px; }
!default 플래그는 value값의 끝에 쓰고 변수가 이미 할당된 경우는 재할당하지 않지만 아직 값을 갖지 않는 null인 경우에는 !defalut 플래그의 value값으로 할당됩니다.
// _style.scss
$content: "First content";
$content: "Second content?" !default;
$new_content: "First time reference" !default;
#main {
content: $content;
new-content: $new_content;
}
$content: null;
$content: "Non-null content" !default;
#main {
content: $content;
}
#demo {
$width : 5em !global; // 전역변수처럼 사용합니다.
width: $width;
}
#sidebar {
width: $width;
}
/*style.css*/
#main {
content: "First content";
new-content: "First time reference";
}
#main {
content: "Non-null content";
}
#demo {
width: 5em;
}
#sidebar {
width: 5em;
}
!global
flag 를 사용하면 중괄호 안에 선언한 지역변수도 전역변수로 설정할 수 있습니다.
// _style.scss
#main {
$width: 5em !global;
width: $width;
}
#sidebar {
width: $width;
}
/*style.css*/
#main {
width: 5em;
}
#sidebar {
width: 5em;
}