본문으로 건너뛰기

CSS 미디어 쿼리(Media Query) 딥다이브

서론

반응형 웹(Responseive Web Design, RWD)을 구현하다 보면, 필연적으로 마주하게 되는게 Media Query이다.

이번에 강의를 들으면서, Media Query에 대해 간단하게 학습해보게 되었다.

강의 내용으로는 성에 차지 않아, 좀 더 깊게 탐구해보게 되었다.

Media Query란?

미디어 쿼리를 사용하면 디바이스의 미디어 유형(예: 인쇄 vs. 화면) 또는 화면 해상도, 방향, 화면 비율, 브라우저 뷰포트의 너비 또는 높이, 사용자의 선호도(예: 감소된 모션 선호, 데이터 사용, 투명도)와 같은 기타 기능이나 특성에 따라 CSS 스타일을 적용할 수 있습니다.

우리가 보는 웹 화면은 모니터, 태블릿, 스마트폰 등 다양한 미디어 매체를 통해 보여지고 있다.

그리고, 이런 미디어 기기들은 화면 사이즈, 비율과 같이 각각의 특성을 가지고 있다.

이런 특성을 고려해서, 사용자의 미디어 매체를 기반으로 특정 유형과 특정 조건에 대해 원하는 스타일을 정의하는 방법이 곧 미디어 쿼리이다.

Media Query 문법

미디어 쿼리는 선택적인 미디어 타입과 여러 개의 미디어 특징 표현식으로 구성되며, 논리 연산자를 사용하여 다양한 방식으로 조합할 수도 있습니다. 미디어 쿼리는 대소문자를 구분하지 않습니다.

기본적으로 미디어 쿼리는 CSSat-rule 문법을 따르며, 다음과 같이 표현된다.

css
@media 조건문 {
적용할 css 스타일
}

그리고 조건문은 다음과 같이 표현된다.

css
미디어 유형 and (미디어 특성)

미디어 쿼리는 미디어 유형미디어 특성으로 구성되는 '참' 또는 '거짓'의 값을 갖는 논리식이다.

미디어 유형이 screen이고, 미디어 특성이 width:768px일 경우 다으모가 같이 표현할 수 있다.

css
screen and (width: 768px)

이 논리식은 미디어 유형이 screen이고, 너비가 768px 이상인 기기에서 '참'이 되며, 그렇지 않을 경우 '거짓'이 된다.

미디어 쿼리를 작성할 경우, 미디어 특성은 괄호로 감싸 표현하며, 각 미디어 유형과 미디어 특성은 생략이 가능하다.

css
screen // 미디어 특성이 생략된 경우
css
(min-width:768px) // 미디어 유형이 생략된 경우

미디어 유형과 미디어 특성을 모두 작성하고자 할 때는 and 키워드로 미디어 유형과 미디어 특성을 구분 짓는다.

css
screen and (min-width:768px)

또한, 연산자를 사용하여 여러 미디어 특성을 결합하여 좀 더 복잡하고 다양한 미디어 쿼리를 작성할 수 있다.

css
screen and (min-width:768px) and (max-width:1024px)

미디어 유형(Media Types)

<media-type>는 장치의 일반적인 유형을 설명합니다. only 논리 연산자를 사용할 때를 제외하면, 미디어 타입은 선택 사항이며 기본적으로 all 타입이 적용됩니다.


미디어 유형은 딱 3가지가 존재한다.


미디어 유형설명
all모든 장치
print인쇄된 문서 및 출력 미리보기 모드
screen컴퓨터 화면, 태블릿, 스마트폰 등 화면 기반 장치

미디어 유형은 선택 사항이며, 기본적으로 all 타입이 적용된다. (미디어 유형을 생략하면 all 타입이 적용된다.)

미디어 특성(Media Features)

미디어 특성(Media Features)은 사용자 에이전트(User Agent)나 디바이스(Device)의 특정 속성을 나타내며, 이를 기반으로 반응형 스타일을 적용할 수 있다.

미디어 특성의 기본 구조

미디어 특성은 항상 괄호 안에 위치하며, 다음과 같은 형식으로 작성된다.

css
(미디어 특성:)

