SCSS 문법 더 알아보기

YEONGHUN KO·2022년 1월 6일
0

CSS/SCSS - BASICS

목록 보기
4/12
post-thumbnail

MIXIN

MIXIN를 이번에 배워보자. MIXIN는 함수와 모양과 기능이 비슷하다. 그리고 IF/ELSE 와 같은 조건문도 넣을 수 있다. 역시나 html 을 먼저 만들어주자. 홀수번째 google 은 파란색 짝수번째에 있는 google은 빨간색으로 설정해주려 한다.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="dist/css/reset.css" />
    <link rel="stylesheet" href="dist/css/styles.css" />
    <title>(S)CSS Masterclass</title>
  </head>
  <body>
    <a href="#">Google</a>
    <a href="#">Google</a>
    <a href="#">Google</a>
    <a href="#">Google</a>
    <a href="#">Google</a>
    <!-- google 이라는 링크를 5개 만들고 싶다고 하면 a*5{google} 이라고 하면 됨 -->
  </body>
</html>

그리고 _minxins.scss 란 파일을 만들어주자.(참고로 import하려는 파일은 styles.scss 와 같은 폴더안에 있어야 한다.)
mixin을 정의할때는 @ 기호를 사용하고 함수이름을 설정한다. 보면 알겠지만 인자까지 pass할 수 있다.

@mixin link($color) {
  text-decoration: none;
  display: block;
  color: $color;
}

@mixin awesome($word) {
  text-decoration: none;
  display: block;
  @if $word == "odd" {
    color: blue;
  } @else {
    color: red;
  }
} //엄청나지 않나?? 파이썬 함수 만들때 처럼 인자설정은 물론, if/else 문까지 쓸수 있다.

그리고 _minxins를 import 한다음 scss 코드를 적어주면 된다. include 를 이용해서 함수를 호출한다.

@import "_minxins";

a {
  margin-bottom: 10px;
  &:nth-child(odd) {
    @include awesome("odd");
  }
  &:nth-child(even) {
    @include awesome("even");
  }
} //파이썬 처럼 minxins 안에 있는 함수를 적용하였다. 이때 include 를 사용한다.

그럼 아래와 같이 짜잔하고 나타난다.

EXTEND

mixin 유연하게 css를 변환하는 반면 extend는 말그대로 그대로 옮겨다가 쓰는 용도이다. html 부터 먼저 만들자. log in 링크와 log out 버튼의 스타일을 같게 만들려고 한다.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="dist/css/reset.css" />
    <link rel="stylesheet" href="dist/css/styles.css" />
    <title>(S)CSS Masterclass</title>
  </head>
  <body>
    <a href="#">log In</a>
    <button>Log Out</button>
  
  </body>
</html>

그리고 _buttons.scss 라는 파일을 만들어 주자. extend를 만들때는 % 기호를 이용한다. 그럼 아래처럼 많은 기능을 한꺼번에 감싼 패키지같은걸 만들게 되는 셈이다.

%button {
    font-family: Georgia, 'Times New Roman', Times, serif;
    border-radius: 7px;
    text-decoration: none;
    text-transform: uppercase;    
    background-color: powderblue;
    color:white;
    font-weight: 500;
    padding: 5px 10px;
}

// extend를 쓰고 싶을때는 퍼센테이지 바로 옆에 함수의 이름이 있어야 한다.

그리고 import 해주자. @ 통해서 extend를 불러오고 아래에 새로운 css property를 추가 할 수 있다.

@import "_buttons";

a{
  @extend %button;
  text-decoration: none;
}

button {
  @extend %button;
  border: none;
}

// extend 함수는 minxins 과는 다르게 똑같은 함수를 가볍게 적용할 수 있다.
// minxins은 인자와 조건에 따라 유연하게 바뀌는 측면에서, 그리고 독립적으로 적용할 수 있다는 점에서 extend와 차이가 있다.

결과

function

@function grid($a: 1, $b: 2) {
  @return $a + $b;
}

//사용할때는 js랑 똑같다
.box {
  width: grid(1, 2);
}

혹시 built-in 함수랑 이름이 겹칠수 있으니 my-grid 라고 해주는 것이 좋다.

조건, 반복문

// 조건문
@mixin avatar($size, $circle: false) {
  width: $size;
  height: $size;

  @if $circle {
    border-radius: $size/2;
  }
}

// 삼항연산자
if(조건,true,false) .square-av {
  @include avatar(100px, $circle: false);
}

// 반복문
// each
@use "sass:list";

$size: 20px 40px 80px;
$fruits: (
  apple: 1,
  banana: 2,
);

@each $size in $sizes {
  $index: list.index($sizes, $size);
  .icon-#{$index} {
    height: $size;
    width: $size;
  }
}

//for
.list {
  position: relative;
  top: 0;
  @for $i from 1 through 3 {
    .item {
      width: 100px * $i;
    }
  }
}

