-
Sass[SCSS] 활용 - SCSS 반응형 미디어 쿼리(@media) 응용하기 ($다중 변수, @mixin, @content 등을 이용)
2023. 2. 12.
Sass[SCSS] 응용 - SCSS 반응형 미디어 쿼리(@media) 응용하기 ($변수, @mixin, @content 등을 이용) 를 해보도록 할게요. :)
보통 Sass 부트스트랩이나 다른곳에서 반응형 미디어쿼리를 활용할때 사용하는 방식이 있습니다.
scss 에서도 비슷하게 많이들 사용하는데 보통 프로젝트마다 반응형 미디어쿼리의 기준 화면 너비들을 미리 설정하고 작업하는 경우가 많습니다.
그렇지 않으면 나중에 다 완성된 코드를 보면 반응형 사이즈가 통일성 없이 막 다르게 적용되어 있는 경우가 많아서 scss를 통해서 미리 설정하고 해두면 편합니다.
아래 코드를 살펴볼게요.
/* mixins.scss */ // (min-width) 변수 설정 $breakpoints-up: ( xs: '540px', sm: '768px', md: '992px', lg: '1200px', xl: '1400px' ); // (max-width) 변수 설정 $breakpoints-down: ( xs: '539.98px', sm: '767.98px', md: '991.98px', lg: '1199.98px', xl: '1399.98px' ); // (min-width) mixin 설정 @mixin media-up($size) { @media (min-width: map-get($breakpoints-up, $size)) { @content; } } // (max-width) mixin 설정 @mixin media-down($size) { @media (max-width: map-get($breakpoints-down, $size)) { @content; } } // (max-width) and (min-width) mixin 설정 @mixin media-between($max-size, $min-size) { @media (max-width: map-get($breakpoints-down, $max-size)) and (min-width: map-get($breakpoints-up, $min-size)) { @content; } }
우선 다중 변수로 min-width와 max-width에 각각 들어갈 사이즈들을 정해둡니다.
저는 예시로 자주 사용하는 사이즈들을 넣어두었습니다. (보통 프로젝트마다 다른 경우가 있어 해당 프로젝트에 맞게 설정해둡니다.)
그리고 (min-width), (max-width) 또 (max-width) and (min-width) 이렇게 세개의 @mixin을 설정합니다.
제가 이전에 업로드했던 @mixin 과 다중 변수 등의 게시글을 보시면 아시겠지만 코드를 쭉 보면 크게 어렵지 않습니다.
각 @mixin 에 매개변수인 $size 들을 내부에서 미디어 쿼리 너비값으로 map-get을 이용해 할당되도록 설정해 줬습니다.
마지막은 미디어 쿼리 내부에서 @content를 사용해 실제 scss에서 저 위치로 css를 바로 적용할 수 있도록 해줍니다.
이러면 나중에 반응형 기준값들이 바뀌게 되어도 다중 변수 내부의 값들만 바꿔주면 전부 일괄변경이 됩니다.
다음으로는 저 mixins.scss 를 직접 사용한 예시를 보도록 하겠습니다.
@import 'mixins'; .item-box { max-width: 1400px; margin: 0 auto; // 이렇게 안에서 사용이 가능합니다. @include media-up(xl) { background-color: khaki; } .item-list { display: flex; align-content: center; flex-wrap: wrap; height: 100vh; margin: 0; padding: 0; list-style: none; .item { width: calc(10% - 20px); margin: 10px; height: 100px; background-color: royalblue; @include media-between(xl, xs) { background-color: crimson; }; @include media-down(xl) { width: calc(12.5% - 20px); } @include media-down(lg) { width: calc(20% - 20px); } @include media-down(md) { width: calc(25% - 20px); } @include media-down(sm) { width: calc(33.3333% - 20px); } @include media-down(xs) { width: calc(50% - 20px); } } } } // 그냥 평소처럼 밖에서 사용해도 됩니다. @include media-up(xl) { body { background-color: lemonchiffon; } }
mixins.scss 를 임포트해서 가져와주고 기본적인 코드들을 작성해줬습니다.
저런식으로 @include로 각각 믹스인들을 가져와서 적용해주고 컴파일 해보겠습니다.
.item-box { max-width: 1400px; margin: 0 auto; } @media (min-width: 1400px) { .item-box { background-color: khaki; } } .item-box .item-list { display: flex; align-content: center; flex-wrap: wrap; height: 100vh; margin: 0; padding: 0; list-style: none; } .item-box .item-list .item { width: calc(10% - 20px); margin: 10px; height: 100px; background-color: royalblue; } @media (max-width: 1399.98px) and (min-width: 540px) { .item-box .item-list .item { background-color: crimson; } } @media (max-width: 1399.98px) { .item-box .item-list .item { width: calc(12.5% - 20px); } } @media (max-width: 1199.98px) { .item-box .item-list .item { width: calc(20% - 20px); } } @media (max-width: 991.98px) { .item-box .item-list .item { width: calc(25% - 20px); } } @media (max-width: 767.98px) { .item-box .item-list .item { width: calc(33.3333% - 20px); } } @media (max-width: 539.98px) { .item-box .item-list .item { width: calc(50% - 20px); } } @media (min-width: 1400px) { body { background-color: lemonchiffon; } }
반응형 css들이 설정해둔대로 잘 적용된 결과를 확인할 수 있습니다.
마지막으로 위의 코드들을 적용한 HTML 화면을 확인할 수 있는 코드펜 링크를 첨부하도록 하겠습니다.
화면을 줄여가며 확인해보시면 이해가 편하실거에요. :)
https://codepen.io/kimyangsun/pen/gOjVVXP
'코딩 기록 > Sass [SCSS]' 카테고리의 다른 글
Sass[SCSS] 기초 이론 8 - @if @else 조건문 / @for, @each 반복문 (0) 2023.02.14 Sass[SCSS] 기초 이론 7 - @function 함수, @return 반환 (0) 2023.02.14 Sass[SCSS] 기초 이론 6 - 다중 변수 선언, 내장 함수(map-get) (0) 2023.02.12 Sass[SCSS] 기초 이론 5 - 그룹 선언하기, 사용하기, 선택자 속성 사용 (@mixin, @include, @extend) (0) 2023.02.12 Sass[SCSS] 기초 이론 4 - scss에서 연산자 사용하기 (Operations & calc) (0) 2023.02.05 댓글