반응형

Sass 문법에서 많이 사용하진 않지만 

알고 있으면 유용하게 사용할 상황이 생기지 않을까하여 포스팅하게 되었다.

unique-id 는 말 그대로 고유한 id값을 생성해서 Sass 문법을 작성할 수 있게 도와준다.

 

1. unique-id() 란

예시를 보면 이해할 수 있다.

/* SCSS */
$id: unique-id();

.#{$id}{color:red}


/* CSS Compiled */
.u4a1gxy {
  color: red;
}

$id라는 변수에 unique-id() 를 사용하게 되면

임의의 문자열이 정의된다.

css로 컴파일 된 내용을 봤을때도 .u4a1gxy라는 임의의 값이 출력 된 것을 볼 수 있다.

물론 새로 저장해서 컴파일을 다시 하게되면 해달 값은 또 바뀐다.

 

2. unique-id() 응용

위의 예시와 같이 클래스를 unique-id를 통해 사용하게 된다면

html 구조상 동일한 이름의 클래스가 없으면 소용이 없게된다.

 

그렇다면 어떤 상황에서 사용하면 좋을지에 대해서 생각해보니

css 문법안에서 정의하고 그 정의한 내용을 css 문법 안에서 사용할 수 있는 경우에

사용하면 유용할 것이라 생각했다.

 

대표적으로 animation 속성이 있다.

animation은 특정 name을 정의하고

그 name값에 해당하는 내용을 keyframes로 애니메이션 효과를 적용하기 때문에

css 문법 내에 정의하는 animation-name과 keyframes를 unique-id()로 사용할 수 있겠다.

 

이때, 주의해야할 점은 unique-id()를 사용해서 임의의 변수를 만들어

그 변수를 통해 animation-name과 keyframes 값을 적용시켜야 할 것이다.

/* SCSS */
.box{
  $name: unique-id();

  animation-name: $name;
  animation-duration: 0.5s;
  animation-iteration-count: infinite;

  @keyframes #{$name} {
    from { transform:scale(1.5); }
    to { transform:scale(1); }
  }
}


/* CSS Compiled */
.box {
  animation-name: u4a1h1g;
  animation-duration: 0.5s;
  animation-iteration-count: infinite;
}
@keyframes u4a1h1g {
  from {
    transform: scale(1.5);
  }
  to {
    transform: scale(1);
  }
}

위의 예시와 같이 $name이라는 변수에 unique-id()를 담고

해당 $name 변수를 animation-name과 @keyframes 의 이름 값을 일치시켜 준다.

 

3. unique-id() 사용시 주의사항

위의 예제들과 같이 사용하게 되면 특별한 문제는 없겠지만

2번에서 설명한 것 처럼 하나의 $name과 같은 변수에 unique-id()를 담아서 사용하는 것이 아니라

각각 unique-id()를 적용하면 내가 원하는 값을 받아올 수 없을 것이다.

/* SCSS */
.box{
  animation-name: unique-id();
  animation-duration: 0.5s;
  animation-iteration-count: infinite;

  @keyframes #{unique-id()} {
    from { transform:scale(1.5); }
    to { transform:scale(1); }
  }
}


/* CSS Compiled */
.box {
  animation-name: u4a1h6k;
  animation-duration: 0.5s;
  animation-iteration-count: infinite;
}
@keyframes u4a1h6l {
  from {
    transform: scale(1.5);
  }
  to {
    transform: scale(1);
  }
}

위의 소스를 보면 확인할 수 있다.

 

unique-id()를 animation-name, @keyframes에 각각 적용을 하게 되면

위와 같이 비슷한듯 다른 unique-id값이 출력이 되기 때문에

애니메이션 효과 자체를 구현할 수 없게된다.

 

 

 


참고

sass-lang.com/documentation/interpolation

 

 

 

반응형
반응형

Sass 문법에서 placeholder 선택자는 일반적인 클래스와 같이 쓰이지만

일반적인 클래스와 다르게 단독으로 사용하면 css에 컴파일이 되지 않고

%(퍼센트) 문자와 함께 사용이 된다.

 

1. placeholder 선택자 특징

- % 문자와 함께 사용

- 단독으로 사용하면 css로 컴파일되지 않는다.

- 함수나 변수를 사용하듯 내가 원하는 요소에 불러와서 사용할 수 있다.

- 만들어 놓은 placeholder 선택자는 @extend를 통해 호출한다.

 

 

앞서 설명했 듯 placeholder 선택자는 사용 자체는 일반적인 클래스나 아이디와 같은 선택자를 사용하듯 사용한다.

그리고 (% + 선택자명) 으로 사용한다.

/* SCSS */
.box, %box-style{
  border:1px solid #333;
  background:#fff;
}


/* CSS */
.box{
  border:1px solid #333;
  background:#fff;
}

위의 예시를 보면 .box와 %box-style에 border, background css를 적용했지만

컴파일 된 내용을 본다면 .box에만 css가 적용된 것을 볼 수 있다.

 

일종의 변수나 함수의 개념으로 보면 된다.

 

%box-style에 스타일을 적용해놓고 그것을 호출할때만 사용을 할 수 있다.

호출할 때는 @extend를 통해 호출한다.

/* SCSS */
.box, %box-style{
  border:1px solid #333;
  background:#fff;
}

.box2{
  @extend %box-style;
}


/* CSS */
.box, .box2{
  border:1px solid #333;
  background:#fff;
}

 

2. placeholder 선택자 응용

위의 특징을 바탕으로 반복되는 공통된 css 스타일을 %placeholder 선택자로 만들어 놓고

