[SCSS(SASS)] 반응형 breakpoints 추가하는 방법

하수도키

·

2020. 7. 30. 09:34

728x90
반응형
SMALL

개요

이번에는 반응형 웹사이트 작업 시 꼭 필요한 mediaquery를 공부해봅시다!

scss 사용해서 살펴보겠습니다 : )

 

코드

우선 완성된 코드를 보여주고 설명해드릴게요 : )

$breakpoints: (
    'mobile-extra-small': (min-width:  21.25rem),        // 340
    'mobile-portrait-only': (max-width:  29.9375rem),    // 479
    'mobile-landscape': (max-width:  51rem),             // 816
    'tablet-portrait': (min-width: 48rem),               // 768
    'desktop-template': (min-width: 48.0625rem),         // 769
    'tablet-portrait-only': (max-width: 48rem),          // 768
    'tablet-big': (min-width: 60.625rem),                // 970
    'desktop': (min-width: 64rem),                       // 1024
    'desktop-medium': (min-width: 75rem),                // 1200
    'desktop-large': (min-width: 90rem),                 // 1440
    'desktop-extra-large': (min-width: 120rem)           // 1920
);

@mixin respond-to($name) {
    @if map-has-key($breakpoints,
    $name) {
        @media only all and #{inspect(map-get($breakpoints, $name))} {
            @content;
        }
    }
    @else {
        @warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. Please make sure it is defined in `$breakpoints` map.";
    }
}

 

위에서 알아볼 키워드로는

- $

- mixin

- media

- min-width

- max-width

- rem

- em

 

이 정도인데 빠르게 훑어볼게요. 소중한 시간 많이 안 뺏겠습니다. : )

 

$

$는 변수 선언하는 역할을 한다. $breakpointsSCSS 데이터 타입인 Maps를 사용해 변수에 할당했다. 

map-get($breakpoints, $name) 이런 식으로 첫 번째 인수의 변수를 넣고 두 번째 인수의 키값을 넣으면 해당 값이 반환한다.

 

mixin

minx은 재활용할 CSS를 선언해주는 역할을 한다.

아래 코드처럼 사용할 수 있다.

@include respond-to('tablet-portrait-only') {
  ...code css
}

// 실제 컴파일 된 코드
@media only all and (max-width: 48rem) {
  ...code css
}

 

media

media query는 단말기, 어떤 특성이나 수치 등에 따라 스타일을 수정할 때 사용한다.

@media only all and (조건문) {실행문}

@media는 미디어쿼리에 시작을 나타낸다.

only는 뒤에 디바이스(여기서는 all)를 지정할 텐데 여기에 지정한 것들만 해석하라는 명령이다. 

all은 미디어 종류을 지정한다.(대표적으로 all, screen, print)를 가장 많이 사용한다.

and는 논리연산자로 only all과 (조건문) 이 모두 충족할 때 {실행문}을 실행시킨다.

(조건문)에는 미디어 특성을 지정한다.(대표젹으로 min-width, max-width)를 사용한다.

 

max-width, min-width

max-width : 해당 너비 이하일때 적용(최대 너비로 제한을 둔다고 생각하면 될 듯)

min-width : 해당 너비 이상일 때 적용(최소 너비로 제한을 둔다고 생각하면 된다)

 

@media only all and (max-width: 10px) { // width값이 10px 이하일때 아래 css 적용
  ...code css
}

@media only all and (min-width: 10px) {// width값이 10px 이상일때 아래 css 적용
  ...code css
}

 

rem, em

em이 먼저 나오고 그다음 rem이 나왔다.

em은 해당 태그 font-size 기준으로 1em이라고 한다.

remhtml 태그 font-size 기준으로 1 rem이라고 한다.

 

em 관련 질문이다. 아래 span 태그의 font-size는 몇 px 일까?

html {
  font-size: 12px;
}
h2 {
  font-size: 32px;
}
span {
  font-size: 1em;
}

<h2><span>span 1em은?</span></h2>

카운트 셉니다. 5, 4, 3, 2, 1, 0 땡

정답은 32px입니다. span 태그 font-size에 바로 1em을 설정했기 때문에 부모인 h2font-size를 상속받는다!!!

 

자 다음은 재탕입니다.

rem 관련 질문이다. 아래 span 태그의 font-size는 몇 px 일까?

html {
  font-size: 12px;
}
h2 {
  font-size: 32px;
}
span {
  font-size: 1rem;
}

<h2><span>span 1rem은?</span></h2>

카운트 셉니다. 5, 4, 3, 2, 1, 0 땡

정답은12px입니다.span 태그 font-size에 바로 1rem 설정했기 때문에 html 태그 속성인 font-size: 12px;에서 12px1 rem으로 사용한다.

 

이제 마무리로 정리를 해보자.

우린 간략하게 필요한 키워드를 살펴봤으니 맨 처음 코드를 다시 살펴보자.

$breakpoints: (
    'mobile-extra-small': (min-width:  21.25rem),        // 340
    'mobile-portrait-only': (max-width:  29.9375rem),    // 479
    'mobile-landscape': (max-width:  51rem),             // 816
    'tablet-portrait': (min-width: 48rem),               // 768
    'desktop-template': (min-width: 48.0625rem),         // 769
    'tablet-portrait-only': (max-width: 48rem),          // 768
    'tablet-big': (min-width: 60.625rem),                // 970
    'desktop': (min-width: 64rem),                       // 1024
    'desktop-medium': (min-width: 75rem),                // 1200
    'desktop-large': (min-width: 90rem),                 // 1440
    'desktop-extra-large': (min-width: 120rem)           // 1920
);

@mixin respond-to($name) {
    @if map-has-key($breakpoints,
    $name) {
        @media only all and #{inspect(map-get($breakpoints, $name))} {
            @content;
        }
    }
    @else {
        @warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. Please make sure it is defined in `$breakpoints` map.";
    }
}

mixin을 사용하여 언제 어디서나 재사용할 수 있고, if를 사용하여 breakpoints에 해당 name이 있는지 없는지 확인한다.

만약 있으면 @media~ 부분을 실행하고 없으면 @warn으로 경고 메시지를 보여준다.

@media~ 부분을 보면 #{} 이게 보이는데 이걸 사용하면 코드 어디에서만 변숫값을 넣을 수 있다.

inspect 함수를 사용하면 '(따옴표)가 없는 값을 반환받을 수 있다.

map-get$breakpoints map에서 원하는 key를 매개변수로 입력하고 값을 반환받는다.

@content는 mixin을 사용할 때 안에 넣은 css 코드들이 그대로 적용된다.

 

아래 예제를 통해 결과를 확인해보자.

// 컴파일 전
@include respond-to('tablet-portrait-only') {
  font-weight: 900;
  font-size: 28px;
}

// 컴파일 후
@media only all and (max-width: 48rem) {
  font-weight: 900;
  font-size: 28px;
}

 

결론

예전에 하드 코딩으로 일일이 하나씩 작업을 했지만, 이걸 알고 나서는 업무 효율이 매우 매우 좋아졌다.

더 좋은 방법이 있으면 언제들 알려주세요!

728x90
반응형
LIST