AD JB Toolbox 01

HTML 강좌 / 반응형 이미지: srcset, sizes, picture

HTML 반응형 이미지는 같은 사진의 여러 크기나 구도를 브라우저에 제시해 화면 조건에 맞는 파일을 선택하도록 하는 방법입니다. 같은 구도의 해상도 선택에는 srcset과 sizes, 화면에 따라 다른 구도를 보여 줄 때는 picture를 사용합니다.

예제 이미지 준비하기

아래 예제는 같은 사진을 가로 480·960·1600픽셀로 만든 파일과, 가운데 나무가 잘 보이도록 정사각형으로 자른 파일을 사용합니다. 파일을 내려받아 HTML 파일과 같은 폴더에 두면 코드의 상대경로를 그대로 시험할 수 있습니다.

처음 세 파일은 같은 장면과 가로세로 비율을 유지하며 크기만 다릅니다. 정사각형 파일은 좁은 화면에서 중심 피사체를 더 크게 보여 주기 위한 다른 구도입니다.

srcset과 sizes로 파일 크기 선택하기

srcset의 480w, 960w, 1600w는 각 파일의 실제 가로 픽셀 수입니다. sizes는 화면 조건별로 이미지가 레이아웃에서 차지할 예상 너비를 알려 줍니다.

<img class="example-fluid"
  src="html-image-sample-lake-tree-960-v1.webp"
  srcset="html-image-sample-lake-tree-480-v1.webp 480w,
          html-image-sample-lake-tree-960-v1.webp 960w,
          html-image-sample-lake-tree-1600-v1.webp 1600w"
  sizes="(max-width: 800px) 100vw, 800px"
  alt="호수 가운데 작은 섬의 나무와 먼 산"
  width="1600" height="900">

이 예제는 화면 너비가 800픽셀 이하일 때 이미지가 대략 화면 너비를 차지하고, 그보다 넓을 때는 최대 800픽셀을 차지한다고 가정합니다. 실제 CSS가 다르다면 sizes도 그 레이아웃에 맞게 수정해야 합니다. src는 srcset을 지원하지 않는 환경을 위한 기본 파일입니다.

.example-fluid {
  display: block;
  width: 100%;
  max-width: 800px;
  height: auto;
}

이 CSS는 example-fluid 클래스가 있는 첫 번째 예제에만 적용됩니다. 브라우저는 표시 너비뿐 아니라 화면의 픽셀 밀도, 확대 비율 등의 조건도 고려해 후보 중 하나를 선택합니다. 따라서 작은 화면에서 항상 480픽셀 파일이 선택되는 것은 아닙니다. sizes의 값은 CSS 픽셀 단위의 표시 너비이지, 내려받을 파일의 픽셀 수가 아닙니다.

고정된 표시 너비에는 배율 표기 사용하기

이미지가 항상 480 CSS 픽셀 너비로 보인다면 1x와 2x처럼 픽셀 밀도를 기준으로 한 후보를 줄 수도 있습니다. 이 경우 sizes는 사용하지 않습니다.

<img class="example-fixed"
  src="html-image-sample-lake-tree-480-v1.webp"
  srcset="html-image-sample-lake-tree-480-v1.webp 1x,
          html-image-sample-lake-tree-960-v1.webp 2x"
  alt="호수 가운데 작은 섬의 나무와 먼 산"
  width="480" height="270">
.example-fixed {
  display: block;
  width: 480px;
  height: auto;
}

첫 번째 예제의 CSS는 이 이미지에 적용되지 않습니다. 위 CSS는 표시 너비를 480픽셀로 고정하므로, 그보다 좁은 영역에서는 이미지가 넘칠 수 있습니다. 화면에 표시될 너비가 바뀌어야 한다면 앞의 w와 sizes 예제를 사용하세요. 한 srcset 안에서 w 표기와 x 표기를 섞지 않습니다.

picture로 좁은 화면의 구도 바꾸기

파일의 크기만 바꾸는 것과 달리, picture는 화면 조건에 맞는 다른 구도의 이미지를 보여 줄 수 있습니다. 다음 코드는 화면 너비가 600픽셀 이하일 때 정사각형 이미지를, 그 밖에는 가로형 이미지를 사용합니다.

<picture>
  <source media="(max-width: 600px)"
          srcset="html-image-sample-lake-tree-square-800-v1.webp"
          width="800" height="800">
  <img src="html-image-sample-lake-tree-960-v1.webp"
       alt="호수 가운데 작은 섬의 나무와 먼 산"
       width="960" height="540">
</picture>

가운데 나무를 중심으로 정사각형으로 자른 호수 사진

위 사진은 좁은 화면에서 사용할 정사각형 파일의 예시이며, 이 문단의 사진 자체가 화면 너비에 따라 바뀌는 것은 아닙니다. picture 안에는 대체 이미지와 대체 텍스트를 제공하는 img가 반드시 있어야 합니다. source는 선택 조건과 후보 파일을 제공하며, 본문을 설명하는 alt는 img에 둡니다.

브라우저에서 선택된 이미지 확인하기