원하는 곳에 손쉽게 사용할 수 있다.

/* SCSS */
%common-btn{
  border:1px solid #333;
  padding:5px 10px;
  
  &:hover{
    border-color:red;
  }
}

.button1{
  @extend %common-btn;
  color:#555;
}

.button2{
  @extend %common-btn;
  color:#999;
}


/* CSS */
.button1, button2{
  border:1px solid #333;
  padding:5px 10px;
}

.button1:hover, button2:hover{
  border-color:red;
}

.button1{
  color:#555;
}

.button2{
  color:#999;
}

위 예시와 같이 .button1과 .button2에 반복되는 스타일인 border, padding, hover을 %common-btn으로 만들고

각 .button1, .button2에 @extend로 호출해주면 반복되는 내용을 여러번 입력하지 않아도 되고

공통되는 스타일이 수정이 된다고하면 유지보수하기도 원활할 것이다.

 

 

 

반응형
반응형

Sass 문법은 일반적인 자바스크립트 문법과 같이

조건문 반복문과 같은 문법을 사용하여 css를 작성할 수 있다.

 

Sass 문법에서 사용하는 for문에 대해 알아보려한다.

 

1. @for 문의 사용

기본적으로 Sass의 다른 문법 및 함수 사용과 마찬가지로 @(골뱅이) 문자와 함께 for문을 사용한다.

@for 변수 from (시작 숫자) to (끝 숫자){...}

의 형태로 작성하고 to 대신 through를 작성할 수 있다. 

to와 through의 차이는 포스팅 하단에 예시를 통해 다룰 것이다.

 

위의 @for 문 작성 형식을 통해 예시를 보이자면

/* SCSS */
@for $i from 1 to 3{
  .icon_#{$i}{
    background-position:0 ($i * -10px);
  }
}


/* CSS */
.icon_1{background-position:0 -10px;}
.icon_2{background-position:0 -20px;}

위와 같이 작성하고 컴파일 되는 것을 확인할 수 있다.

$i라는 임의의 변수와 함께 반복될 범위의 숫자를 입력해서 사용한다.

 

@for 문을 작성할 때 변수보간법으로 처리해야 컴파일 에러가 발생하지 않는다.

2021.04.01 - [Frontend/Sass (SCSS)] - [Sass 특징] Interpolation (보간법, #{})

 

 

 

2. @for $var from ~ to ~ {...}

@for 반복문의 사용은 크게 from~to와 from~through 2가지 방법이 있다.

그 중 to의 경우 to 뒤에 나오는 숫자 미만의 반복되는 값을 사용한다. (해당 숫자 비포함)

/* SCSS */
@for $i from 0 to 5{
  .animal_#{$i}{
    background-position:0 ($i * -10px);
  }
}


/* CSS */
.animal_0{background-position:0 0;}
.animal_1{background-position:0 -10px;}
.animal_2{background-position:0 -20px;}
.animal_3{background-position:0 -30px;}
.animal_4{background-position:0 -40px;}

 

3. @for $var from ~ through ~ {...}

두 번째 방법인 through을 사용하는 방법은

through 뒤에 나오는 숫자 이하로 반복되는 값을 사용한다. (해당 숫자 포함)

/* SCSS */
@for $i from 0 through 5{
  .animal_#{$i}{
    background-position:0 ($i * -10px);
  }
}


/* CSS */
.animal_0{background-position:0 0;}
.animal_1{background-position:0 -10px;}
.animal_2{background-position:0 -20px;}
.animal_3{background-position:0 -30px;}
.animal_4{background-position:0 -40px;}
.animal_5{background-position:0 -50px;}

다른 소스는 2번의 to와 같지만 to -> through만 달라졌는데

컴파일되는 css값은 .animal_5이 하나 더 출력이 되었다.

 

이처럼 내가 원하는 범위만큼의 숫자를 출력하기 위해서는

to와 through의 사용시 차이점에 대해 익히고 사용할 필요가 있을 것 같다.

 

 

 


참고

sass-lang.com/documentation/at-rules/control/for

 

 

 

 

 

 

반응형
반응형

Sass 문법을 작성하다보면 변수를 사용하게 되는 경우가 많다.

변수를 사용하다보면 내가 생각하던 변수 값이 제대로 컴파일 되지 않고

에러가 나거나 이상한 값으로 css가 컴파일 되는 경우가 많이 있을 것이다.

 

그러한 경우엔 보통은 Interpolation 즉, 보간법을 사용하지 않고

변수만을 사용했기 때문에 그런 경우가 많다.

 

1. Interpolation(보간법) 의 특징

- #(샵) 특수문자와 {}(중괄호)를 사용하여 표기한다.  #{..}

- 삽입된 문자나 변수를 문자 그대로 적용시켜 연산이 되지 않게 한다.

- @mixin, @import, 일반적인 Sass 문법 등 변수나 문자를 통해 가변적인 값들을 적용해야하는 경우 사용한다.

 

보간법은 Sass 문법에서 가장 기본이 되는 내용이면서

모른다면 Sass 문법을 지나치게 제한적으로 밖에 사용할 수 없는 중요한 내용이다.

 

주로 사용하는 영역은

변수를 통한 클래스나 css내용 적용,

@each나 @mixin 등 문법을 작성할 때 주로 사용한다.

 

2. Interpolation(보간법) 의 사용

보간법의 사용 영역 중 주로 사용하는 몇가지 예시를 통해

보간법에 대해 알아보려한다.

 

1. 변수를 통한 클래스명 적용

/* 변수 */
$page: main;

