Sass(SCSS)
Sass - 웹은 css만 동작하기에 전처리기(Less, Sass(SCSS), Stylus)라고 부름(컴파일하면 css로 나옴)
Sass와 SCSS는 차이점 - Sass(Syntactically Awesome Stylus Sheets)의 3버전에서 새롭게 등장한 SCSS는 CSS 구문과 완전히 호환되도록 새로운 구문을 도입해 만든 Sass의 모든 기능을 지원하는 CSS의 상위집합, SCSS는 CSS와 거의 같은 문접으로 Sass 기능을 지원한다는 뜻, 가장 간단한 차이는 {}와 ;의 유무(Sass는 안씀, SCSS는 사용), Sass는 mixins 기능을 =,+로 사용하고 SCSS는 @mixin, @include로 사용
주석 - 컴파일되지 않는 주석(//)은 css로 변환되지 않음, 기본 주석(/* */)은 css로 변환이 됨
// 컴파일되지 않는 주석 /* 컴파일되는 주석 */ //Sass *줄이 잘 맞아야함 - SCSS상관 없음 /* 컴파일되는 * 여러 줄 * 주석 */
데이터 종류 - null이 사용되면 컴파일하지 않음, Maps는 ()를 꼭 붙여야 함
중첩(Nesting) - 중첩 기능을 통하여 상위 선택자의 반복을 피하고 복잡한 구조를 편리하게 작성 가능& Ampersand(상위 선택자 참조) - 중첩 안에서 & 키워드는 상위 선택자를 참조하여 치환
.btn { position: absolute; &.active { color: red; } } //&.active의 의미는 .btn.active{ color: red; }
@at-root(중첩 벗어나기) - 중첩안에서 생성하되 중첩 밖에서 사용해야 할 경우
.list { $w: 100px; $h: 50px; li { width: $w; height: $h; } @at-root .box { width: $w; height: $h; } } //@at-root의 의미는 .list li { width: 100px; height: 50px; } .box { width: 100px; height: 50px; }
중첩된 속성 - font-, margin- 등과 같이 동일한 네임스페이스를 속성들을 편하게 작성 가능
.box { font: { weight: bold; size: 10px; family: sans-serif; }; margin: { top: 10px; left: 20px; }; padding: { bottom: 40px; right: 30px; }; } .box { font-weight: bold; font-size: 10px; font-family: sans-serif; margin-top: 10px; margin-left: 20px; padding-bottom: 40px; padding-right: 30px; }
변수 - 변수 이름 앞에 $를 붙임($변수이름: 속성값)
!global(전역 설정) - 플래그를 사용하여 변수의 유효범위를 전역으로 설정함
$color: #111 !global;
!default(초깃값 설정) - 할당되지 않은 변수의 초깃값 설정이므로 할당되어 있는 변수가 있으면 기존 할당 값 사용됨, '혹시 기존 변수가 있을 경우 현재 설정하는 변수의 값은 사용하지 않겠다'는 의미
$color-primary: blue !default;
#{}(문자 보간) - 코드에 변수 값을 넣을 때 사용
//unquote()는 문자에서 따옴표를 제거 $family: unquote("Droid+Sans"); @import url("http://fonts.googleapis.com/css?family=#{$family}"); //결과는 @import url("http://fonts.googleapis.com/css?family=Droid+Sans");
가져오기(import) - @import로 가져올 수 있음, 여러 파일 가져올 때는 파일 이름을 ,로 구분
//CSS 규칙으로 컴파일되는 상활들 //파일 확장자가 .css일 때 @import "hello.css"; //파일 이름이 http://로 시작 @import "http://hello.com/hello"; //url()이 붙었을 경우 @import url(hello); //미디어쿼리가 있는 경우 @import "hello" screen; @import "header", "footer";
파일 분할(Partials) - header나 side-menu 같이 각 기능과 부분으로 나눌때는 파일 이름 앞에 _를 붙이면 컴파일시 각각 생기지 않고 임포트되는 css만 생성이 됨
연산 - *(곱하기) 사용시 하나 이상의 값이 반드시 숫자여야 하고 /(나누기) 사용시 오른쪽 값이 반드시 숫자여야 함
숫자
상대적 단위 연산 - 상대적 단위(%, em, vw등)의 연산의 경우 CSS(calc())로 연산
width: calc(50% - 20px);
나누기 연산의 주의사항 - 속성 값의 숫자를 분리하는 방법으로 /를 허용하기 때문에 /가 나누기 연산으로 사용되지 않을 수 있음
div { $x: 100px; width: $x / 2; // 변수에 저장된 값을 나누기 height: (100px / 2); // 괄호로 묶어서 나누기 font-size: 10px + 12px / 3; // 더하기 연산과 같이 사용 }
문자(String) - 문자 연산의 결과는 첫 번째 피연산자를 기준으로 함, 첫 번째 피연산자에 따옴표가 붙어있다면 연산 결과를 따옴표로 묶고 첫 번째 피연산자에 따옴표가 붙어있지 않다면 연산 결과도 따옴표를 처리하지 않음
논리(Boolean) - @if 조건문에서 사용되는 논리 연산에는 and, or, not이 있음
재활용(Mixins) - 재사용 할 css 선언 그룹을 정의하는 기능, 만들어서 선언(@mixin)하고 사용(@include)함
//:하고 값을 지정하면 값이 안들어올때의 default값(인수의 기본값) @mixin size($w: 100px, $h: 100px){ width:$w; height: $h; } .box1{ @include size; } .box2{ @include size(200px, 100px); } //키워드 인수 .box3{ @include size($h:300px); } //컴파일 하면 .box1 { width: 100px; height: 100px; } .box2 { width: 200px; height: 100px; } .box3 { width: 100px; height: 300px; }
@mixin - SCSS와 Sass는 조금 다름, &도 사용 가능
//SCSS @mixin name{ style; } //Sass =name style
@include - 선언된 Mixin을 사용
//SCSS @include name; //Sass +name
인수(Arguments) - 함수처럼 인수를 가질 수 있고, 기본값 설정과 키워드 인수, 가변인수(...)를 설정할 수 있음
//가변인수 ... @mixin var($w, $h, $bg...){ width: $w; height: $h; background: $bg; } .box{ @include var(100px, 200px, url("image/a.png") no-repeat 10px 2px); } //컴파일하면 .box { width: 100px; height: 200px; background: url("image/a.png") no-repeat 10px 2px; }
//가변인수를 전달할 때 @mixin font( $style: normal, $weight: normal, $size: 16px, $family: sans-serif ) { font: { style: $style; weight: $weight; size: $size; family: $family; } } div { // 매개변수 순서와 개수에 맞게 전달 $font-values: italic, bold, 16px, sans-serif; @include font($font-values...); } span { // 필요한 값만 키워드 인수로 변수에 담아 전달 $font-values: (style: italic, size: 22px); @include font($font-values...); } a { // 필요한 값만 키워드 인수로 전달 @include font((weight: 900, family: monospace)...); } //컴파일하면 div { font-style: italic; font-weight: bold; font-size: 16px; font-family: sans-serif; } span { font-style: italic; font-weight: normal; font-size: 22px; font-family: sans-serif; } a { font-style: normal; font-weight: 900; font-size: 16px; font-family: monospace; }
@content - 원하는 스타일 블록을 전달
@mixin icon ($url){ &::after{ content: $url; @content; } } .box1{ @include icon("image/icon.png"); } .box2{ @include icon("image/icon.png"){ display: block; position: absolute; width: 100px; height: 100px; }; } //컴파일하면 .box1::after { content: "image/icon.png"; } .box2::after { content: "image/icon.png"; display: block; position: absolute; width: 100px; height: 100px; }
확장(Extend) - 특정 선택자가 다른 선택자의 모든 스타일을 가져야하는 경우(권장하지 않음 Mixin을 추천)
.btn { padding: 10px; margin: 10px; background: blue; } .btn-danger { @extend .btn; background: red; } //컴파일 하면 ,는 다중 선택자라서 둘다의 의미임 .btn, .btn-danger { padding: 10px; margin: 10px; background: blue; } .btn-danger { background: red; }
//원치 않는 CSS가 생성됨 .container { width: 300px; height: 300px; background: red; .item{ width: 200px; height: 200px; background: blue; .icon{ width: 100px; height: 100px; background: green; } } } .new-icon{ @extend .icon; } //컴파일하면 .container { width: 300px; height: 300px; background: red; } .container .item { width: 200px; height: 200px; background: blue; } //원하지 않는 부분까지 생김 .container .item .icon, .container .item .new-icon { width: 100px; height: 100px; background: green; }
함수(Functions) - Mixin은 지정한 스타일을 반환하는 반면, 함수는 보통 연산된 특정 값을 @return 지시어를 통해 반환, 내장 함수와의 충돌주의
@function 함수이름($매개변수){ @return 값 } // Functions 사용 함수이름(인수);
//Mixins와 비슷하게 사용 @function columns($number: 1, $columns: 12, $width: 1200px){ @return $width * ($number / $columns); } .container{ $width: 1800px; width: $width; .item:nth-child(){ width: columns(); } .item:nth-child(2){ width: columns(8); } .item:nth-child(3){ width: columns(3, $width: $width); } } //컴파일 결과 .container { width: 1800px; } .container .item:nth-child() { width: 100px; } .container .item:nth-child(2) { width: 800px; } .container .item:nth-child(3) { width: 450px; }
조건과 반복
if(함수) - 조건의 값이 true이면 표현식1을, false이면 표현식2를 실행(삼항 연산자와 비슷)
if(조건, 표현식1, 표현식2)
@if(지시어) - 조건에 따른 분기 처리가 가능하며, 같이 사용할 수 있는 지시어는 @else, @else if가 있음, 조건에 ()는 생략 가능
@for - 반복위해서
//그 숫자까지(1~3) @for $index from 1 through 3 { .through:nth-child(#{$index}){ width: 20px * $index; } } //그 숫자 직전까지(1~2) @for $index from 1 through 3 { .through:nth-child(#{$index}){ width: 20px * $index; } }
@each - List와 Map데이터를 반복할 때 for in문과 유사
@each $변수 in 데이터 { // 반복 내용 }
//List $fruits: apple, orange, banana, mango; .fruits{ @each $fruit in $fruits{ //index 내장 함수 $index: index($fruits, $fruit); li:nth-child(#{$index}){ left: 50px * $index; background: url("/images/#{$fruit}.png"); } } } //컴파일 후 .fruits li:nth-child(1) { left: 50px; background: url("/images/apple.png"); } .fruits li:nth-child(2) { left: 100px; background: url("/images/orange.png"); } .fruits li:nth-child(3) { left: 150px; background: url("/images/banana.png"); } .fruits li:nth-child(4) { left: 200px; background: url("/images/mango.png"); }
//Map $fruits-data: ( apple: korea, orange: china, banana: japan ); @each $fruit, $country in $fruits-data{ //인덱스를 파악하기 위해서 Map데이터를 List로 바꿔야함 //map-keys($fruits-data) => (apple, orange, banana) //map-values($fruits-data) => (korea, china, japan) $fruits-data-key-list : map-keys($fruits-data); $index: index($fruits-data-key-list, $fruit); .box-#{$fruit} { width: 100px * $index; background: url("/images/#{$country}.png"); } }
@while - 조건이 false로 평가될 때까지 내용을 반복 잘못된 조건으로 인해 무한루프에 빠질 수 있으므로 사용 자제
@while 조건 { // 반복 내용 }
내장 함수 - []는 선택 가능한 인수, Zero-based numbering(0부터 시작)을 사용 안함(https://sass-lang.com/documentation/modules)
색상(RGB / HSL / Opacity) 함수
mix($color1, $color2) : 두 개의 색을 섞습니다.
lighten($color, $amount) : 더 밝은색을 만듭니다.
darken($color, $amount) : 더 어두운색을 만듭니다.
saturate($color, $amount) : 색상의 채도를 올립니다.
desaturate($color, $amount) : 색상의 채도를 낮춥니다.
grayscale($color) : 색상을 회색으로 변환합니다.
invert($color) : 색상을 반전시킵니다.
rgba($color, $alpha) : 색상의 투명도를 변경합니다. css내장 함수보다 더 간편해서 자주씀!!!
opacify($color, $amount) / fade-in($color, $amount) : 색상을 더 불투명하게 만듭니다.
transparentize($color, $amount) / fade-out($color, $amount) : 색상을 더 투명하게 만듭니다.
문자(String) 함수
unquote($string) : 문자에서 따옴표를 제거합니다.
quote($string) : 문자에 따옴표를 추가합니다.
str-insert($string, $insert, $index) : 문자의 index번째에 특정 문자를 삽입합니다.
str-index($string, $substring) : 문자에서 특정 문자의 첫 index를 반환합니다.
str-slice($string, $start-at, [$end-at]) : 문자에서 특정 문자(몇 번째 글자부터 몇 번째 글자까지)를 추출합니다.
to-upper-case($string) : 문자를 대문자를 변환합니다.
to-lower-case($string) : 문자를 소문자로 변환합니다.
숫자(Number) 함수
percentage($number) : 숫자(단위 무시)를 백분율로 변환합니다.
round($number) : 정수로 반올림합니다.
ceil($number) : 정수로 올림합니다.
floor($number) : 정수로 내림(버림)합니다.
abs($number) : 숫자의 절대 값을 반환합니다.
min($numbers…) : 숫자 중 최소 값을 찾습니다.
max($numbers…) : 숫자 중 최대 값을 찾습니다.
random() : 0 부터 1 사이의 난수를 반환합니다.
List 함수 - 모든 List 내장 함수는 기존 List 데이터를 갱신하지 않고 새 List 데이터를 반환함, 모든 List 내장 함수는 Map 데이터에서도 사용 가능
length($list) : List의 개수를 반환합니다.
nth($list, $n) : List에서 n번째 값을 반환합니다.
set-nth($list, $n, $value) : List에서 n번째 값을 다른 값으로 변경합니다.
join($list1, $list2, [$separator]) : 두 개의 List를 하나로 결합합니다.
zip($lists…) : 여러 List들을 하나의 다차원 List로 결합합니다.
index($list, $value) : List에서 특정 값의 index를 반환합니다.
Map 함수 - 모든 Map 내장 함수는 기존 Map 데이터를 갱신하지 않고 새 Map 데이터를 반환
map-get($map, $key) : Map에서 특정 key의 value를 반환합니다.
map-merge($map1, $map2) : 두 개의 Map을 병합하여 새로운 Map를 만듭니다.
map-keys($map) : Map에서 모든 key를 List로 반환합니다.
map-values($map) : Map에서 모든 value를 List로 반환합니다.
관리(Introspection) 함수
variable-exists(name) : 변수가 현재 범위에 존재하는지 여부를 반환합니다.(인수는 $없이 변수의 이름만 사용합니다.)
unit($number) : 숫자의 단위를 반환합니다.
unitless($number) : 숫자에 단위가 있는지 여부를 반환합니다.
comparable($number1, $number2) : 두 개의 숫자가 연산 가능한지 여부를 반환합니다.
댓글
댓글 쓰기