//while
.list {
  position: relative;
  .item {
    $i: 1;
    $n: 8;
    @while $n > 0 {
      &:nth-child(#{$i}) {
        width: 100px * $n;
        height: 100px * $i;
      }

      $i: $i + 1;
      $n: $n - 2;
    }
  }
}

bootstrap을 통해서 이미 만들어져있는 변수를 사용가능하다.

&(자기자신 참조)

&

자기자신을 참조한다.

.container {
  &-a {...}
  &-b {...}
  &-c {...}
}

css로 나타내면 아래와 같다

.container-a {
 ...
}

.container-b {
 ...
}

.container-c {
 ...
}

보간기능

선택자 속성을 처리하거나, 문자를 치환할때 쓰이는 기능이다. #{} 기호를 사용한다.

예시 1.

@mixin box($position, $width, $color) {
    border-#{$position}: $width solid $color;
}

div{
    @include box(left, 2px, blue);
}
p{
    @include box(bottom, 1px, red);
}

그럼 아래 처럼 컴파일 되서 나온다

div {
  border-left: 2px solid blue;
}

p {
  border-bottom: 1px solid red;
}

예시2.

.list li.icon1 {
  background-image: url(img/icon1.svg);
}

.list li.icon2 {
  background-image: url(img/icon2.svg);
}

.list li.icon3 {
  background-image: url(img/icon3.svg);
}

.list li.icon4 {
  background-image: url(img/icon4.svg);
}


@for $i from 1 through 4 {
    .list li.icon#{$i} {
        background-image: url(img/icon#{$i}.svg);
    }
}

import

  • 모듈화: @use './variables'as var 라고 하면 사용할때는 var.$success 라고 하면 된다.

이런 방식을 '모듈화'라고 한다.

@use "./variables" as var var.$success;
  • forward: 다른 파일에서 사용가능하게 하는 키워드
// 이름 충돌 발생하지 않게 하는 과정. var-여기는 variables 안에있는 어떤 변수가 와도 상관없음.
// a.scss
@foward './variables' as var-*

// b.scss
// 요렇게 사용가능
@use /../a
width: a.$var-cool;

built-in 모듈/함수

  • darken($color, $amount): amount만큼 color가 어두워진다.
  • background-color: color.adjust($primary, $ligtness: -20%) : $primary 색깔 밝기가 20%정도 줄어든 색깔이 들어간다
  • saturate(color,amount) : color를 amount만큼 채도를 조정한다. ex)saturate(brown,50%) ⇒ 갈색의 채도가 50% 올라간다. // desaturate 라는 내장모듈도 있다.
  • list모듈
@use 'sass:list';

// append, index, join, length, nth 를 사용가능
$nations: KOREA,JAPAN,CHINA
$planet: EARTH, MOON, MARSE
$nations: list.append($nations,USA) // $nations: KOREA,JAPAN,CHINA,USA
$nations: list.index($nations,KOREA) // $nations: 0
$universe: list.join($nations,$planet) // $universe:KOREA, JAPAN, CHINA,EARTH, MOON, MARSE
list.length($universe) // 6
list.nth($universe,1) // JAPAN

map 모듈

@use "sass:map";
@use "sass:stirng" $my-info:
  (name: "YEONGHUN", address: "ULSAN" . age: 30, weight: 60) $another-info:
  (name: "HOHI", job: "teacher") map.get($my-info, name) // 'YEONGHUN'
  map.get($my-info, hello) // null
  // 따옴표가 없어짐
  string.unquote(map.get($my-info, name)) // YEONGHUN
  map.has-key($my-info, weight) // true
  map.keys($my-info) // name, address, age, weight
  map.values($my-info) // 'YEONGHUN' , 'ULSAN', 30, 60
  $new-info: map.merge($my-info, $another-info) /* $new-info: (
 name:'HOHI',
 address: 'ULSAN'.
 age: 30,
 weight: 60,
 job: 'teacher'
)
*/ $new-info: map.remove($new-info, job) // remove는 덮어쓸때만 사용 가능
  * * 참고로 key에 따옴표 적을 수 있음.;
  • math 모듈도 있음. 따로 찾아볼것.

  • meta

@use 'sass:meta'

// $cb 함수안에 200px 을 인자로 pass하게 됨
@function a($cb) {
 $res: meta.call($cb,200px)
 @return $res
}

@function c($s) {
 @return $s + 100px;
}

div {
  height: a(c)
}

meta.type-of(a) // function
  • string 모듈도 한 번 찾아볼것.

debug

@debug "heelo";
@warn 'be careful!';

// 에러메세지를 넣으면 컴파일이 이루어지지 않고 에러가 뜸
@error 'something missing';

debug는 console.log와 유사

warn은 console.warn 과 유사

error는 throw new Error 와 유사

profile
'과연 이게 최선일까?' 끊임없이 생각하기

0개의 댓글