기본적인 미디어 쿼리 사용
뷰포트의 너비가 480px이거나 그 이하일 경우에는 배경색을 darkorange로 표현합니다.
하지만 뷰포트의 너비가 그 초과일 경우에는 배경색을 lightblue로 바꿔서 표현합니다.
CSS 중급 요약 설명
- CSS Level 3 선택자(조합 선택자, 속성 선택자, 의사 클래스)를 활용하여 더 정밀한 요소 선택이 가능하며, 의사(가상) 요소로 HTML 요소에 없는 가상의 요소를 제어할 수 있습니다.
- CSS 카운터로 자동 번호 매기기를 구현하고, 벤더 프리픽스로 실험적 기능을 활용합니다. IR 기법으로 이미지 대체텍스트를 제공하며, CSS 속성 선언 순서의 컨벤션을 이해합니다.
- CSS3 Module의 신규 속성(positioned, background and border, overflow, gradient,
calc()등)과 @규칙(@import,@font-face,@media)을 활용하여 웹 폰트 적용과 반응형/적응형 웹을 구현합니다.
요약 설명
@media는 출력 장치의 특징을 참조하여 CSS 코드를 분기 처리하는 규칙입니다.
출력 장치의 유형, 크기, 해상도 등을 조건으로 하여 하나의 HTML 소스가 여러 가지 뷰를 갖도록 구현할 수 있으며, 이를 미디어 쿼리(Media Query)라고 합니다.미디어 쿼리는 CSS2부터 사용되었으며, CSS3에서 본격적으로 쓰이기 시작했습니다.
CSS2에서는 매체 유형(media type)만 지원했지만, CSS3에서는 매체 유형과width,height,color등의 표현식으로 구성된 미디어 쿼리를 사용할 수 있습니다.
반응형 웹의 핵심 기법으로, 뷰포트 해상도에 따라 CSS 코드를 분기하여 반응형 레이아웃을 구현하거나 문서를 인쇄할 때 사용됩니다.
요약 설명@media part-2에서는
@media의 속성 중
- 미디어 쿼리(Media Query) 코드 템플릿
- 반응형 웹과 적응형 웹
- 컨테이너 쿼리(Container Queries)에 대한 내용을 다루고 있습니다.
아래 예시들은 모든 해상도를 커버하기 위한 미디어 쿼리 코드 템플릿입니다.
프로젝트 환경 또는 디자인에 따라 적절하게 선택하여 사용해야 합니다.
뷰포트의 너비가 480px이거나 그 이하일 경우에는 배경색을 darkorange로 표현합니다.
하지만 뷰포트의 너비가 그 초과일 경우에는 배경색을 lightblue로 바꿔서 표현합니다.
다음 예제를 웹 브라우저에서 실행하면 배경색을 검정색으로, 텍스트의 색상은 흰색으로 표현합니다.
하지만 웹 페이지를 프린트하게 되면 배경색을 흰색으로, 텍스트의 색상을 검정색으로 바꿔서 프린트합니다.
일반적으로 사용하는 device별 미디어 쿼리 사이즈입니다.
Mobile부터 시작하여 Tablet, Desktop으로 변화하는 반응형 웹의 미디어 쿼리 템플릿입니다.
Desktop부터 시작하여 Tablet, Mobile으로 변화하는 반응형 웹의 미디어 쿼리 템플릿입니다.
Apple사의 여러 기기에 상세히 대응할 수 있는 @media 템플릿입니다.
일반적으로 반응형 웹 디자인은 뷰포트 너비(width 프로퍼티)를 기준으로 하며, 뷰포트 너비에 따라 반응하는 범위를 스크린 경계치(screen breakpoints)라고 부릅니다.
스마트폰, 태블릿, 데스크탑에 대해 최소한의 스크린 경계치를 고려해야 합니다.
반응형 웹과 적응형 웹은 모두 모바일 기기와 다양한 화면 크기에서 원활한 정보를 제공하여 더 나은 사용자 경험을 제공하기 위한 방법입니다.
반응형 웹은 미디어 쿼리를 사용하여 화면 크기에 따라 레이아웃이 자동으로 조절되는 웹 디자인 방식입니다.
하나의 템플릿으로 모든 기기에 대응할 수 있어 개발이 간편하지만, 모든 기기를 위한 CSS를 다운로드해야 하므로 로딩 시간이 길어질 수 있습니다.
적응형 웹은 서버나 클라이언트에서 접근한 기기를 감지하여 해당 기기에 최적화된 템플릿을 제공하는 웹 디자인 방식입니다.
기기별로 별도의 템플릿을 제작해야 하지만, 기기에 맞는 콘텐츠만 다운로드하므로 로딩 속도가 빠릅니다.
기기 감지
미디어 쿼리로 기기 감지합니다.
서버 또는 브라우저에서 기기 감지합니다.
템플릿
하나의 템플릿으로 충분합니다.
기기마다 다른 템플릿 필요합니다.
콘텐츠 다운로드
모든 콘텐츠 다운로드 필요합니다.
기기에 맞는 콘텐츠만 다운로드 합니다.
로딩 속도
로드되는 속도가 느립니다.
로드되는 속도가 빠릅니다.
기존 사이트
기존 사이트 변경 및 재구축 필요합니다.
기존 사이트 변경 없이 구축 가능합니다.
모바일 퍼스트 디자인은 웹 애플리케이션을 처음 구축할 때 모바일을 우선으로 설계하는 방식입니다.
모바일을 먼저 구축한 후, 데스크톱이나 다른 기기를 위한 반응형/적응형 웹을 추가합니다.
위 CSS 코드처럼 모바일을 기본으로 삼아 코드를 짠 후, 다른 기기에 맞는 CSS 코드를 추가하는 방식입니다.
모바일 사이트에 미디어 쿼리를 추가하여 데스크탑 화면에 맞게 보여주는 방식이 반응형 웹의 'Mobile First'입니다.
현재 우리나라에서는 '데스크탑 우선주의(Desktop First)'를 많이 사용하지만, 해외에서는 '모바일 우선주의(Mobile First)' 방식이 널리 사용되고 있습니다.
모바일 퍼스트와는 반대로 데스크탑 화면에 맞추어진 사이트에 미디어쿼리를 더해 모바일 사이트를 만드는 방식입니다.
우리나라에서 대부분의 사이트가 '데스크탑 우선주의(Desktop First)' 방식으로 사용되고 있습니다.
확실한 구버전 IE대응
익숙한 작업 순서 유지
리뉴얼 없는 모바일 대응 추가
오버라이딩(속성 덮어쓰기) 발생
데스크탑 퍼스트 방식에서는 모바일 화면을 만들기 위해 CSS 속성을 다시 덮어써야 하는 경우가 많아 코드가 길어집니다.
사이드 이펙트(부작용) 문제
데스크탑의 수정사항이 모바일에 영향을 미칠 수 있어, 수정 시 모바일 화면을 함께 확인해야 합니다.
LukeW(모바일 우선주의 디자인의 창시자)가 제시한 5가지 레이아웃 패턴은 다음과 같습니다.
일반적인 화면에서는 유동형 그리드와 이미지를 사용하여 레이아웃을 유지하고, 작은 화면에서는 컬럼이 수직으로 쌓이는 구조입니다.
가장 많이 사용되는 패턴이며, 작은 화면과 큰 화면 사이에 하나의 중단점(breakpoint)만 있으면 됩니다.
활용 사이트
화면이 작아짐에 따라 부차적인 컬럼을 아래로 떨어뜨리는 패턴입니다.
대부분의 컬럼 폭은 화면 크기가 달라져도 변하지 않으며, 화면이 좁아지면 열들이 수직으로 쌓입니다.
활용 사이트
다양한 디바이스에 따라 각기 다른 레이아웃을 보여주는 패턴입니다.
여러 개의 중단점을 두어 화면 크기에 민감하게 반응하며, 컬럼을 떨어뜨리는 대신 컨텐츠를 이동시킵니다.
복잡한 작업이 필요하지만 혁신적인 디자인을 구현할 수 있습니다.
활용 사이트
하나의 컬럼을 사용하는 패턴으로, 글꼴 크기나 이미지 크기만 조정하는 작은 변화만 이루어집니다. 변화의 폭이 크지 않으며, 주로 블로그나 단일 열 레이아웃에서 사용됩니다.
활용 사이트
큰 화면에서는 모든 컬럼을 보여주고, 작은 화면에서는 메인 컬럼만 보여주며 부가적인 컬럼을 화면 밖에 숨겨놓는 패턴입니다.
숨겨진 컬럼은 필요할 때만 접근할 수 있으며, 네비게이션이나 메뉴 같은 요소를 작은 화면에서는 클릭 시에만 보여줍니다.
활용 사이트
컨테이너 쿼리는 뷰포트 크기가 아닌 부모 컨테이너의 크기를 기준으로 스타일을 적용하는 기능입니다.
미디어 쿼리는 뷰포트 전체 크기를 기준으로 하기 때문에, 페이지의 특정 컴포넌트만 독립적으로 반응형으로 만들기 어려웠습니다.
컨테이너 쿼리를 사용하면 카드, 위젯, 사이드바 같은 개별 컴포넌트가 자신이 포함된 컨테이너의 크기에 따라 스타일을 조정할 수 있습니다.
컨테이너 쿼리는 CSS Containment Module Level 3에 정의되어 있으며, 최신 브라우저에서 지원됩니다.
컨테이너 쿼리를 사용하려면 먼저 컨테이너로 사용할 요소에 container-type 또는 container 속성을 설정해야 합니다.
container-type 속성 값:
inline-size: 인라인 방향(가로) 크기를 기준으로 쿼리block-size: 블록 방향(세로) 크기를 기준으로 쿼리size: 인라인과 블록 방향 모두를 기준으로 쿼리normal: 컨테이너 쿼리 사용 안 함 (기본값)
container-name을 사용하면 여러 컨테이너 중 특정 컨테이너를 지정할 수 있습니다.
@container 규칙은 미디어 쿼리의 @media와 유사하지만, 뷰포트가 아닌 컨테이너의 크기를 기준으로 작동합니다.
카드 컴포넌트가 컨테이너 크기에 따라 레이아웃이 변경되는 예제입니다.