Elemen <picture>
tidak merender apa pun dengan sendirinya,<img>
bagian dalam,<picture>
mengikuti preseden yang sudah ditetapkan oleh elemen <audio>
dan <video>
: elemen wrapper
yang berisi elemen <source>
individual.
<picture>
<source …>
<source …>
<img …>
</picture …>
<img>
bagian dalam tersebut juga memberi Anda pola penggantian yang andal untuk browser lama tanpa dukungan untuk gambar responsif:
jika elemen <picture>
tidak dikenali oleh browser pengguna,<source>
kemudian juga dihapus,<video>
atau <audio>
.<img>
bagian dalam akan dikenali oleh browser apa pun,src
-nya akan dirender seperti yang diharapkan.
"Pengarahan seni" gambar dengan <picture>
Membuat perubahan pada konten atau rasio aspek gambar berdasarkan ukuran gambar di halaman biasanya disebut sebagai "pengarahan seni"
gambar responsif.srcset
dan sizes
didesain untuk bekerja secara tidak terlihat dan menukar sumber dengan lancar sesuai perintah browser pengguna.
Namun,
Subject dari sumber gambar ini sama,
"Pemangkasan" semacam itu dapat dicapai melalui CSS,
Setiap elemen source
memiliki atribut yang menentukan kondisi untuk pemilihan source
tersebut: media
,type
,<source>
pertama dalam sumber
agar cocok dengan konteks penjelajahan pengguna saat ini dipilih,srcset
di source
tersebut
akan digunakan untuk menentukan
kandidat yang tepat untuk konteks tersebut.source
pertama dengan atribut media
yang cocok dengan ukuran area pandang pengguna adalah yang dipilih:
<picture>
<source media="(min-width: 1200px)" srcset="wide-crop.jpg" >
<img src="close-crop.jpg" alt="…">
</picture>
Anda harus selalu menentukan img
bagian dalam di akhir urutan—jika tidak ada elemen source
yang cocok dengan media
atau type
gambar,min-width
kueri media,max-width
,
<picture>
<source media="(max-width: 400px)" srcset="mid-bp.jpg" >
<source media="(max-width: 800px)" srcset="high-bp.jpg" >
<img src="highest-bp.jpg" alt="…">
</picture>
Jika sumber dipilih berdasarkan kriteria yang Anda tentukan,srcset
di source
akan diteruskan ke
<img>
seolah-olah telah ditentukan di <img>
itu sendiri—yang berarti Anda bebas menggunakan sizes
untuk mengoptimalkan gambar yang ditujukan untuk seni
serta sumber data.
<picture>
<source media="(min-width: 800px)" srcset="high-bp-1600.jpg 1600w, high-bp-1000.jpg 1000w" >
<source srcset="lower-bp-1200.jpg 1200w, lower-bp-800.jpg 800w" >
<img src="fallback.jpg" alt="…" sizes="calc(100vw - 2em)" >
</picture>
Tentu saja,<source>
yang dipilih akan menimbulkan masalah performa:
<img>
hanya mendukung satu atribut width
dan height
,height
dan width
pada elemen <source>
.<img>
,<source>
apa pun yang dipilih.
<picture>
<source
media="(min-width: 800px)"
srcset="high-bp-1600.jpg 1600w, high-bp-1000.jpg 1000w"
width="1600"
height="800">
<img src="fallback.jpg"
srcset="lower-bp-1200.jpg 1200w, lower-bp-800.jpg 800w"
sizes="calc(100vw - 2em)"
width="1200"
height="750"
alt="…">
</picture>
Penting untuk diperhatikan bahwa art arah dapat digunakan untuk lebih dari sekadar keputusan berdasarkan ukuran area pandang—dan seharusnya,srcset
/sizes
.
<picture>
<source media="(prefers-color-scheme: dark)" srcset="hero-dark.jpg" >
<img srcset="hero-light.jpg" >
</picture>
Atribut type
Atribut type
memungkinkan Anda menggunakan mesin pembuat keputusan permintaan tunggal elemen <picture>
agar hanya menayangkan format gambar
ke browser yang mendukungnya.
Seperti yang Anda pelajari di Format dan Kompresi Gambar,
Sebelum elemen <picture>
diperkenalkan,
<img src="image.webp"
data-fallback="image.jpg"
onerror="this. src=this. getAttribute('data-fallback'); this. onerror=null;"
alt="..." >
Dengan pola ini,image.
akan tetap dibuat di setiap browser,onerror
,data-fallback
ke dalam src
.
Elemen <picture>
secara eksplisit dirancang untuk menghindari permintaan yang berlebihan.type
memperingatkan browser tentang sumber
penyandian data sejak awal,
Dalam atribut type
,srcset
dari setiap <source>
.source
tersebut dapat didekode tanpa membuat
tambahan—jika jenis media tidak dikenali,<source>
dan semua kandidatnya akan diabaikan,
<picture>
<source type="image/webp" srcset="pic.webp" >
<img src="pic.jpg" alt="..." >
</picture>
Di sini,image/
yang ditentukan dalam atribut type
dari elemen <source>
,<source>
tersebut,srcset
—menginstruksikan
<img>
untuk meminta,pic.
.source
,<img>
akan merender konten src
seperti yang telah dilakukannya sejak 1992.<source>
kedua dengan type="image/
di sini—Anda dapat mengasumsikan dukungan universal untuk JPEG.
Terlepas dari konteks penjelajahan pengguna,picture
—tanpa JavaScript,<img>
.
Masa depan gambar responsif
Semua pola markup yang dibahas di sini merupakan peningkatan berat dalam hal standardisasi: mengubah fungsi
sesuatu yang sudah mapan dan penting bagi web seperti <img>
bukanlah hal kecil,
Semua solusi ini bergantung pada markup,sizes
memang sulit digunakan.
Namun,<img>
dengan atribut loading="lazy"
tidak diminta hingga tata letak halaman diketahui,sizes="auto"
telah diusulkan sebagai tambahan untuk spesifikasi HTML
untuk menghindari pekerjaan atribut sizes
yang ditulis secara manual dalam kasus ini.
Ada juga beberapa tambahan pada elemen <picture>
di cakrawala,
Meskipun sintaksis kueri container baru saja distabilkan—dan dukungan browser sangat terbatas,<picture>
dengan
melakukan hal yang sama: atribut container
potensial yang memungkinkan kriteria pemilihan <source>
berdasarkan
ruang yang ditempati <img>
elemen <picture>
,
Jika kedengarannya sedikit tidak jelas,
Meskipun markup gambar responsif menjanjikan akan lebih mudah digunakan dari waktu ke waktu,