미디어 특성의 유형

미디어 특성은 두 가지 유형으로 나뉜다.

  1. Discrete 타입
  2. Range 타입

Discrete 타입

특정한 값들로 이루어진 집합을 갖는 타입이다. (예: [true, false], 특정 키워드 집합 등)

값 간의 크기 비교가 불가능하며, min- 또는 max- 접두사를 사용할 수 없다.

css
@media (orientation: portrait) {
body {
background-color: lightgray;
}
}

화면이 세로 모드일 때 스타일을 적용하는 예시이다.

Range 타입

특정한 범위를 갖는 타입이다. (예: width, height, resolution 등)

값 간의 크기 비교가 가능하다.

min-, max- 접두사를 붙일 수 있다.

css
@media (min-width: 768px) and (max-width: 1024px) {
body {
background-color: yellow;
}
}

화면 너비가 768px 이상이고, 1024px 이하일 때 스타일을 적용하는 예시이다.

미디어 쿼리의 표준화

미디어 쿼리는 W3C(World Wide Web Consortium)에서 여러 단계(Level)을 거쳐 발전해 왔으며, 현재 레벨 5까지 표준화 과정이 진행되고 있다.

이걸 설명하는 이유는, 발전사에 따라, 레벨에 따라 미디어 특성의 유형이 추가되어 왔기 때문이다.

즉, 상황에 따라서는 구형 브라우저에서 지원이 안될 가능성이 있기에 알아두면 좋다.

미디어 쿼리의 발전 과정

미디어 쿼리는 처음 CSS2에서 미디어 유형(Media Type) 개념으로 등장했다.

이후 CSS3에서 본격적인 미디어 특성(Media Features)이 도입되었으며, 이후 지속적인 업데이트를 거쳐 최신 레벨 5까지 발전했다.

미디어 쿼리 버전출시 연도주요 내용
CSS2 (1998)1998년미디어 타입(예: screen, print) 도입
Media Queries Level 3 (2012)2012년미디어 특성(width, height, resolution 등) 도입
Media Queries Level 4 (2017~2022)2017년 초안, 2022년 표준논리 연산자 개선, 새로운 환경 관련 특성 추가
Media Queries Level 5 (현재 개발 중)2022년 이후부등호(<=, >=) 지원, 접근성 관련 특성 추가


Media Queries Level 3 (2012)

🔹 미디어 쿼리의 시작
  • 2012년에 W3C에서 공식적으로 **미디어 쿼리 레벨 3 (Media Queries Level 3, MQ3)**를 발표.
  • 웹사이트가 디바이스에 따라 적응할 수 있도록 미디어 특성(Media Features) 개념을 도입.
🔹 주요 특징
  • ✅ 미디어 타입(Media Types) -기기의 종류에 따라 스타일을 적용할 수 있도록 screen, print, all 등의 미디어 타입이 등장.

  • ✅ 미디어 특성(Media Features) 도입 -기기의 크기, 해상도 등에 따라 스타일을 변경할 수 있도록 width, height, resolution, orientation 등의 미디어 특성이 추가됨.

  • ✅ 논리 연산자 지원

    • 미디어 쿼리에서 and, not, , (or)를 사용할 수 있도록 규정.
🔹 Media Queries Level 3에서 추가된 주요 미디어 특성
미디어 특성유형설명
width, heightRange<length>화면의 너비와 높이
min-widthRange<length>최소 너비
max-widthRange<length>최대 너비
aspect-ratioRange<ratio>화면 가로/세로 비율
orientationDiscreteportrait, landscape화면 방향
resolutionRange<resolution>화면 해상도
color, monochromeRange<integer>색상 깊이
예제: MQ3에서 지원하는 미디어 쿼리
css
@media (max-width: 600px) {
body {
background-color: lightgray;
}
}

➡️ 화면 너비가 600px 이하일 때 배경색 변경.


미디어 쿼리 특성 정리

발전사에 따른 내용을 살펴보았으니, 현재까지 나온 미디어 쿼리에 대해서 정리해보자.

1. 너비 & 높이 관련 (Width & Height)

