웹 개발을 하면서 이미지들을 자주 다루게 되는데 그 이미지들은 포맷이 정말 다양하다.
시간이 흐르고 기술이 고도화되면서 새로운 이미지 포맷들도 생기곤 한다.
그런 흐름 속에서 유저가 사용하는 브라우저가 가장 최신 포맷의 이미지를 로드할 수 없는 이전 버전의 브라우저 일수도 있고
혹은 가장 최신 버전의 브라우저일수도 있다.
그럼 이런 상황에서 다양한 포맷 그리고 브라우저에 따라 알맞게 이미지를 보여줄 수 있는 방법이 무엇이 있을까 찾아보니
<picture> 태그를 알게 되었다.
이번 게시글에서는 <picture> 태그에 대해서 알게된 내용들을 기록해보려고 한다!
우선 <picture> 태그는 무엇일까?
<picture> 태그는 한마디로 “상황에 따라 다른 이미지를 보여줄 수 있게 해주는” html 태그이다.
안에는 여러 개의 <source> 태그랑, 마지막에 기본 이미지를 담고 있는 <img> 태그 하나가 들어간다.
브라우저는 이 안의 <source>들을 차례로 살펴보면서,
“음, 지금 너한테 제일 잘 맞는 이미지는 이거네!” 하고 가장 알맞은 걸 고른다.
만약 조건에 맞는 게 하나도 없거나, <picture> 자체를 지원하지 않는 구형 브라우저라면?
그럴 땐 그냥 <img> 태그에 있는 이미지를 보여준다.
결국 어떤 이미지가 선택되든, 화면에는 <img>가 차지하고 있는 그 자리에 최종 이미지가 깔리는 것이다.
그럼 예제를 통해 함께 알아보자!
<picture>
<source
srcset="/shared-assets/images/examples/surfer.jpg"
media="(orientation: portrait)" />
<img src="/shared-assets/images/examples/painted-hand.jpg" alt="" />
</picture>
위 코드를 보면 <picture> 안에 <source> 하나랑 <img> 하나가 들어 있다.
이때 브라우저는 <source>의 srcset, media, type 속성을 차례로 살펴보면서
“지금 내 화면 환경에 맞는 이미지는 뭐지?” 하고 가장 알맞은 이미지를 고른다.
예를 들어 위 예제에서는 media="(orientation: portrait)" 조건이 붙어 있으니까,
만약 사용자의 디바이스가 세로 방향(portrait) 이라면 surfer.jpg 이미지를 불러오게 된다.
그게 아니면 그냥 <img>의 painted-hand.jpg가 표시되는 것이다.
<img> 태그의 역할
이때 <img>는 단순히 “기본 이미지”만 담당하는 게 아니다.
역활은 아래와 같이 2가지이다.
1. 이미지의 기본 속성과 크기를 정의
(width, height, alt 등 — 화면에 어떻게 보일지 결정하는 역할)
2. 대체 이미지(fallback)
브라우저가 <source> 조건에 맞는 이미지를 못 찾거나 <picture>를 지원하지 않을 때 대신 표시된다.
<picture>를 쓰는 대표적인 이유들
1. 아트 디렉션(Art direction) — 화면 크기에 따라 다른 구도를 보여줄 수 있다.
예: 모바일에서는 단순한 이미지, 데스크탑에서는 전체 구도 이미지.
2. 이미지 포맷 대응 — 브라우저별로 지원하는 포맷이 다를 때 대체 포맷 제공.
(예: WebP, AVIF는 빠르고 용량이 작지만, 구형 브라우저에선 지원 안 될 수 있음.
3. 대역폭 절약 & 로딩 속도 향상
화면에 딱 맞는 이미지만 불러오니까 불필요한 용량 낭비가 줄어든다.
<picture> 태그 안에 들어가는 <source>는 “이 조건일 때 이 이미지를 써줘!” 라는 규칙을 브라우저에게 알려주는 역할을 하는데
어떤 속성을 사용하느냐에 따라 선택 기준이 달라진다.
아래의 예제들을 통해 알아보자!
1. media 속성 - 미디어 조건에 따라 이미지 바꾸기
media 속성은 CSS의 미디어 쿼리(media query) 처럼 작동한다.
현재 뷰포트(화면 크기, 방향 등)에 따라 특정 이미지를 보여줄지 말지를 결정한다.
<picture>
<source srcset="mdn-logo-wide.png" media="(width >= 600px)" />
<img src="mdn-logo-narrow.png" alt="MDN" />
</picture>
위 코드에서는 뷰포트 너비가 600px 이상이면 mdn-logo-wide.png가 표시되고,
그보다 작으면 <img>의 기본 이미지(mdn-logo-narrow.png)가 사용된다.
즉, 브라우저가 media 조건을 하나씩 검사하면서 “이건 맞네” 싶은 이미지를 골라서 보여주는 구조이다.
2. srcset 속성 — 해상도·크기에 따라 다른 이미지 제공
srcset은 “이 상황이면 이 이미지 써!” 라는 식으로 여러 이미지를 한 줄에 정의할 수 있는 속성이다.
콤마(,)로 구분해서, 각 이미지 뒤에 ‘설명자(descriptor)’ 를 붙인다.
예를 들어
- 300w → 너비 300px 이미지를 가르키고
- 2x → 고해상도(2배 픽셀 밀도) 이미지 가르킨다.
<picture>
<source srcset="logo.png, logo-1.5x.png 1.5x" />
<img src="logo.png" alt="MDN Web Docs logo" height="320" width="320" />
</picture>
위 코드는 일반 화면에서는 logo.png를, 고해상도(1.5x) 디스플레이에서는 logo-1.5x.png를 보여줄 수 있다.
추가로 srcset은 <picture> 안뿐 아니라 <img> 단독으로도 사용할 수 있다.
<img
srcset="logo.png, logo-2x.png 2x"
src="logo.png"
alt="MDN Web Docs logo"
width="320"
height="320"
/>
3. sizes 속성 — 뷰포트 크기에 따른 표시 영역 크기 지정
sizes는 “화면이 이만큼일 땐 이미지를 이 크기로 표시해줘” 하는 힌트를 브라우저에 주는 속성이다.
이걸 함께 써주면 브라우저가 srcset에 있는 이미지 중 어떤 걸 다운로드해야 할지 더 정확히 판단할 수 있다.
이전의 설명한 srcset 과 헷갈릴 수 있다. (나는 헷갈렸었다...)
srcset → “이미지 파일 목록 + 각각의 크기 정보”
sizes → “현재 화면에서 이 이미지가 얼만큼의 공간(픽셀)을 차지할 것 같아!” 라는 힌트
이 두가지를 합쳐서 브라우저가 판단한다.
즉 브라우저는
이 뷰포트 크기라면 이미지가 이 정도 크기로 표시되겠군 → 그럼 이 목록 중 가장 알맞은 해상도의 이미지를 골라야겠다! 라는 식으로 판단한다.
<picture>
<source
srcset="small.jpg 480w, medium.jpg 800w, large.jpg 1200w"
sizes="(max-width: 600px) 400px, 800px"
type="image/jpeg" />
<img src="fallback.jpg" alt="Example image" />
</picture>
이 코드를 브라우저에서 해석하면 아래와 같다.
1 단계. 브라우저가 sizes 평가
만약 뷰포트가 600px 이하라면,
→ 이미지는 화면에서 약 400px 정도 공간을 차지할 것
그보다 크면
→ 이미지는 약 800px 공간을 차지할 것.
즉 브라우저는 이 이미지가 화면에서 얼만큼 크기로 렌더링 될지를 파악한다.
2단계. srcset을 보고 가장 적합한 이미지 선택
small.jpg 480w, medium.jpg 800w, large.jpg 1200w
이건 각각 이미지의 실제 너비(width) 를 나타낸다.
예를 들어 뷰포트가 500px짜리 폰이라면:
- sizes에 따르면 이미지가 약 400px 영역에 표시될 예정이다.
- 만약 기기의 픽셀 비율이 2배(레티나 디스플레이)라면,
실제로 필요한 건 400px × 2 = 800px짜리 이미지 인 것이다.
그래서 브라우저는 딱 보고 medium.jpg(800w)가 제일 적당하다! 라고 판단한다.
만약 size가 없다면?
브라우저는 “이 이미지가 화면에서 어느 정도 크기로 보일지”를 모르기 때문에,
그냥 기본값(= 이미지 원본 크기) 을 기준으로 판단한다.
그래서 너무 큰 이미지를 받아오거나, 너무 작은 이미지를 늘려 쓰는 일이 생길 수 있다.
4. type 속성 — 이미지 포맷 지정
type은 이미지의 MIME 타입을 명시해서 브라우저가 지원하는 형식만 골라서 로드하도록 돕는 속성이다.
<picture>
<source srcset="photo.avif" type="image/avif" />
<source srcset="photo.webp" type="image/webp" />
<img src="photo.jpg" alt="photo" />
</picture>
이렇게 작성하면,
- 브라우저가 AVIF를 지원하면 photo.avif를
- 지원하지 않지만 WebP는 가능하면 photo.webp를
- 둘 다 안 되면 마지막 fallback인 photo.jpg를 보여준다.
즉, 최신 이미지 포맷을 우선 제공하면서도 호환성 문제 없이 안전하게 대응할 수 있는 것이다.
<picture> 태그를 공부하면서, 단순히 이미지를 출력하는 것 이상의 개념을 알게된것 같다.
이미지를 어떤 포맷으로, 어떤 크기로, 어떤 상황에서 보여줄지까지 세밀하게 제어할 수 있다는 점이 인상적이었다.
특히 media, srcset, sizes, type 속성의 조합을 보면서 브라우저가 환경에 따라 이미지를 얼마나 효율적으로 선택하는지를 알 수 있었다.
결국 이미지 최적화는 용량을 줄이는 문제를 넘어, 사용자에게 가장 적합한 이미지를 상황에 맞게 제공하는 일이라는 걸 깨달았다.
앞으로 반응형 웹이나 고해상도 디스플레이 대응 작업을 할 때 <picture> 태그를 적극적으로 활용해볼 생각이다.
이미지를 조금 더 의도적으로 보여주는 방향으로 접근하면, 웹의 품질과 사용자 경험 모두 개선될 수 있을 것이
[출처]
https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/picture
<picture>: The Picture element - HTML | MDN
To decide which URL to load, the user agent examines each 's srcset, media, and type attributes to select a compatible image that best matches the current layout and capabilities of the display device. The element serves two purposes: It describes the size
developer.mozilla.org
'공부 > Html & CSS' 카테고리의 다른 글
| Headless UI 공부하면서 정리한 것들 (0) | 2025.12.21 |
|---|---|
| Tailwind CSS, 제대로 쓰려면 알아야 할 철학과 원칙 파헤치기 (0) | 2025.12.09 |