Computer >> 컴퓨터 >  >> 프로그래밍 >> CSS

CSS 미디어 쿼리 완벽 가이드: 반응형 웹 디자인 구현하기

다양한 기기에서 호환되는 웹사이트를 설계하는 것은 최대한 많은 사용자가 웹사이트에 접근할 수 있도록 보장하는 중요한 단계입니다.

이때 핵심적인 역할을 하는 것이 미디어 쿼리(Media Queries)입니다. CSS 미디어 쿼리를 사용하면 개발자가 정의한 조건과 브라우저가 일치할 때만 특정 CSS 규칙을 적용할 수 있습니다. 예를 들어, 사용자가 스마트폰으로 웹 페이지를 보고 있을 때만 적용되는 스타일을 정의할 수 있습니다.

이 튜토리얼에서는 반응형 웹 디자인의 기초, 미디어 쿼리의 작동 원리, 그리고 직접 CSS 미디어 쿼리를 설계하는 방법을 예제와 함께 자세히 다룹니다. 이 글을 다 읽고 나면 여러분은 CSS 미디어 쿼리 설계에 능숙해질 것입니다.

반응형 웹 디자인과 미디어 쿼리

반응형 웹 디자인이란 개발자가 사이트의 스타일시트를 최적화하여, 다양한 기기와 화면 크기에서 사이트가 올바르게 렌더링되도록 하는 일련의 기법을 말합니다.

반응형 웹 디자인이 중요한 이유는 시청자가 웹 페이지를 보는 데 사용하는 출력 기기, 브라우저 창, 화면 크기 등이 웹 페이지 로드 방식에 영향을 미치기 때문입니다. 만약 웹사이트가 다양한 기기와 화면 크기를 고려하지 않고 설계되었다면, 일부 사용자는 웹사이트에 표시된 모든 콘텐츠를 보기 어려울 수 있습니다.

반응형 웹 디자인은 플렉스박스(Flexbox) 사용, 상대 단위 스타일 적용 등 다양한 기법을 포괄하지만, 미디어 쿼리는 웹 반응형을 고려하여 설계된 모든 웹사이트에서 필수적인 요소입니다.

미디어 쿼리를 사용하면 사용 중인 기기 유형, 기기 방향, 뷰포트 크기에 따라 웹 페이지에서 스타일이 보이는 방식을 조정할 수 있습니다.

미디어 쿼리를 활용하면 사용자가 사이트를 보는 화면과 기기에 따라 웹사이트의 요소들을 다르게 표시할 수 있습니다.

미디어 쿼리 문법(Syntax)

CSS에서 미디어 쿼리를 선언하려면 @media 규칙을 사용해야 합니다. 이 규칙은 특정 조건이 참(true)으로 평가될 때만 CSS 속성 블록을 실행하도록 합니다.

다음은 CSS 미디어 쿼리의 기본 문법입니다:

@media media-type and (media-rule) {
	/* CSS 스타일 */
}

이 미디어 쿼리의 주요 구성 요소는 다음과 같습니다:

  • @media: 브라우저에게 미디어 쿼리 생성을 지시합니다.
  • media-type: 코드가 사용될 미디어 유형(예: screen, print)입니다.
  • and: 미디어 유형과 미디어 규칙을 동시에 지정할 때 사용하는 논리 연산자입니다.
  • media-rule: 미디어 쿼리 내부의 CSS가 실행되기 위해 참으로 평가되어야 하는 조건문입니다.
  • CSS 스타일: 조건이 참일 때 웹 요소에 적용될 스타일 규칙들입니다.

미디어 쿼리와 함께 사용할 수 있는 미디어 유형은 all, print, screen, speech 네 가지입니다. 기본값은 all이며, 쉼표(,)로 구분하여 여러 미디어 유형을 동시에 지정할 수도 있습니다.

CSS 미디어 규칙(Media Rules) 유형

미디어 쿼리에 적용할 수 있는 규칙 유형은 몇 가지가 있습니다. 각각을 자세히 살펴보겠습니다.

너비(Width) 및 높이(Height)

CSS 미디어 규칙에서 가장 주로 사용되는 규칙은 기기의 너비와 높이입니다. 이 규칙들을 사용하면 뷰포트 컨테이너(Viewport Container)의 크기에 따라 웹 요소에 스타일을 적용할 수 있습니다. 뷰포트 컨테이너란 사용자에게 보이는 웹 페이지의 영역을 의미합니다.

