@import "main"
@import "mixin"
@import "header"
@import "variables"
/* 주석은 보임 */
// scss파일에서만 보임 컴파일 되면 안보임
.box{
&:focus{} // 가상선택자
&:hover{}
&:active{}
&:first-child{}
&:nth-child(2){}
&:after{} //가상요소
&:before{}
& .title{}
& #title{}
}
div{
@at-root p {} //중첩에서 벗어남
}
//scss
$font-size: 10px 20px 30px; //폰트 사이즈 리스트
$text-align : center, left, right;
div.content{
p{
font-size: nth($font-size,1); // nth(변수명,인덱스)
text-align: nth($text-align,1);
}
}
/*css*/
div.content p {
font-size: 10px;
text-align: center;
}/*# sourceMappingURL=style.css.map */
//scss
$font-sizes : ('h1':45px, 'h2':19px, "p":16px);
div.content{
h2{
font-size: map-get($font-sizes , h2 );
}
}
/* css */
div.content h2 {
font-size: 19px;
}
$bgColor: #fff !global;
//scss 공식문서
@debug 100px > 10s; //Eroor
@debug 100 > 50px; //true
@debug 10px > 17; //true
@debug 100px + 10s; // error
div{
&::after{ content:"head" + "er" } // header
}
$width : 90px;
div{
@if not ($width > 100px){ // not은 false -> true반환
height:300px;
}
}
complied to:
div {
height: 300px;
}
//scss
@mixin 이름(매개변수); //생성
@include 이름(인수) //사용
mixin 사용)
//scss
@mixin large-text{
font:{
size:22px;
weight:bold;
family:sans-serif;
}
color: orange;
&::after{
content:"!!";
}
span.icon{
background:url('/imgage/icon.png');
}
}
.title{
@include large-text;
}
Compiled to
/*css*/
.title {
font-size: 22px;
font-weight: bold;
font-family: sans-serif;
color: orange;
}
.title::after {
content: "!!";
}
.title span.icon {
background: url("/imgage/icon.png");
}/*# sourceMappingURL=style.css.map */
인수사용 예시)
//scss
@mixin image-style($ul,$size,$repeat,$positionX:50%, $positionY:50%){ //
background:{
image:url($ul);
size:$size;
repeat:$repeat;
position: $positionX, $positionY;
}
}
.propile{
@include image-style("./assets/user.png", cover, no-repeat, center, center );
}
compiled to
/*css*/
.propile {
background-image: url("./assets/user.png");
background-size: cover;
background-repeat: no-repeat;
background-position: center, center;
}
mixin에 스타일 속성을 추가하여 전달하고 싶을때 사용한다.
@content 사용예시)
//scss
@mixin icon($url) {
&::after {
content: $url;
@content;
}
}
.icon1 {
// icon Mixin의 기존 기능만 사용
@include icon("/images/icon.png");
}
.icon2 {
// icon Mixin에 스타일 블록을 추가하여 사용
@include icon("/images/icon.png") {
position: absolute;
};
}
compiled to
/*css*/
.icon1::after {
content: "/images/icon.png";
}
.icon2::after {
content: "/images/icon.png";
position: absolute;
}
//scss
.btn {
padding: 10px;
margin: 10px;
background: blue;
}
.btn-danger {
@extend .btn;
background: red;
}
compiled to
/*css*/
.btn, .btn-danger {
padding: 10px;
margin: 10px;
background: blue;
}
.btn-danger {
background: red;
}
//scss
%base-button{
width:133px;
height:44px;
display: flex;
justify-content:center;
align-items: center;
}
.follow-button{
@extend %base-button;
background-color: #fff;
}
compiled to
/*css*/
.follow-button {
width: 133px;
height: 44px;
display: flex;
justify-content: center;
align-items: center;
}
.follow-button {
background-color: #fff;
}/*# sourceMappingURL=style.css.map */
//scss
$max-width: 980px;
@function columns($number: 1, $columns: 12) {
@return $max-width * ($number / $columns)
}
.box_group {
width: $max-width;
.box1 {
width: columns(); // 1
}
.box2 {
width: columns(8);
}
.box3 {
width: columns(3);
}
}
complied to
/*css*/
.box_group {
/* 총 너비 */
width: 980px;
}
.box_group .box1 {
/* 총 너비의 약 8.3% */
width: 81.66667px;
}
.box_group .box2 {
/* 총 너비의 약 66.7% */
width: 653.33333px;
}
.box_group .box3 {
/* 총 너비의 25% */
width: 245px;
}
//scss
//if(조건, 표현식1, 표현식2)
$div-width:500px;
.test2{
width:if($div-width > 300px, $div-width, null);
}
complied to
/*css*/
.test2 {
width: 500px;
}
//scss
@if(조건1){
/* 조건1이 참일떄 구문*/
} @else if (조건2){
/*조건2가 참일때 구문*/
}@else{
/*모든 조건이 거짓일때 실행구문*/
}
-조건에 ()는 생략이 가능하다
//scss 조건 생략문
$bg : true;
.test3{
@if $bg{background: url(/img/style.png);}
}
$color: orange;
div {
@if $color == strawberry {
color: #FE2E2E;
} @else if $color == orange {
color: #FE9A2E;
} @else if $color == banana {
color: #FFFF00;
} @else {
color: #2A1B0A;
}
}
complied to
/*css*/
.test3 {
background: url(/img/style.png);
}
div {
color: #FE9A2E;
}
//scss
//and 사용
@function limiteSize($size){
@if $size >= 0 and $size <= 200px {
@return 200px;
} @else{
@return 800px;
}
}
div {
width:limiteSize(100px);
height:limiteSize(300px);
}
complied to
/*css*/
div {
width: 200px;
height: 800px;
}
//scss
@mixin pCenter($w, $h, $p: absolute) {
@if
$p == absolute
or $p == fixed
// or not $p == relative
// or not $p == static
{
width: if(unitless($w), #{$w}px, $w); //단위 체크 px로
height: if(unitless($h), #{$h}px, $h);
position: $p;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}
}
.box1 {
@include pCenter(10px, 20px);
}
.box2 {
@include pCenter(50, 50, fixed);
}
.box3 {
@include pCenter(100, 200, relative);
}
complied to
/*css*/
.box1 {
width: 10px;
height: 20px;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}
.box2 {
width: 50px;
height: 50px;
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}
//scss
// 1부터 3번 반복(1,2,3)
@for $i from 1 through 3 {
.through:nth-child(#{$i}){
width: 20px * $i
}
}
// 1부터 3 직전까지만 반복 (1,2)
@for $i from 1 to 3{
.to:nth-child(#{$i}){
width: 20px * $i
}
}
complied to
/*css*/
.through:nth-child(1) { width: 20px; }
.through:nth-child(2) { width: 40px; }
.through:nth-child(3) { width: 60px; }
.to:nth-child(1) { width: 20px; }
.to:nth-child(2) { width: 40px; }
@each $변수 in 데이터 {
//반복 내용
}
-list 반복
//scss
$fruits:(apple, orange, banana, mango);
.fruits{
@each $fruit in $fruits{
li.#{$fruit}{
background:url('/style/link_#{$fruit}.png');
}
}
}
complied to
/*css*/
.fruits li.apple {
background: url("/style/link_apple.png");
}
.fruits li.orange {
background: url("/style/link_orange.png");
}
.fruits li.banana {
background: url("/style/link_banana.png");
}
.fruits li.mango {
background: url("/style/link_mango.png");
}
.fruits{
@each $fruit in $fruits {
$i : index($fruits, $fruit); //index($데이터, $변수명);
li:nth-child(#{$i}) { // i = 1,2,3,4
left:50px * $i; // left = 50,100,150,200
}
}
}
//scss
$apple : (apple, korean);
$orange : (orange, china);
$banana : (banana, japan);
@each $fru, $country in $apple, $orange, $banana{
.div_#{$fru} {
background:url("/img/style_#{$country}.png");
}
}
/*
css
.box-apple {
background: url("/images/korea.png");
}
.box-orange {
background: url("/images/china.png");
}
.box-banana {
background: url("/images/japan.png");
}
*/
-Map 데이터를 반복할 경우 $key변수와 $value변수가 필요함
//scss 문법
@each $key, $value in 데이터{
//반복내용
}
$fru-data : (
apple : korean,
orange : china,
banana : japan
);
@each $key-fru, $value-coun in $fru-data{
.div-#{$key-fru} {
background:url("/img/style_#{$value-coun}.png");
}
}
/* css
.div-apple {
background: url("/img/style_korean.png");
}
.div-orange {
background: url("/img/style_china.png");
}
.div-banana {
background: url("/img/style_japan.png");
}
*/
//문법
@while 조건 {
반복내용
}
//scss
$i: 6;
@while $i > 0 {
.item-#{$i} {
width: 2px * $i;
}
$i: $i - 2;
}
/*css
.item-6 { width: 12px; }
.item-4 { width: 8px; }
.item-2 { width: 4px; }
*/
Sass에서 기본적으로 제공하는 내장 함수에는 많은 종류가 있습니다.
모두 소개하지 않고, 주관적 경험에 의거해 필요하거나 필요할 수 있는 함수만 정리했습니다.
Sass Built-in Functions에서 모든 내장 함수를 확인할 수 있습니다.
mix($color1, $color2) : 두 개의 색을 섞습니다.
lighten($color, $amount) : 더 밝은색을 만듭니다.
darken($color, $amount) : 더 어두운색을 만듭니다.
saturate($color, $amount) : 색상의 채도를 올립니다.
desaturate($color, $amount) : 색상의 채도를 낮춥니다.
grayscale($color) : 색상을 회색으로 변환합니다.
invert($color) : 색상을 반전시킵니다.
rgba($color, $alpha) : 색상의 투명도를 변경합니다.
opacify(color, $amount) / fade-in(color, $amount) : 색상을 더 불투명하게 만듭니다.
transparentize(color, $amount) / fade-out(color, $amount) : 색상을 더 투명하게 만듭니다.
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) : 문자를 소문자로 변환합니다.
percentage($number) : 숫자(단위 무시)를 백분율로 변환합니다.
round($number) : 정수로 반올림합니다.
ceil($number) : 정수로 올림합니다.
floor($number) : 정수로 내림(버림)합니다.
abs($number) : 숫자의 절대 값을 반환합니다.
min($numbers…) : 숫자 중 최소 값을 찾습니다.
max($numbers…) : 숫자 중 최대 값을 찾습니다.
random() : 0 부터 1 사이의 난수를 반환합니다.
모든 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-get($map, $key) : Map에서 특정 key의 value를 반환합니다.
map-merge($map1, $map2) : 두 개의 Map을 병합하여 새로운 Map를 만듭니다.
map-keys($map) : Map에서 모든 key를 List로 반환합니다.
map-values($map) : Map에서 모든 value를 List로 반환합니다.
variable-exists(name) : 변수가 현재 범위에 존재하는지 여부를 반환합니다.(인수는 $없이 변수의 이름만 사용합니다.)
unit($number) : 숫자의 단위를 반환합니다.
unitless($number) : 숫자에 단위가 있는지 여부를 반환합니다.
comparable($number1, $number2) : 두 개의 숫자가 연산 가능한지 여부를 반환합니다.