20210521 SCSS, Sass 01 : SCSS vs Sass, 주석, 중첩(자손선택자), 자식선택자, 상위선택자 참조, 충첩 속성, 변수, 산술연산
SCSS 01
- Sass(SCSS) 완전 정복! by HEROPY blog
 - SCSS 공식 사이트
 - CSS style 전처리 패키지로서 CSS에서 개발상 불편함을 해소시키고자 여러 기능들을 제공하는 패키지
 
SCSS vs Sass
- SCSS 와 Sass 형태의 두가지 문법이 존재함, SCSS는 기존의 CSS와 호환이 잘 되고 비슷함
 - 둘의 문법 차이는 SCSS는 세미콜론, 중괄호를 사용하고 Sass는 인덴트로 범위를 인지하기 때문에 깔끔해 보이긴 하다.
 - Sass의 문제점을 보완하기 위해서 만든 문법이 SCSS라서 SCSS의 문법을 익히는게 좋다. (기능은 똑같다.)
 - 둘의 엄청큰 차이점은, Mixins에서 나타남
 
| 표기 | SCSS | Sass | 
|---|---|---|
| 범위 | {} | 
      인덴트 | 
    
| 명령종료 | ; | 
      없음 | 
    
| mixin | @mixin | 
      = | 
    
| include | @include | 
      + | 
    
SCSS
- CSS로 스타일 하는 경우, 하위 구조 스타일링을 할때마다 부모 요소까지 모두 작성해서 해야하는 반복이 생김 -> Sass의 중첩 기능을 사용하면 해결됨
 - 색상이나 그런 값들을 계속해서 반복적으로 적다보면 오타가 날수도 있고 한번에 통일하여 재활용하고 통합적인 수정을 위해서 필요함
 - CSS 전처리 도구(CSS Preprocessor) : CSS로 작업하지 않고 그전에 다른 형식으로 작업후 CSS로 변환(컴파일)한다고 해서 전처리라고 함
    
- SCSS, Sass, less, stylus
 
 - parcel 번들러가 SCSS파일의 존재를 알고 자동으로 sass 패키지를 설치함
 
주석
- CSS 에서 제공하는 
/* */, JS에서 제공하는//둘다 지원 /* */의 주석 방식은 compile 되어도 CSS 코드로 보여짐//에 따른 주석은 compile 되면 보여지지 않음
/* scss */
$color: tomato;
.container {
  h1 {
    color: $color;
    // background-color: orange;
    /* font-size: 60px; */
  }
}
/* css */
.container h1 {
  color: tomato;
  /* font-size: 60px; */
}
중첩 (자손 선택자의 경우)
- 특정 부모 요소 안에 있는 특정 자식 요소 모두를 선택하는 경우
 {}안에 html 구조, JS 객체 구조 처럼 사용하면 됨
/* scss */
.container {
  ul {
    li {
      font-size: 40px;
      .name {
        color: royalblue;
      }
      .age {
        color: orange;
      }
    }
  }
}
/* css */
.container ul li {
  font-size: 40px;
}
.container ul li .name {
  color: royalblue;
}
.container ul li .age {
  color: orange;
}
자식 선택자를 사용하는 경우
- 특정 부모 요소 안에 있는 특정 자식 소요 모두 말고 바로 아래 자식요소 선택하는 경우
 >
/* scss */
.container {
  > ul {
    li {
      font-size: 40px;
      .name {
        color: royalblue;
      }
      .age {
        color: orange;
      }
    }
  }
}
/* css */
.container > ul li {
  font-size: 40px;
}
.container > ul li .name {
  color: royalblue;
}
.container > ul li .age {
  color: orange;
}
상위 선택자 참조
- 여러개의 클래스를 가진 요소를 조건으로 스타일링 하는 경우, 및 비슷한 특징의 선택자 이름으로 많은 선택자를 적는 경우
 &- 기호가 포함된 자신과 상위 요소 참조
 &기호가 상위 요소로 치환 됨