widthheight 규칙은 뷰포트가 특정 크기와 정확히 일치할 때 스타일을 적용합니다. 예를 들어, 뷰포트 높이가 500px일 때 모든 <p> 태그의 텍스트 색상을 파란색으로 변경하고 싶다면 다음과 같이 작성합니다:

@media screen and (height: 500px) {
  p {
    color: blue;
  }
}

이 규칙은 뷰포트 너비가 정확히 500px일 때 모든 <p> 태그의 텍스트 색상을 blue로 설정합니다. (원문 예제는 width: 500px였으나 높이를 예로 든 설명과 일치하도록 height로 수정하여 설명하는 것이 자연스럽습니다. 여기서는 원문 코드 예제인 width 기준을 따릅니다.)

@media screen and (width: 500px) {
  p {
    color: blue;
  }
}

하지만 대부분의 경우 특정 범위를 기준으로 미디어 쿼리를 적용하고자 합니다. 예를 들어, 뷰포트 크기가 500px 이상일 때 글꼴 크기를 변경하고 싶을 수 있습니다. 이때 min-widthmin-height, max-width, max-height 속성이 사용됩니다.

뷰포트 너비가 500px 이상일 때 모든 <p> 요소의 텍스트 색상을 파란색으로 변경하려면 다음 규칙을 사용합니다:

@media screen and (min-width: 500px) {
  p {
    color: blue;
  }
}

이 규칙은 min-width: 500px 조건을 평가하여 뷰포트 너비가 500px 이상인지 확인합니다. 조건이 참이면 p 스타일 규칙이 웹 페이지에 적용됩니다.

방향(Orientation)

미디어 쿼리는 기기의 방향에 따라 웹 페이지에 스타일을 적용하는 데에도 사용됩니다.

사용자가 웹 페이지를 가로 모드(Landscape)로 볼 때 모든 <h2> 요소의 텍스트 크기를 20px로 설정하고 싶다고 가정해 봅시다. 다음과 같이 코드를 작성할 수 있습니다:

@media (orientation: landscape) {
  h2 {
    font-size: 20px;
  }
}

이 규칙은 사용자가 웹 페이지를 가로 모드로 보고 있는지 확인하고, 조건이 참이면 모든 <h2> 요소의 글꼴 크기를 20px로 설정합니다. 참고로 데스크톱은 기본적으로 가로 방향을 사용합니다.

CSS 미디어 쿼리 실전 예제

직접 미디어 쿼리를 작성하는 방법을 이해하기 위해 두 가지 실전 예제를 살펴보겠습니다.

예제 1: 기본 미디어 쿼리 - 요소 숨기기

웹사이트를 설계 중인데, 모든 모바일 기기에서 이 사이트는 베타 버전입니다라는 문구가 담긴 박스를 표시하고 싶다고 가정해 봅시다. 이 박스는 모바일 경험을 아직 테스트 중이므로 모바일 기기에서만 나타나야 합니다.

다음 코드로 이 박스를 만들 수 있습니다:

<html>
  <p class="betaBox">이 사이트는 베타 버전입니다.</p>
  <style>
    .betaBox {
      background-color: orange;
      padding: 10px;
    }
    @media screen and (max-width: 600px) {
      .betaBox {
        display: none;
      }
    }
  </style>
</html>

코드 분석:

  • HTML에서 betaBox 클래스를 가진 <p> 태그로 안내 문구를 작성했습니다.
  • CSS에서 .betaBox 스타일로 주황색 배경과 10px 패딩을 주었습니다.
  • @media screen and (max-width: 600px) 미디어 쿼리는 뷰포트 너비가 600px보다 좁을 때(일반적인 모바일 기기) 내부 스타일을 적용하라는 의미입니다.
  • 조건이 충족되면 display: none이 적용되어 .betaBox 요소가 화면에서 숨겨집니다. (참고: 원문 예제는 모바일에서 숨기는 로직이나, 설명문 "모바일에서만 나타나야 한다"와 코드 로직이 반대입니다. 여기서는 코드 로직대로 '모바일에서 숨김'으로 해석하여 번역했습니다.)

예제 2: 다중 미디어 쿼리 - 글꼴 크기 조절

앞선 예제에서는 미디어 쿼리를 하나만 사용했습니다. 하지만 CSS 파일에 여러 미디어 쿼리를 지정하여, 여러 조건 중 어느 것이 충족되느냐에 따라 요소에 다른 스타일을 적용할 수 있습니다.