속성타입미디어 쿼리 레벨설명
width, heightRange<length>레벨 3뷰포트의 너비와 높이
min-widthRange<length>레벨 3최소 너비
max-widthRange<length>레벨 3최대 너비
min-heightRange<length>레벨 3최소 높이
max-heightRange<length>레벨 3최대 높이
aspect-ratioRange<ratio>레벨 3뷰포트의 가로:세로 비율

2. 화면 방향 관련 (Orientation)

속성타입미디어 쿼리 레벨설명
orientationDiscreteportrait, landscape레벨 3뷰포트의 방향

3. 해상도 및 색상 관련 (Resolution & Color)

속성타입미디어 쿼리 레벨설명
resolutionRange<resolution>레벨 3장치의 해상도 (DPI, DPPX)
min-resolutionRange<resolution>레벨 3최소 해상도
max-resolutionRange<resolution>레벨 3최대 해상도
colorRange<integer>레벨 3색상 비트(bit) 수
color-gamutDiscretesrgb, p3, rec2020레벨 4색상 영역
color-indexRange<integer>레벨 3색상 테이블의 색상 개수
monochromeRange<integer>레벨 3모노크롬 장치에서의 색상 비트 수
dynamic-rangeDiscretestandard, high레벨 5밝기, 대비, 색상의 범위
video-dynamic-rangeDiscretestandard, high레벨 5비디오 콘텐츠의 밝기, 대비, 색상 범위

4. 입력 장치 관련 (Input Devices)

속성타입미디어 쿼리 레벨설명
pointerDiscretenone, coarse, fine레벨 4기본 입력 장치가 포인터 장치인지
any-pointerDiscretenone, coarse, fine레벨 4추가 입력 장치 중 포인터 장치가 있는지
hoverDiscretenone, hover레벨 4기본 입력 장치가 hover(마우스) 가능한지
any-hoverDiscretenone, hover레벨 4추가 입력 장치 중 hover 가능 장치가 있는지

5. 사용자 환경 및 선호도 관련 (User Preferences & Accessibility)

속성타입미디어 쿼리 레벨설명
prefers-color-schemeDiscretelight, dark레벨 4사용자의 다크/라이트 모드 선호도 감지
prefers-contrastDiscreteno-preference, less, more, custom레벨 5사용자가 대비를 높이거나 낮춘 설정을 감지
prefers-reduced-motionDiscreteno-preference, reduce레벨 4사용자가 애니메이션을 줄이는 옵션을 활성화했는지 감지
prefers-reduced-transparencyDiscreteno-preference, reduce레벨 5사용자 설정에서 투명도 감소 모드를 감지
prefers-reduced-dataDiscreteno-preference, reduce레벨 5데이터 절약 모드가 활성화되었는지 감지
forced-colorsDiscretenone, active레벨 5시스템 강제 색상 모드 감지
inverted-colorsDiscretenone, inverted레벨 5시스템 색상 반전 모드 감지

6. 환경 및 실행 모드 관련 (Environment & Execution Mode)

속성타입미디어 쿼리 레벨설명
scriptingDiscretenone, initial-only, enabled레벨 5스크립트 실행 여부 감지
display-modeDiscretefullscreen, standalone, minimal-ui, browser레벨 5애플리케이션이 실행되는 모드 감지
device-postureDiscreteflat, folded레벨 5폴더블 디바이스의 상태 감지
shapeDiscreterectangular, round레벨 5디바이스 화면의 모양 감지

7. 콘텐츠 흐름 및 업데이트 관련 (Content Overflow & Update Frequency)

속성타입미디어 쿼리 레벨설명
overflow-blockDiscretenone, scroll, paged레벨 4블록 방향에서 콘텐츠가 넘칠 때의 동작 방식
overflow-inlineDiscretenone, scroll레벨 4인라인 방향에서 콘텐츠가 넘칠 때의 동작 방식
updateDiscretenone, slow, fast레벨 4화면이 콘텐츠를 업데이트하는 속도 (예: 전자잉크 디스플레이 감지)

복잡해 보일 수 있으나, 미디어 쿼리는 미디어 매체의 화면을 기준으로 , 거짓을 판별하는 요소임을 잊지말자.

정리

출처