/* scss */
.btn {
  position: absolute;
  &.active {
    color: red;
  }
}
.list {
  li {
    &:last-child {
      margin-right: 0;
    }
  }
}
/* css */
.btn {
  position: absolute;
}
/* 상위 선택자도 같이 병기 되어 여러개의 클래스를 다루게 됨 */
/* &.active -> .btn.active */
.btn.active {
  color: red;
}
/* &:last-child -> li:last-child */
.list li:last-child {
  margin-right: 0;
}
- 단순히 여러개를 가진 클래스 뿐만 아닌, 치환을 활용해서 공통된 특징을 같는 선택자 명을 빠르게 지을 수 있음
 
/* scss */
.fs {
  &-small {
    font-size: 12px;
  }
  &-medium {
    font-size: 14px;
  }
  &-large {
    font-size: 16px;
  }
}
/* css */
.fs-small {
  font-size: 12px;
}
.fs-medium {
  font-size: 14px;
}
.fs-large {
  font-size: 16px;
}
중첩된 속성
- 네임스페이스 : 이름을 통해 구분 가능한 범위를 만들어내는 것으로 일종의 유효범위를 지정하는 방법 (속성을 공통된 접두어? 같은 느낌으로 하는 것을 말함)
 - 속성 네임스페이스 뒤에 
:붙여주고{}하여 안에 상세 속성을 적음 ;으로 종료 시키는 것 중요
/*scss*/
.box {
  font: {
    weight: bold;
    size: 10px;
    family: sans-serif;
  }
  margin: {
    top: 10px;
    left: 20px;
  }
  padding: {
    top: 10px;
    bottom: 40px;
    left: 20px;
    right: 30px;
  }
}
/* css */
.box {
  font-weight: bold;
  font-size: 10px;
  font-family: sans-serif;
  margin-top: 10px;
  margin-left: 20px;
  padding-top: 10px;
  padding-bottom: 40px;
  padding-left: 20px;
  padding-right: 30px;
}
변수
- 재활용을 가능케 하고, 수정을 용의하게 함
 $를 사용해서 변수명 앞에 붙여주고 값할당은:로 할당 연산 시킴- SCSS 변수도 범위가 존재함, 
{}안 어디에 위치하느냐에 따라{}범위에서만 유효함 (유효 범위) - JS let 처럼 변수에 재할당이 가능함, 하지만 재할당 된부분 아래의 것은 무조건 범위 밖이어도 영향을 미침
 
/* scss */
.container {
  $size: 200px;
  position: fixed;
  top: $size;
  .item {
    /* 재할당 가능 */
    $size: 100px;
    width: $size;
    height: $size;
    transform: translateX($size);
  }
  left: $size;
}
/* css */
.container {
  position: fixed;
  top: 200px;
  /* 재할당 된부분 아래의 것은 무조건 범위 밖이어도 영향을 미침 */
  left: 100px;
}
.container .item {
  width: 100px;
  height: 100px;
  transform: translateX(100px);
}
산술 연산
- 나눗셈을 제외하고 평소대로 사용하면 그대로 연산이 됨
 
.div {
  width: 20px + 20px;
  height: 40px - 10px;
  font-size: 10px * 2;
  padding: 20px % 7;
  /* margin: 30px / 2; */
}
나눗셈 연산 문제
- 단축 속성에서 
/기호로 속성을 나누어 인식하여 사용이 겹치기 때문에 나누기로 연산하지 않음 
.span {
  font-size: 10px;
  line-height: 10px;
  font-family: serif;
  /* 단축 속성에서 '/'기호가 겹치기 때문에 연산하지 않음 */
  font: 10px / 10px serif;
}
- 나누기 연산하는 방법
 - 방법01 : 
()묶어서 사용 - 방법02 : 
$변수변수를 넣어 사용 - 방법03 : 다른 연산자를 미리 사용 (사칙연산 주의 -> 
()로 보완 가능) 
.div {
  $size: 30px;
  /* 나눗셈 문제 */
  /* margin: 30px / 2; */
  margin: (30px / 2);
  margin: $size / 2;
  /* 사칙연산 주의! */
  margin: 10px + 12 / 2;
  margin: (10px + 12) / 2;
}
다른 단위의 산술연산
- 다른 당위의 산술연산은 기본적으로 지원하지 않지만, 
calc()함수를 사용하면 됨 
.div {
  /* 다른 단위의 산술 연산 */
  /* width: 100% - 200px; */
  width: calc(100% - 200px);
}