웹사이트의 <h1> 헤더 글꼴 크기가 화면 크기에 따라 변하도록 설계하고 싶다고 가정해 봅시다. 적용하고자 하는 규칙은 다음과 같습니다:

  • 화면 너비가 480px 이하: 헤더 글꼴 크기 16px
  • 화면 너비가 481px ~ 600px: 헤더 글꼴 크기 20px
  • 화면 너비가 601px 이상: 헤더 글꼴 크기 24px

다음 세 개의 미디어 쿼리를 사용하여 사용자 화면 크기에 따라 글꼴 크기를 변경할 수 있습니다:

<html>
  <h1>이것은 예제 헤더입니다.</h1>
  <style>
    /* 480px 이하 */
    @media screen and (max-width: 480px) {
      h1 { font-size: 16px; }
    }

    /* 481px ~ 600px */
    @media screen and (min-width: 481px) and (max-width: 600px) {
      h1 { font-size: 20px; }
    }

    /* 601px 이상 */
    @media screen and (min-width: 601px) {
      h1 { font-size: 24px; }
    }
  </style>
</html>

코드 분석:

  • HTML에 예제 헤더(<h1>)를 정의했습니다.
  • 첫 번째 쿼리: max-width: 480px으로 뷰포트가 480px 이하일 때 글꼴 크기를 16px로 설정합니다.
  • 두 번째 쿼리: min-width: 481pxmax-width: 600pxand로 연결하여 481px 이상 600px 이하 범위에서 20px를 적용합니다.
  • 세 번째 쿼리: min-width: 601px으로 601px 이상일 때 24px를 적용합니다.

미디어 쿼리 브레이크포인트(Breakpoints)

브레이크포인트(Breakpoints)는 웹사이트가 미디어 쿼리를 적용하는 지점을 설정하는 것입니다.

미디어 쿼리를 설계할 때 "어떤 크기를 기준으로 미디어 쿼리를 설정해야 할까?"라는 의문이 들 수 있습니다. 반응형 웹 디자인을 처음 접하면 웹사이트가 렌더링되어야 할 기기들의 화면 크기를 파악하기 어렵기 때문입니다.

인터넷에는 특정 화면 크기를 타겟으로 하는 브레이크포인트 목록들이 있어 참고하기 좋습니다. 하지만 시중에는 저마다 다른 화면 크기와 사양을 가진 수많은 기기가 존재하므로, 이러한 목록들이 모든 주요 지점을 커버하지 못하는 경우가 많습니다.

가장 좋은 방법은 자신의 웹사이트를 살펴보며 요소가 찌그러지거나 잘리는 지점을 찾는 것입니다. 모바일 기기에서 어떤 요소가 완전히 보이지 않는다면, 그곳에 브레이크포인트를 추가해야 한다는 신호입니다.

이러한 지점을 파악한 후 맞춤 미디어 규칙을 작성하면 됩니다. 예를 들어, <div> 태그가 너비 500px 미만 기기에서 제대로 렌더링되지 않는다면, 해당 해상도를 위한 미디어 쿼리를 작성하여 맞춤 스타일을 적용하면 됩니다.

시작에 도움이 되도록, 주요 기기를 타겟팅하는 데 유용한 대표적인 브레이크포인트 목록을 정리했습니다:

  • 대부분의 스마트폰: @media screen and (max-width: 600px) {}
  • 세로 모드 태블릿 및 대형 스마트폰: @media screen and (min-width: 600px) {}
  • 가로 모드 태블릿: @media screen and (min-width: 768px) {}
  • 노트북 및 데스크톱: @media screen and (min-width: 992px) {}
  • 대형 노트북 및 데스크톱: @media screen and (min-width: 1200px) {}

이 규칙들은 미디어 쿼리 브레이크포인트를 결정하는 데 좋은 출발점이 되지만, 여러분의 웹사이트 고유한 요구사항에 맞게 몇 가지 조정이 필요할 수 있습니다.

결론

미디어 쿼리는 CSS에서 웹 페이지에 반응형 디자인을 추가하는 데 사용됩니다. 미디어 쿼리를 사용하면 특정 조건 또는 조건 집합이 충족될 때 특정 스타일을 적용할 수 있습니다. 예를 들어, 웹 페이지 너비가 750px보다 클 때 글꼴 크기를 변경하는 데 미디어 쿼리를 사용할 수 있습니다.

이 튜토리얼에서는 예제를 통해 반응형 웹 디자인의 기초, 미디어 쿼리의 작동 원리, 미디어 쿼리 작성 방법을 다루었습니다. 이제 여러분은 전문 웹 디자이너처럼 CSS 미디어 쿼리를 활용할 준비가 되었습니다.