/* SCSS 적용 (x) */
.$page_wrap{
  ...
}

$page라는 변수를 선언하고

.main_wrap 클래스를 만들고 싶어 .$page_wrap를 작성하여 문법을 작성해보았을 때

해당 내용은 컴파일 되지 않고 에러가 뜨게된다.

 

그래서 자바스크립트 문법 처럼 따옴표와 + 기호를 사용해서

'.' + $page + 'wrap' 라고 작성을 해도 마찬가지로 제대로 컴파일 되지 않는다.

 

이러한 경우에 보간법을 사용하여 내가 원하는 변수를 원하는 영역에 문자 그대로 넣을 수 있다.

/* 변수 */
$page: main;

/* SCSS 적용 (O) */
.#{$page}_wrap{
  ...
}

 

2. @each 문법에서 사용

/* SCSS */
@each $animal in (horse, tiger, lion){
  .#{$animal}{
    background:url('../images/' + $animal + '.jpg') no-repeat 0 0;
  }
}


/* CSS */
.horse {
  background: url("../images/horse.jpg") no-repeat 0 0;
}

.tiger {
  background: url("../images/tiger.jpg") no-repeat 0 0;
}

.lion {
  background: url("../images/lion.jpg") no-repeat 0 0;
}

위의 예시와 같이 @each문을 사용해서

원하는 클래스에 원하는 이미지를 넣게 될 경우

$animal이라는 가변적인 요소에 .(점)을 찍어 클래스명을 적용해야 하는데

단순히 .$animal{...} 로 적용하게 되면 .과 animal 내용이 연산처리가 되어 컴파일 에러가 뜬다.

 

이처럼 .(점)과 $animal이 단순히 문자열끼리의 조합을 만들고

그 문자로 문법을 적용해야할 경우 .#{$animal} 보간법을 사용한다.

 

3. Interpolation(보간법) 사용시 주의사항

보간법안에 들어간 변수들은 그 변수가 숫자일지라도

문자로 인식을 하기 때문에 숫자를 넣어서 사용하게 될 경우

내가 원하는 값이 맞는지 컴파일 된 내용을 확인해볼 필요가있다.

/* SCSS */
$test1: 12;
$test2: 34;

.box{
  width: $test1 + $test2 + px;
}

.box2{
  width: #{$test1} + #{$test2} + px;
}


/* CSS */
.box{
  width: 46px;
}
.box2{
  width: 1234px;
}

위의 예시를 보면 확인할 수 있다.

.box1과 .box2 둘 다 $test1, $test2 변수를 사용했지만

css로 컴파일된 값은 천지차이가 난다.

 

보간법을 사용하지 않은 경우 $test1의 12와 $test2의 34가 연산이 되어 46이라는 값이 적용되고

보간법을 사용한 경우 $test1의 12와 $test2의 34가 단순 문자열로 인식되어 12와 34의 합성이 일어나 1234가 된다.

 

 

이처럼 보간법을 사용할 때,

내가 연산이 필요한건지 단순 문자열을 구현해야하는지 확인하고 작성할 필요가 있다.

 

 

 


sass-lang.com/documentation/interpolation

 

 

 

반응형
반응형

2020.03.19 - [Frontend/Sass (SCSS)] - [Sass 특징] Nesting (중첩)

 

Sass 문법을 사용하면서 가장 기본적으로 사용하는 속성이 nesting(중첩)이다.

그리고 nesting을 사용하면서 필수로 알아야할 것이 바로 Parent Selector(부모 선택자) 이다.

 

1. 부모 선택자(&)의 사용

- 부모 선택자는 특수문자 '&'을 사용한다.

- 기본적으로 중첩된 Sass 문법 안에서 사용한다.

- :hover, :checked, :not(&) 등의 가상클래스에 사용된다.

- :after, :before 등의 가상요소에 사용된다.

- 언더바(_), 하이픈(-) 등의 클래스명의 접속사에 사용한다.

 

등의 특징이 있다.

 

자세한 사항은 예시로 보면 이해가 쉽다.

 

