Media Query 실전편과 이어집니다.
미디어 쿼리 실전편에 이어, 미디어 쿼리와 관련되어 있는 내용에 대한 설명을 작성하였습니다.
목차
1. SCSS를 활용한 Media Query
앞선 두 관련 글에서 CSS를 사용하여 미디어 쿼리를 작성 및 활용하는 방법에 대해 알아보았습니다. 단, CSS에서 미디어 쿼리를 사용하면 작성 코드가 길어질 뿐만 아니라 코드 유지 및 관리가 어렵지만, SCSS를 사용하면 이를 보완할 수 있습니다. 이번에는 SCSS를 사용하여 미디어 쿼리 코드를 작성 및 적용하는 방법을 알아보겠습니다.
※ 기본적인 SASS 문법 및 SCSS 적용 방법은 생략하겠습니다. (또한 전체 scss파일에 대한 import가 있다고 가정하겠습니다.)
SCSS를 사용한 너비 분기
반응형 웹을 제작할 때 화면 너비를 사용하여 분기점을 나눕니다.
※ 예시 분기 너비
모바일 | 태블릿 | 데스크톱 | PC Wide |
---|---|---|---|
375px | 768px | 1024px | 1300px |
이외에도 적용할 다른 값들을 변수로 선언하여 분기점을 미리 작성합니다.
// breakpoint.scss
// scss에서 변수로 해당 너비를 지정
$breakpoint-mobile: 375px;
$breakpoint-tablet: 768px;
$breakpoint-desktop: 1024px;
// custom 너비
$breakpoint-mobile-small: 320px;
$breakpoint-pcwide: 1300px;
변수를 지정한 후 이번에는 미디어 쿼리를 작성합니다. 미디어 쿼리 적용방식은 모바일 퍼스트를 사용하여 너비 분기를 점차 넓혀가는 방식을 사용하겠습니다.
첫 번째 방법은 변수 지정을 제외한다면 CSS와 비슷하게 작성할 수 있습니다.
// breakpoint.scss
// 모바일 퍼스트 적용, 모바일 스타일은 mixin을 사용하지 않음
// tablet
@mixin tablet {
@media (min-width: #{$breakpoint-tablet}) {
@content;
}
}
// desktop
@mixin desktop {
@media (min-width: #{$breakpoint-desktop}) {
@content;
}
}
위와 같이 breakpoint.scss
를 작성하여 @import
되었다면 적용방식은 아래와 같습니다.
// test.scss
// mobile
.box {
width: 100px;
height: 100px;
}
// tablet
@include tablet {
.box {
width: 200px;
height: 200px;
}
}
// desktop
@include desktop {
.box {
width: 300px;
height: 300px;
}
}
혹은 하나의 클래스 안에서만 분기를 다루고 싶다면 아래와 같이 작성할 수 있습니다.
// test.scss
// mobile
.box {
width: 100px;
height: 100px;
// tablet
@include tablet {
width: 200px;
height: 200px;
}
// desktop
@include desktop {
width: 300px;
height: 300px;
}
}
아래는 이를 활용한 예시입니다. 뷰포트를 조정해보면 크기에 맞게 변하는 것을 확인할 수 있습니다.
See the Pen media query basic by WITBLOG (@witblog) on CodePen.
주의사항으로 설정한 분기점이 아닌 다른 화면 너빗값에서 박스의 스타일이 변하는 것을 확인할 수 있습니다.
이와 같은 현상은 촬영된 영상이 zoom 90%이기 때문에 발생한 이슈입니다. 다행히 디바이스모드에서만 발생하는 현상입니다.
개발자모드-> 디바이스모드-> zoom:{100%이외의 값} 을 설정했을 때 위와 같은 이슈가 발생하기 때문에 확인할 때 주의하시면 될 것 같습니다. 관련 출처
SCSS문법인 조건문이나 반복문, map
등을 활용하여 코드의 유연성과 재사용성을 조금 더 높이고 싶다면, 아래와 같이 사용할 수 있습니다.
// breakpoint.scss
// 분기 포인트 선언
$breakpoints: (
mobile: 0,
tablet: 768px,
desktop: 1024px,
desktop_wide: 1300px,
);
// 믹스인 작성
@mixin mediaquery($breakpoint: mobile, $map: $breakpoints) {
@if type-of($map) == map {
@if map-has-key($map, $breakpoint) {
@media (min-width: #{map-get($map, $breakpoint)}) {
@content;
}
}
}
}
사용 예시입니다.
// test.scss
// mobile
.box {
width: 100px;
height: 100px;
// tablet
@include mediaquery(tablet) {
width: 200px;
height: 200px;
}
// desktop
@include mediaquery(desktop) {
width: 300px;
height: 300px;
}
}
See the Pen media query scss little advanced by WITBLOG (@witblog) on CodePen.
SCSS문법 활용에 따라 개발환경과 사용자, 서비스에 맞게 자유롭게 커스텀이 가능합니다.
2. Media Query 관련 페이지 성능 관리
미디어 쿼리를 통해 페이지의 성능을 향상할 두 가지 방법을 살펴보겠습니다.
1. 성능 팁 : 전략 – 모바일 퍼스트 vs 데스크톱 퍼스트
이미지 출처 : https://www.smartz.com/
1) 모바일 퍼스트(min-width 사용)
모바일 퍼스트 전략은 모바일 사용자의 요구를 최우선으로 생각, 스마트폰 등 가장 작은 사이즈에서의 레이아웃을 기본으로 점차 확장되어가는 형태의 CSS를 작성합니다. 해당 방식으로 CSS를 작성할 경우, 모바일환경일 때 스타일 파일이 로드되는 속도가 빠릅니다. 모바일에서 최고의 사용자 경험을 얻을 수 있습니다.
해당 전략을 고려해야 하는 대상은 아래와 같습니다.
- 사용자의 연령이 적을 경우
- B2C 사이트
2) 데스크톱 퍼스트(max-width 사용)
데스크톱 컴퓨터를 기반으로 디자인을 시작합니다. 그리고 반응형 디자인을 통해 점차 모바일 크기에 맞게 스타일이 조정됩니다. 해당 전략 사용 시 데스크톱에서 최고의 사용자 경험을 얻을 수 있습니다. 해당 방식으로 CSS를 작성할 경우, 데스크톱 환경일 때 스타일 파일이 로드되는 속도가 빠릅니다.
해당 전략을 고려해야 하는 대상은 아래와 같습니다.
- 오래된 산업에 종사
- 사용자의 연령이 많을 경우
- B2B 사이트
- 복잡한 데이터를 다루는 경우
3) 차이점
구분 | 모바일 퍼스트 | 데스크톱 퍼스트 |
---|---|---|
대상그룹 | 모바일 방문자 B2B | 데스크톱 방문자 B2C |
해상도 전환 | 저해상도에서 고해상도 “점진적 향상”을 따름 | 고해상도에서 저해상도 “단계적 저하”를 따름 |
최고의 UX | 모바일 | 데스크톱 |
하드웨어 액세스 | 플래시, 카메라, 마이크 등에 쉽게 액세스 | 장치의 다른 하드웨어에 접근 힘듬 |
텍스트 | 적고, 크게 | 많고, 작게 |
다운로드 | 빠르게 | 느리게 |
위의 기준 및 고객, 상품 유형 등을 고려하여 적절한 전략을 사용하는 것이 중요합니다.
번외) 모바일 퍼스트가 선호되는 이유
많은 사이트에서 모바일 퍼스트가 선호되는 이유에 대해 간단하게 알아보겠습니다.
🔸 2016년 모바일 인터넷 사용량이 데스크톱 사용량을 넘어섰습니다.
Statista에 따르면 2022년 기준 인터넷 사용자는 50억명이고, 이 중 93% 이상이 소셜 미디어 사용자로 인터넷에 접근합니다. 따라서 스타일리시하고 콘텐츠 중심의 모바일사이트를 갖는 것이 비즈니스 필수 요소로 적용되고 있습니다. 참조 : 브라우저 사용자 통계
🔸 사람들이 모바일을 통해 점점 더 많은 시간을 인터넷에 사용합니다.
🔸 SEO 최적화가 되어있습니다.
구글의 순위 지정 알고리즘이 모바일 사이트가 유리한 것으로 나타나고 있습니다. 2019년 7월 구글은 인덱싱 및 순위 지정을 모바일 우선으로 한다고 발표하였고 2022년 7월에 모든 웹사이트에 대한 모바일 우선 인덱싱으로의 대대적인 전환이 완료되었다고 하였습니다. 따라서 웹사이트 디자인 및 콘텐츠가 모바일 우선으로 디자인되어있을 경우 구글 노출에도 많이 유리합니다. 참조 : 구글 모바일 알고리즘 설명
2. 성능 팁: 더 빠른 페이지 로드 시간을 위해 미디어 속성 사용
1) CSS렌더링 차단
서버에서 웹페이지를 요청할 때 두 가지 유형의 리소스, 렌더링 차단 리소스과 비 렌더링 차단 리소스가 존재합니다. 렌더링 차단 리소스는 웹 페이지 렌더링에 필수적이므로 웹 브라우저는 렌더링 차단 리소스가 구문 분석되기 전까지 다른 리소스 처리를 중지합니다.
<link>
링크를 HTML 본문에 통째로 넣는 경우, CSS다운로드에 시간이 소요되고, 다운로드가 끝날때까지 절대 렌더링이 발생하지 않습니다.
렌더링 차단 리소스가 많을 경우 브라우저에서 페이지를 렌더링 하는데 시간이 많이 소요됩니다. 따라서 큰 CSS파일을 처리할수록 더 큰 시간이 소요됩니다.
기본적으로 HTML과 CSS는 렌더링 차단 리소스로 처리됩니다. HTML은 구성되는 DOM에 필수적이고, CSS는 CSSOM에 필수적인 요소입니다.
2) 렌더링 차단을 방지하기 위해 media속성 사용
CSS파일을 호출하는 <link>
태그에 media
속성을 추가하면 CSS가 렌더링 차단 리소스에서 비 렌더링 차단 리소스로 전환하여 중요한 렌더링 경로를 단축할 수 있는 효과를 가지고 있습니다. media속성은 CSS미디어 쿼리에 해당하는 HTML로 생각할 수 있고, CSS 미디어 쿼리와 동일한 값을 사용 할 수 있습니다.
미디어 쿼리를 사용했을 때 어떻게 더 빠르게 페이지를 로드할 수 있는지 아래의 예시를 통해 확인해 보겠습니다.
<!-- 예시 css파일 및 용량 -->
<link href="style.css" rel="stylesheet"> // 1KB
<link href="pc.css" rel="stylesheet"> // 100KB
<link href="tablet.css" rel="stylesheet"> // 100KB
<link href="mobile.css" rel="stylesheet"> // 100KB
일반적인 경우, 데스크톱, 모바일, 태블릿을 모두 고려한 CSS파일이 있다고 할 때, style.css
, tablet.css
, mobile.css
, pc.css
모두 다운로드를 해야합니다. 따라서 301kb를 다운로드하는동안 렌더링이 차단됩니다.
<!-- 미디어 쿼리 사용 -->
<link href="style.css" rel="stylesheet"> // 1kb
<link href="pc.css" rel="stylesheet" media="screen and (min-width: 1024px)"> // 100kb
<link href="tablet.css" rel="stylesheet" media="screen and (min-width: 768px) and (max-width:1023px)"> // 100kb
<link href="mobile.css" rel="stylesheet" media="screen and (max-width: 767px)"> //100kb
예시에서 해당 스타일들에 대해 미디어 쿼리를 적용하였습니다. PC환경 에서 처음 로드될 때 style.css
와 pc.css
는 미디어 쿼리의 조건에 맞기 때문에 렌더링 차단 리소스로 처리됩니다. 조건에 맞지 않는 그 외의 스타일은 비 렌더링 차단 리소스로 처리됩니다. 따라서, style.css
와 pc.css
가 다운로드 및 파싱 되는 동안만 Rendering이 차단됩니다.
tablet.css
와 mobile.css
는 비 렌더링 차단 리소스로 처리되어 렌더링에 영향을 주지 않습니다. 따라서 style.css
와 pc.css
의 용량인 101kb를 다운로드 하는 동안만 렌더링이 차단되기 때문에 페이지 로드 속도가 줄어듭니다.
3. Media Query Range
크롬 104버전에서 미디어 쿼리 range기능이 추가되었습니다.
미디어 쿼리의 범위를 지정할 때 min-width나 max-width를 사용하는 것이 아니라, 부등호(>,<, >=,<=)를 사용하여 편리하게 미디어 쿼리의 범위를 지정할 수 있게 되었습니다.
일반적으로 사용하는 미디어 쿼리는 다음과 같습니다.
@media (min-width: 400px) {
@content
}
미디어 쿼리 range기능을 도입하면 해당 쿼리를 아래와 같이 적을 수 있습니다.
@media (width >= 400px) {
@content
}
새로운 구문을 사용하면 시각적으로 의미를 보다 명확하게 확인할 수 있고 쿼리의 범위가 겹치지 않도록 작성할 수 있습니다.
Browser Support
일부 웹브라우저에서는 아직 사용이 불가능합니다.
참고사이트
1. 성능 팁 : 전략 – 모바일 퍼스트 vs 데스크톱 퍼스트
- https://mytory.net/archives/2400
- https://networkustad.com/2021/01/23/which-web-design-is-best/
- https://rawww.com/googles-mobile-algorithm/
- https://bloomcu.com/is-mobile-first-desktop-first-or-element-first-best-for-credit-union-web-design/
0개의 댓글