이미지 파일 네 개를 파일명 그대로 index.html과 같은 폴더에 저장하세요. 위 HTML 예제는 body 안에, 해당 CSS는 head의 style 요소나 별도 스타일시트에 넣습니다. 모바일 화면에서 실제 뷰포트 너비를 기준으로 시험하려면 head에 <meta name="viewport" content="width=device-width, initial-scale=1">도 넣으세요.

  1. index.html을 브라우저에서 열고 개발자 도구의 Network 패널을 엽니다.
  2. 창 너비를 바꾼 뒤 캐시를 사용하지 않도록 설정하고 페이지를 새로고침합니다. 이미지 요청의 파일명을 보면 어떤 후보가 로드됐는지 알 수 있습니다.
  3. picture 예제는 뷰포트 너비를 600픽셀 이하와 초과로 각각 설정해 새로고침합니다. 좁을 때 정사각형 파일, 넓을 때 가로형 파일이 선택되는지 확인합니다.

콘솔에서 아래 값을 확인할 수도 있습니다. currentSrc는 브라우저가 현재 선택한 이미지 URL을 보여 줍니다. 첫 번째 명령은 srcset 예제, 두 번째 명령은 picture 예제에 해당합니다.

document.querySelector('.example-fluid').currentSrc
document.querySelector('picture img').currentSrc

같은 화면 너비라도 픽셀 밀도나 확대 비율에 따라 srcset에서 선택되는 파일이 달라질 수 있습니다. 이미 큰 파일을 받은 상태라면 창 너비만 줄여도 곧바로 작은 파일로 바뀌지 않을 수 있으므로, 조건을 바꾼 뒤 캐시를 끄고 새로고침해 비교하세요.

반응형 이미지가 맞지 않을 때 확인하기

  • w 값이 파일의 실제 가로 픽셀 수와 일치하는지 확인합니다.
  • sizes가 CSS에서 실제로 표시되는 너비를 적절히 설명하는지 확인합니다.
  • 크기별 파일이 같은 구도인지, 구도를 바꾸는 파일은 picture에 분리했는지 확인합니다.
  • picture 안에 img와 의미에 맞는 alt가 있는지 확인합니다.

선택 규칙의 세부 내용은 MDN의 반응형 이미지 안내와 WHATWG HTML 이미지 표준에서 확인할 수 있습니다.

같은 카테고리의 다른 글
HTML 강좌 / 텍스트에 의미 부여하기

HTML 강좌 / 텍스트에 의미 부여하기

HTML의 em, strong, q, blockquote, abbr, code, kbd를 상황에 맞게 쓰는 방법을 예제로 설명합니다. 글자의 모양이 아니라 텍스트의 의미를 표시하는 기준을 익힐 수 있습니다.

HTML 강좌 / label과 input으로 입력 필드 만들기

HTML 강좌 / label과 input으로 입력 필드 만들기

label의 for와 input의 id를 연결하는 방법, name의 제출 역할, placeholder가 레이블을 대신할 수 없는 이유를 설명합니다.

HTML 강좌 / 이미지 넣기: img, alt, 크기

HTML 강좌 / 이미지 넣기: img, alt, 크기

HTML img 요소로 이미지를 넣고 alt 대체 텍스트와 width·height를 설정하는 방법을 설명합니다. 실제 예제 이미지로 경로와 크기 문제도 확인할 수 있습니다.

HTML 강좌 / 제목과 문단

HTML 강좌 / 제목과 문단

HTML h1~h6 제목 태그와 p 문단 태그의 역할 및 올바른 구조를 예제로 설명합니다. 제목 단계 구성, br 줄바꿈과 자주 발생하는 작성 오류도 함께 확인할 수 있습니다.

HTML 강좌 / textarea, select, option, button 사용하기

HTML 강좌 / textarea, select, option, button 사용하기

여러 줄 입력, 선택 목록, 양식 버튼을 만드는 요소의 역할과 값이 제출되는 방식을 예제로 설명합니다.

HTML 강좌 / 읽기 쉬운 표 만들기: caption, th, scope, 셀 병합

HTML 강좌 / 읽기 쉬운 표 만들기: caption, th, scope, 셀 병합

caption과 제목 셀의 scope로 표의 관계를 분명히 하고, colspan·rowspan으로 셀을 병합할 때 주의할 점을 설명합니다.

HTML 강좌 / audio, video, iframe으로 미디어와 외부 콘텐츠 삽입하기

HTML 강좌 / audio, video, iframe으로 미디어와 외부 콘텐츠 삽입하기

오디오·비디오 파일과 외부 콘텐츠를 HTML에 삽입할 때 필요한 기본 코드, 자막, 파일 경로, 접근성 확인 사항을 설명합니다.

HTML 강좌 / 입력값 검증: required, 길이·범위 제한, 오류 안내

HTML 강좌 / 입력값 검증: required, 길이·범위 제한, 오류 안내

required, minlength, min, max 등의 기본 입력 제약을 설정하고 오류를 안내·시험하는 방법과 서버 검증의 필요성을 설명합니다.

HTML 강좌 / 문법

HTML 강좌 / 문법

HTML 요소·태그·속성·주석의 기본 문법을 예제로 설명합니다. 빈 요소, 속성값 따옴표, 태그 중첩에서 주의할 점과 문법 확인 방법도 다룹니다.

HTML 강좌 / input 유형 선택하기: 이메일·숫자·날짜·체크박스·라디오

HTML 강좌 / input 유형 선택하기: 이메일·숫자·날짜·체크박스·라디오

입력 목적에 맞는 input type을 고르고 체크박스와 라디오 버튼의 선택·제출 동작을 구분하는 방법을 설명합니다.