/* SCSS */
.wrap{
  div{
    &:first-child{border: 1px solid #333;}
  }

  .box1{
    &:hover{
      text-decoration: underline;
      color: #fff000;
    }
    
    // .box1_inner
    &_inner{
      position: relative;
    }
  }
  
  :not(&){display: none;}
}


/* CSS */
.wrap div:first-child{border:1px solid #333;}
.wrap .box1:hover{text-decoration:underline; color:#fff000;}
.wrap .box1_inner{position:relative;}
not(.wrap){display:none;}

위 예시와 같이

.wrap div중 first-child에 특정 css를 적용하기 위해

.wrap div의 중첩 범위에 &을 사용하여 &:first-child를 적용 하였고

 

.wrap .box1:hover를 적용하기 위해 마찬가지로 &을 사용하여 적용하였다.

 

그리고 .box1뒤에 하이픈을 접속사로 사용하여 클래스명을 작성할때도 &을 사용하였다.

(.box1_inner)

 

not에 &를 넣어 &에 해당하는 영역에 css로 컴파일될 때

부모 요소인 .wrap을 넣어주는 방법도 위와같이 사용된다.

 

2. 부모선택자(&) 응용

위에서 설명한 가상선택자 및 하이픈(-), 언더바(_) 등의 클래스 등 기본적인 사용 방법 외에도

부모 선택자를 응용하여 사용할 수 있다. 

/* SCSS */
.wrap{
  .box{
    .outer_wrapper &{
      margin:0 auto; 
      width:1024px;
    }
  }
}


/* CSS */
.outer_wrapper .wrap .box{margin:0 auto; width:1024px;}

위 예시를 보면 분명 .wrap과 .box의 범위 안에

.outer_wrapper를 사용해서 값을 줬지만

막상 컴파일된 값은 .outer_wrapper이 가장 부모요소로 위치하게 된다.

 

그 이유는 바로 앞서 설명했듯 부모선택자(&)의 사용 때문이다.

.outer_wrapper 뒤에 부모선택자(&)를 사용하면 

부모에 있는 요소들이 해당 '&' 문자에 적용된다.

 

그렇기 때문에 .outer_wrapper이 가장 먼저 위치하게 되고

그 뒤에 .wrap과 .box가 차례대로 컴파일된다.

 

3. 부모선택자(&) 사용시 주의사항

위 2번에 설명한 내용을 염두하고 아래와 같은 소스를 작성하면

생각했던 css 내용으로 컴파일이 되지 않을 것이다.

/* SCSS */
.box{
  div&{
    background:skyblue;
  }
}

위와 같이 소스를 작성하면

내가 원하는 css 컴파일 내용은

div.box{background:skyblue;} 일 것이다.

 

하지만 컴파일 자체가 안되고 에러가 뜬다.

이유는 부모선택자(&)의 사용은 요소의 시작 부분에서만 사용할 수 있기 때문이다.

 

예를 들어 span&와 같이 특정 엘리먼트 뒤에 붙여서 사용이 불가능하고

span &처럼 & 앞에 특정 엘리먼트가 바로 붙어서 사용할 수 없다.

 

 

 

반응형
반응형

2020.03.27 - [Frontend/Sass (SCSS)] - [Sass 특징] @mixin 과 @include

 

예전에 포스팅한 @mixin과 @include에 대한 기본적인 내용과 더불어

@mixin과 @include 문법을 작성할 때,

빼놓을 수 없는 문법이 콘텐츠 블록(content block),

즉 @content 문법이다.

 

* @content 사용

@mixin을 통해 반복되는 css 내용들을 미리 등록해놓고 필요할때마다 사용할 때,

변동되는 값 들은 파라미터로 적용해서 필요에 따라 다른 값을 줄 수 있다.

/* SCSS */
@mixin common-box ($wsize:10px, $hsize:10px){
  &:after{
    display: block;
    content: '';
    border: 1px solid #333;
    width: $wsize;
    height: $hsize;
  }
}



.box1{
  @include common-box;
}

.box2{
  @include common-box($wsize:20px, $hsize:20px);
}


/* css로 컴파일 */
.box1:after {
  display:block; 
  content:''; 
  border:1px solid #333;
  width:10px; 
  height:10px;
}

.box2:after {
  display:block; 
  content:''; 
  border:1px solid #333; 
  width:20px; 
  height:20px;
}

위의 예시처럼 $wsize, $hsize의 파라미터 값으로 

.box1, .box2의 :after에 서로 다른 width, height 값을 적용한다.

 

 

하지만 위와 같이 단순 border, width, height 값 뿐만 아니라

.box2:after에만 background 값을 넣고 싶다면..?

/* SCSS */
@mixin common-box ($wsize:10px, $hsize:10px){
  &:after{
    display: block;
    content: '';
    border: 1px solid #333;
    width: $wsize;
    height: $hsize;
  }
}


.box2{
  @include common-box($wsize:20px, $hsize:20px);  // after에 대한 @include
  &:after{
    background: #f0f0f0;  // after에 대한 css 추가
  }
}


/* css로 컴파일 */
.box2:after {
  display:block; 
  content:''; 
  border:1px solid #333; 
  width:20px; 
  height:20px; 
  background:#f0f0f0;
}

위와 같이 .box2:after에 background 값을 따로 입력하는 방법이 있을 수 있겠지만

그렇게 되면 .box2에 @include한 값이 :after 속성인데

또 한번 &:after를 사용하여 css를 추가하게 되어

나중에 소스가 많아졌을 경우 문법을 한눈에 알아보는데 어려움이 있을 수 있다.

 

이럴 때 편하게 특정 요소에만 원하는 css를 추가할 수 있는 방법이

@content 이다.

/* SCSS */
@mixin common-box ($wsize:10px, $hsize:10px){
  display: block;
  content: '';
  border: 1px solid #333;
  width: $wsize;
  height: $hsize;
  
  @content;
}


.box2{
  @include common-box($wsize:20px, $hsize:20px){
    background:#f0f0f0;
  };
}


/* css로 컴파일 */
.box2:after {
  display:block; 
  content:''; 
  border:1px solid #333; 
  width:20px; 
  height:20px; 
  background:#f0f0f0;
}

위와 같이 @mixin 안에 @content; 라는 문법을 작성해놓으면

@include 믹스인명(...){
  *추가할 css 내용 작성
}

위 예시처럼 @include할 때 필요한 css를 바로바로 적용해 넣을 수 있다.

 

 

 

 

반응형
반응형

Sass 문법이 일반 CSS와 가장 큰 특징 중 하나는

중첩(Nesting)되어 사용되는 속성들이 있다.

 

1. @at-root 의 사용

기본적으로 부모 엘리먼트에서부터 중첩이 되어

css 내용을 작성한다.

.wrap{
   .cont{
      text-align:center; font-size:12px;
      p{text-align:left;}
      .lst{
         overflow:hidden;
         li{float:left;}
         
         .layer_test{border:1px solid #333; padding:10px;}
      }
   }
}

 

위와 같이 중첩된 내용들 중에 .layer_test를 기준으로 .wrap, .cont, .lst 와 같은

상위 요소들 안에서 사용은 되지만 불필요하게 상위 요소들을 타고

css를 사용하지 않아도 되는 영역의 경우

.wrap{
   .cont{
      text-align:center; font-size:12px;
      p{text-align:left;}
      .lst{
         overflow:hidden;
         li{float:left;}
      }
   }
}

.layer_test{border:1px solid #333; padding:10px;}

 

위와 같이 전혀 동떨어지게 Sass 문법을 작성해서 표현할 수 있다.

 

하지만 .layer_test영역이 실제 html 소스상에도 .wrap, .cont, .lst 안에 노출이 되는 영역이라면

위와 같이 Sass를 작성하다보면 작성해야할 css 내용이 많아지면

헷갈리는 경우가 생긴다.

 

이럴 때 사용하기 좋은 것이 @at-root 속성이다.

.wrap{
   .cont{
      text-align:center; font-size:12px;
      p{text-align:left;}
      .lst{
         overflow:hidden;
         li{float:left;}
         
         @at-root .layer_test{border:1px solid #333; padding:10px;}
      }
   }
}


/* CSS 출력 */
.wrap .cont {
  text-align: center;
  font-size: 12px;
}
.wrap .cont p {
  text-align: left;
}
.wrap .cont .lst {
  overflow: hidden;
}
.wrap .cont .lst li {
  float: left;
}
.layer_test {
  border: 1px solid #333;
  padding: 10px;
}

 

Sass 문법상에는 상위 요소들 안에 존재하지만

실제로 컴파일 된 css를 확인해보면 부모 요소를 타고 가는 것이 아닌

별도의 css로 작성이 된다.

 

2. @at-root의 응용1

위에서 작성한 문법과 같이

@at-root .layer_test{속성} 과 같은 형식으로 작성하는 방법 외에

 

.layer_test와 같이 별도로 부모 요소들을 타고 가지 않을 요소들을

한번에 처리할 수도 있다.

=> @at-root{} 사용

.wrap{
   .cont{
      text-align:center; font-size:12px;
      p{text-align:left;}
      .lst{
         overflow:hidden;
         li{float:left;}
         
         @at-root{
            .layer_test{border:1px solid #333; padding:10px;}
            .test_list{
               overflow:hidden;
               li{float:right;}
            }
         } 
      }
   }
}


/* CSS 출력 */
.wrap .cont {
  text-align: center;
  font-size: 12px;
}
.wrap .cont p {
  text-align: left;
}
.wrap .cont .lst {
  overflow: hidden;
}
.wrap .cont .lst li {
  float: left;
}
.layer_test {
  border: 1px solid #333;
  padding: 10px;
}
.test_list{
  overflow:hidden;
}
.test_list li{
  float:right;
}

 

3. @at-root의 응용2 (미디어 쿼리)

@at-root 속성은 미디어쿼리 문법에서도 유용하게 작성할 수 있다.

미디어 쿼리 문법안에서 내가 원하는 영역만 미디어쿼리 문법에 적용되지 않도록

처리할 수 있다.

(with:), (without:) 속성 사용

@media print {
  .page {
    text-align:center;
    
    // 1
    @at-root {
      .test1{font-size: 11px;}
    }
    
    // 2
    @at-root (with: all) {
      .test2{font-size: 20px;}
    }
    
    // 3
    @at-root (with: rule) {
      .test3{font-size: 15px;}
    }
    
    // 4
    @at-root (without: media) {
      .test4{color: #111;}
    }
  }
}

/* CSS 출력 */
@media print {
  .page {
    text-align: center;
  }
  
  // 1
  .test1 {
    font-size: 11px;
  }
  
  // 2
  .page .test2 {
    font-size: 20px;
  }
}

// 3
.page .test3 {
  font-size: 15px;
}

// 4
.page .test4 {
  color: #111;
}

위의 소스를 확인해보면

 

1번과 같이 단순히 미디어 쿼리 안에 @at-root 사용을

미디어 쿼리가 적용된 상태에서 부모 요소의 상속만 피해서 css가 컴파일이 되고

 

2번의 경우,

(with: all) 속성을 사용하여 문법을 작성하였는데

이 경우 1번과 마찬가지로 미디어 쿼리 문법 안에 일반 @at-root를 사용한 것과 같이

표현하게 된다.

 

3번과 4번의 경우

원하는 영역을 미디워 쿼리 문법 밖으로 css를 컴파일할 수 있도록 도와준다.

(with : rule)   //   (without : *print)

 

*print는 미디어 쿼리 문법이 screen일 경우엔 screen으로 변경될 수 있다.

 

 

 

반응형
반응형

Sass에서는 자바스크립트에서와 마찬가지로 데이터 타입이 존재한다.

 

레퍼런스에서는 Value(값)으로 소개가 되고 있는데,

 

총 8가지의 데이터 타입이 있다.

 

1. Numbers 숫자

- 단위를 포함하거나 포함하지 않을 수 있다. (12 or 12px)

 

2. Strings 문자열

- 따옴표를 포함하거나 포함하지 않을 수 있다. ("bold" or bold)

 

3. Colors 색상

- 일반적인 red, green 과 같은 색상이나 #f0f0f0 등의 Hex 표현으로도 작성할 수 있다.

 

4. List (자바스크립트의 배열과 유사)

- 쉼표나 공백으로 List 를 구분하여 작성한다. (Helvetica, Arial, sans-serif) or (10px 15px 0 0)

 

5. Map (자바스크립트의 객체와 유사)

- 객체와 유사하게 key값과 value 값을 작성한다. ("background" : red, "border-color" : blue)

 

6. boolean (true or false)

 

7. null

- 자바스크립트의 null과 마찬가지로 아무것도 없는 값을 나타낸다.

 

8. Function 함수

- Sass에서 제공하는 내장함수와 임의로 작성할 수 있는 함수가 있다. (@function)

 

 

반응형

'Frontend > Sass (SCSS)' 카테고리의 다른 글

[Sass 특징] @mixin, content block (@content)  (0) 2021.03.29
[Sass 특징] @at-root  (0) 2020.05.06
[Sass 특징] @mixin 과 @include  (0) 2020.03.27
[Sass 특징] Nesting (중첩)  (0) 2020.03.19
[Sass 특징] 변수  (0) 2020.03.17
반응형

Sass의 유용한 점 중에 하나인 반복되는 내용에 대한

재사용이 용이하다는 것을 가장 잘 증명할 수 있는 것 중 하나가

바로 @mixin 이다.

 

@mixin은 자바스크립트의 함수와 같이 

재사용이 필요한 내용들을 @mixin 문법에 담아놓고

@include를 사용하여 호출한다.

 

1. @mixin 사용

@mixin을 사용하기 위해서는 우선 반복이 되는 내용들을

담아야한다.

@mixin test{
   display:inline-block; border:1px solid #333; color:red; text-align:center;
}

위와 같이 @mixin 뒤에 mixin명 그리고 중괄호를 사용해

그 안에 반복할 css 내용을 넣는다.

(!) @mixin명에 하이푼, 언더스코어 (-, _)를 둘 다 쓸 수 있는데,
    둘 중에 어떤 걸 사용해도 동일한 @mixin명으로 인식한다.

ex) @mixin text-border === @mixin text_border

 

만들어 놓은 @mixin은 비동기 상태로

호출을 하기 위해선 @include를 사용한다.

/* SCSS */
section{
   .box{
      @include test;
   }
}

/* CSS */
section .box {display:inline-block; border:1px solid #333; color:red; text-align:center;}

이처럼 원하는 영역에 @include mixin명 을 사용하여 호출한다.

 

2. @mixin 응용

2-1. @mixin 안에 또 다른 @mixin @include

단순히 @mixin 안에 스타일을 넣고 @include 시키는 것 말고

@mixin 안에 또 다른 @mixin을 @inclue 시킬 수 있다.

(!) @mixin 안에 또 다른 @mixin을 생성하는 것은 안된다.
/* SCSS */
@mixin reset-border{
   border:none;
}

@mixin box{
   width:50px; height:50px; text-align:center;
   @include reset-border;
}

div{
   @include box;
}


/* CSS */
div{width:50px; height:50px; text-align:center; border:none;}

위의 소스처럼 reset-border 라는 @mixin을 box라는 @mixin 안에 @include시킬 수 있다.

 

2-2. 인수 값으로 변경되는 값 조정

@mixin을 만들 때 단순히 @mixin명과 스타일만 넣어서 만드는게 아니라

인수 값을 추가해서 변경되는 값들을

@include할 때마다 바꿔서 호출할 수 있다.

/* SCSS */
@mixin reset-border($border-color, $f-size){
   border:1px solid $border-color; font-size:$f-size;
}

@mixin box{
   width:50px; height:50px; text-align:center;
   @include reset-border(#333, 11px);  /* 혹은 $border-color:#333, $f-size:11px */
}

div{
   @include box;
}


/* CSS */
div{width:50px; height:50px; text-align:center; border:1px solid #333; font-size:11px}

그리고 인수 값에 기본 값 혹은 null 값을 넣을 수 있다.

 

기본적으로 인수 값은 필수로 입력해야하는 사항이지만

null 값을 넣게되면 넣어도 그만 안 넣어도 그만인 값이 된다.

/* SCSS */
@mixin reset-border($border-color:#666, $f-size:null){
   border:1px solid $border-color; font-size:$f-size;
}
div{
   @include reset-border;
}
p{
   @include reset-border($border-color:red, $f-size:14px);
}


/* CSS */
div{border:1px solid #333;}
p{border:1px solid red; font-size:14px;}

위의 소스상에 div의 경우 $f-size를 @include 하면서 따로 지정하지 않아 null 값이 되어

font-size는 따로 출력이 되지 않았다.

 

반면에 p태그의 경우 $f-size를 @include하면서 14px로 지정하여

$border-color의 경우에도 기본 값 #666에서 red로 변경을 하여

그에 맞게 출력 되었다.

 

 

반응형

'Frontend > Sass (SCSS)' 카테고리의 다른 글

[Sass 특징] @at-root  (0) 2020.05.06
[Sass 특징] Sass 데이터 타입(값) 소개  (0) 2020.04.02
[Sass 특징] Nesting (중첩)  (0) 2020.03.19
[Sass 특징] 변수  (0) 2020.03.17
Sass란?  (0) 2020.03.04
반응형

Sass가 css와 다른 중요한 특징 중에 하나는

바로 Nesting이다.

즉, css를 중첩해서 사용할 수 있다는 것이다.

 

개인적으로 이 속성이 Sass의 가장 큰 매력이라고 생각한다.

 

css와 Sass의 소스를 비교해보면 어떻게 다른지,

어떤 점이 그렇게 매력적인지 알 수 있다.

/* css */
.main .content{text-align:center;}
.main .content p{text-align:left;}
.main .content span{display:inline-block;}
.main .content .txt p{color:red;}

/* Sass (SCSS) */
.main{
   .content{
      text-align:center;
      p{text-align:left;}
      span{display:inline-block;}
      .txt p{color:red;}
   }
}

위의 소스를 보면 .main 이라는 클래스 하위에 있는 영역들에 대한 수정을 하는 내용임을 알 수 있다.

 

.main 아래 .content 아래 p나 span등을 수정하기 위해서는

.main이라는 클래스를 상속해야하기 때문에 매번 .main을 반복해서 작성을 해야한다.

 

하지만 Sass 문법을 적용하게 되면

.main 이나 .content와 같이 반복되는 클래스 들을 한 번만 작성하여

편리함을 누릴 수 있다.

 

위의 소스만 봤을 때 css가 더 사용하게 편해보일 수도 있지만

방대한 양의 소스를 작성하다보면 Sass의 편리함에 감탄하게된다.

 

반응형

'Frontend > Sass (SCSS)' 카테고리의 다른 글

[Sass 특징] @at-root  (0) 2020.05.06
[Sass 특징] Sass 데이터 타입(값) 소개  (0) 2020.04.02
[Sass 특징] @mixin 과 @include  (0) 2020.03.27
[Sass 특징] 변수  (0) 2020.03.17
Sass란?  (0) 2020.03.04
반응형

변수는 모든 프로그래밍 언어에서 정의되는 내용으로

반복되는 내용을 복사/붙여넣기로 사용하는 것이 아닌

 

임의의 값을 만들어 반복되는 내용을 담아 놓고 재사용 할 수 있게 해준다.

 

1. Sass에서의 변수

Sass 문법에서도 변수라는 개념이 존재한다.

변수 선언은 '$' 특수문자로 선언한다. (ex. $test : 0;)

 

Sass를 사용하면서 변수가 필요한 상황을 예를 들자면

 

특정 페이지에서 주로 사용되는 포인트 컬러값이 빨간색이라고 했을 때,

border-color, background-color, color의 값을 특정 영역별로

 

border-color : red;

background-color : red;

color : red

를 반복적으로 사용해야 할 것이다.

 

또한 이렇게 반복적으로 사용한 값이

디자인 개선 작업과 같이 포인트 컬러값을 변경하는 일이 생겼을 경우

 

각 영역을 일일이 찾아서 바꿔줘야 할 것이다.

 

이러한 번거로움을 개선하기 위해 Sass에서도 변수를 지원한다.

/* CSS */
.main{border:1px solid red; background-color:red;}
.main p{color:red;}
.main .box{background:red; color:red;}

/* SCSS */
$color : red;
.main{
   border:1px solid $color; background-color:$color;
   p{color:$color;}
   .box{background:$color; color:$color;}
}

위의 소스 같이 css로 변수선언 없이 작업을 하다보면

각 영역별 color값 red를 변경해야 하는 경우 일일이 찾아서

바꿔줘야하지만

 

아래 Sass(SCSS) 소스의 경우 $color의 값만 변경해주면

다른 영역들의 color 값을 손쉽게 동시에 변경할 수 있다.

 

2. 변수의 범위

Sass에서 변수의 범위는 크게 전역변수/지역변수로 나눌 수 있다.

 

전역변수는 말 그대로 Sass문법이 적힌 전체 영역에 해당하는 변수를 선언하는 것이고

지역변수는 특정 블럭 영역 안에 변수의 범위를 한정하여 선언하는 것이다.

 

/* 전역변수 선언 */
$color : red;

.test1{
   /* 지역변수 선언 */
   $size : 12px;
   
   color : $color;
   font-size : $size;
}

.test2{
   border-color : $color;
   
   /* 에러 출력 (선언된 $size 변수가 없음.) */
   font-size : $size;
}

위의 소스처럼 .test1의 영역 안에 $size라는 변수를 선언해서 사용을 하였는데

이 변수를 .test2에서는 가져와서 사용할 수 없다.

 

그렇기 때문에 위의 소스를 출력했을 때 에러가 출력된다.

 

3. 변수의 정의 (!default, !global)

Sass에서 변수를 정의할 때 !default, !global 플래그와 함께 작성할 수 있다.

 

!default의 경우,

기존에 정의된 변수의 값이 있을 경우 기존 변수의 값을 유지하고

새로 값을 따로 적용시키지 않는다.

/* 변수 선언 */
$color : red;
$color : blue !default;

.test1{
   /* color : red 출력 */
   color : $color;
}

위의 경우와 같이 $color 변수가 이미 red 값으로 선언이 되어있었기 때문에

$color: blue에 !default 선언한 경우 선언한 변수의 값이 무시되어 color:red 값이 결국 출력이 되었다.

 

반면에

기존 변수에 'null' 값이 들어가 있었을 경우

!default 를 사용하면 해당 변수값이 적용된다.

/* 변수 선언 */
$color : null;
$color : blue !default;

.test1{
   /* color : blue 출력 */
   color : $color;
}

 

 

!global의 경우,

2번 변수의 범위에서 말했듯 변수에는 지역변수/전역변수의 개념이 존재하는데

지역변수 영역에 선언한 변수를 전역변수로 사용할 수 있도록 만든다.

/* 전역변수 선언 */
$color : red;

.test1{
   /* 지역변수 선언 & !global 사용으로 전역변수화 */
   $size : 12px !global;
   
   color : $color;  // color: red;
   font-size : $size;  // font-size: 12px;
}

.test2{
   border-color : $color;  // color: red;
   font-size : $size;  // font-size: 12px;
}

 

 

 

반응형

'Frontend > Sass (SCSS)' 카테고리의 다른 글

[Sass 특징] @at-root  (0) 2020.05.06
[Sass 특징] Sass 데이터 타입(값) 소개  (0) 2020.04.02
[Sass 특징] @mixin 과 @include  (0) 2020.03.27
[Sass 특징] Nesting (중첩)  (0) 2020.03.19
Sass란?  (0) 2020.03.04
반응형

 

Sass는 CSS 전처리기로써

CSS의 한계나 단점을 보완하기 위해 만들어진 CSS 확장 언어이다.

 

짧은 내용의 CSS일 경우엔 크게 문제가 없지만

방대한 양의 CSS를 다루게 되면 내용을 알아보는 것이 힘들어지고

가독성이 많이 떨어지기 때문에 Sass는 추가적인 기능을 통해 이러한 단점을 보완한다.

 

Sass의 기능 및 도구

1. 변수

2. 조건문, 반복문

3. Mixin

4. 연산자

5. Extend

6. Nesting

7. Import

 

※ 각 기능별 상세 내용은 추가로 포스팅 할 예정이다.

 

 

1. Sass의 설치

Sass는 두 가지 버전이 존재한다. LibSass와 Ruby Sass가 그 종류이다.

 

두 버전은 2014년도에 각 버전의 동기화에 합의했기 때문에 대부분의 호환성을 보장한다.

두 버전의 호환성 문제는 

http://sass-compatibility.github.io/ 페이지에서 확인이 가능하다.

 

호환성이 보장되기 때문에 두 버전중 본인의 개발환경에 맞춰서 알맞은 버전을 선택하면 된다.

Ruby 환경에서 개발을 한다면 Ruby Sass를, Node.js 환경에서 개발을 진행한다면

LibSass로 선택해서 사용하면 된다.

 

특별히 고려할 환경이 없다면 가장 보편적으로 사용하는 Ruby 버전으로 설치하면 되겠다.

 

2. Sass와 SCSS의 차이

Sass는 크게 두 가지 형태의 구문을 지원한다.

하나는 Sass, 또 하나는 SCSS이다.

 

Sass의 경우 중괄호와 세미콜론을 대신해 들여쓰기를 사용해 구문을 분리하고 작성한다.

 

그리고 SCSS의 경우 CSS와 굉장히 유사하게

중괄호와 세미콜론을 사용하는 문법이다.

 

각 문법별 작성 방법은 아래에서 살펴보도록 하겠다.

 

Sass의 확장자 : .sass

SCSS의 확장자 : .scss

/* Sass */
.main
   .side
      display:block
      text-align:center
      p
        color:#333
      a
        display:inline-block
        font-weight:bold


/* SCSS */
.main{
   .side{
      display:block; text-align:center;
      p{color:#333}
      a{display:inline-block; font-weight:bold;}
   }
}

위 처럼 각 문법의 사용이 다르다.

 

두 문법 중 주로 포스팅에 사용할 문법은 SCSS 문법이다.

그 이유는 SCSS 문법이 CSS와 더 높은 호환성을 보이고 가독성도 좋기 때문이다.

 

추가적으로 Sass 공식 레퍼런스에서도 SCSS문법을 기준(Sass 3.0 부터)으로 설명하고 있기 때문에

SCSS 문법을 위주로 사용할 예정이다.

 

3. CSS vs Sass 문법(SCSS)의 차이

/* CSS */
.main .side{display:block; text-align:center;}
.main .side p{color:#333;}
.main .side a{display:inline-block; font-weight:bold;}


/* SCSS */
.main{
   .side{
      display:block; text-align:center;
      p{color:#333}
      a{display:inline-block; font-weight:bold;}
   }
}

위의 예시를 통해 CSS, Sass 문법의 작성법과 차이점을 확인해보도록 하겠다.

 

앞서 얘기한 것과 같이 CSS는 .main이라는 클래스의 하위에 있는 .side, p, a에 스타일을 주기위해서

.main 클래스를 매번 작성을 해줘야한다.

 

이 방법은 번거로울뿐만 아니라 많은 뎁스를 타고 들어가게 되면 가독성이 상당히 떨어지게 된다.

/* CSS */ 
.main .side .dtl_inf .bt_area .dsc{font-size:11px;}
.main .side .dtl_inf .bt_area a{float:right;}
.main .side .dtl_inf .bt_area a strong{font-size:15px;}
.main .side .dtl_inf .bt_area a span{display:block;}

/* SCSS */
.main{
   .side{
      .dtl_inf{
         .bt_area{
            a{
              float:right;
              strong{font-size:15px;}
              span{display:block;}
            }
            .dsc{font-size:11px;}
         }
      }
   }
}

Sass문법의 경우 .main 클래스나 .side 클래스와 같이 공통의 부모 클래스의 경우

한 번만 작성을 해주면 하위에 있는 요소들은 그 안에서 제어가 가능하다.

 

이처럼 어떤 요소가 어느 부모 요소 안에 있는지를 단번에 확인이 가능하다.

 

 


참고

https://sass-lang.com/documentation 

https://poiemaweb.com/sass-basics

 

반응형

'Frontend > Sass (SCSS)' 카테고리의 다른 글

[Sass 특징] @at-root  (0) 2020.05.06
[Sass 특징] Sass 데이터 타입(값) 소개  (0) 2020.04.02
[Sass 특징] @mixin 과 @include  (0) 2020.03.27
[Sass 특징] Nesting (중첩)  (0) 2020.03.19
[Sass 특징] 변수  (0) 2020.03.17

+ Recent posts