Chapter Pengenalan SVG menempatkan kode SVG di file terpisah yang dimuat lewat img. Pilihan kedua menyusul: elemen svg dapat ditulis langsung di dalam dokumen HTML, tanpa file tambahan sama sekali. Pola ini disebut inline SVG; bentuk-bentuknya menjadi bagian dari DOM halaman, sama seperti elemen p atau span. Chapter ini membahas cara menulisnya, manfaat dan kontranya, aksesibilitasnya, serta ikon nyata yang di-style lewat class.
Elemen svg di Dalam Dokumen HTML #
Elemen svg beserta isinya boleh ditulis di mana saja di dalam body. Browser menguraikan markup tersebut menjadi simpel-simpel DOM (circle, path, text) yang bisa dipilih dengan selector dan diubah dengan JavaScript. Satu perbedaan mencolok dari file mandiri: atribut xmlns boleh ditinggalkan, karena MDN mencatat atribut tersebut hanya wajib pada elemen svg terluar dalam dokumen XML; di dalam HTML, svg memang bagian dari bahasa markup halaman.
<svg class="ikon" viewBox="0 0 24 24" width="18" height="18" role="img" aria-label="Alamat">
<path d="M12 2a7 7 0 0 0-7 7c0 5.2 7 13 7 13s7-7.8 7-13a7 7 0 0 0-7-7z" fill="currentColor"/>
</svg>Mari kita perhatikan bagiannya:
viewBox="0 0 24 24": koordinat internal 24x24 unit, ukuran lazim untuk set ikon.widthdanheight: ukuran tampil ikon 18x18 piksel; rasio keduanya sejajar denganviewBoxagar bentuk tidak terpenjaskan.role="img"denganaria-label: menyatakan keseluruhansvgsebagai satu gambar bernama “Alamat” bagi assistive technology.fill="currentColor": warna bentuk mengikuti properti CSScolorpada elemen tersebut, membuka pintu styling lewat class.
Manfaat dan Kontra Inline SVG #
Perbandingan dengan pola file terpisah memetakan keputusan desain kita:
| Aspek | Inline SVG | SVG lewat img |
|---|---|---|
| Permintaan jaringan | Tanpa permintaan tambahan | Satu permintaan per file |
| Cache | Ikut dokumen, tidak ter-cache terpisah | File terpisah, ter-cache antarhalaman |
| Styling CSS halaman | Penuh: class, :hover, currentColor | CSS halaman tidak menjangkau isinya |
| Akses DOM | Setiap bentuk menjadi elemen DOM | Isi tidak terekspos ke JavaScript |
| Script di dalam SVG | Dijalankan di halaman | Tidak dijalankan |
| Bobot dokumen | Menambah ukuran HTML | HTML tetap ringkas |
Manfaat terbesarnya ada pada styling dan interaksi: satu class CSS dapat mengubah warna ikon, dan state seperti :hover bekerja tanpa JavaScript. Kontranya dua sisi: markup panjang ikut menumpuk dokumen HTML, dan ikon yang dipakai di sepuluh halaman tidak ter-cache sebagai file terpisah.
Memberi Nama bagi Inline SVG #
Inline SVG terekspos ke accessibility tree, sehingga pembaca layar menemukan simpel-simpel bentuknya. Tanpa nama, isi tampil sebagai kumpulan grafik tanpa makna. Praktik yang diandalkan: beri role="img" pada elemen svg lalu pasang satu nama lewat aria-label, atau rujuk elemen title dan desc di dalam SVG lewat aria-labelledby seperti pada chapter Penggunaan ARIA:
<svg viewBox="0 0 24 24" role="img" aria-labelledby="judul-ikon ket-ikon">
<title id="judul-ikon">Ikon lokasi</title>
<desc id="ket-ikon">Pin menandai alamat toko pada peta.</desc>
<path d="..." fill="currentColor"/>
</svg>title memberi nama singkat, sedangkan desc menampung penjelasan lebih panjang; keduanya dibaca sesuai urutan pada aria-labelledby. Untuk ikon dekoratif yang tidak membawa informasi, biarkan svg tanpa nama dan tutup aksesibilitasnya dengan aria-hidden="true".
Contoh Lengkap: Ikon dengan Styling Class #
File berikut merangkai pola di atas: dua ikon yang berbagi class .ikon, warna dari CSS, dan perubahan warna saat kursor menyentuh kartu:
<!doctype html>
<html lang="id">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Kartu Kontak Toko</title>
<style>
.ikon {
color: #1a6b54;
vertical-align: -3px;
}
.kartu:hover .ikon {
color: #0f4c3a;
}
</style>
</head>
<body>
<h1>Kartu Kontak Toko</h1>
<p class="kartu">
<svg class="ikon" viewBox="0 0 24 24" width="18" height="18" role="img" aria-label="Alamat">
<path d="M12 2a7 7 0 0 0-7 7c0 5.2 7 13 7 13s7-7.8 7-13a7 7 0 0 0-7-7zm0 9.5a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5z" fill="currentColor"/>
</svg>
Jl. Melati No. 10, Bandung
</p>
<p class="kartu">
<svg class="ikon" viewBox="0 0 24 24" width="18" height="18" role="img" aria-label="Jam buka">
<circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="2"/>
<path d="M12 6v6l4 2" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>
Buka 08.00-16.00 WIB
</p>
</body>
</html>Output yang Dihasilkan:
Jendela browser menampilkan:
- Judul "Kartu Kontak Toko"
- Baris ikon pin hijau diikuti "Jl. Melati No. 10, Bandung"
- Baris ikon jam hijau diikuti "Buka 08.00-16.00 WIB"
- Saat kursor menyentuh salah satu baris, ikon pada baris itu menjadi hijau lebih gelapMari kita bedah kuncinya:
- Baris 7-15 (blok
style): class.ikonmenetapkancolorhijau; karena bentuk memakaicurrentColor, warna mengalir dari CSS ke dalam ikon tanpa menyentuh markup. - Baris 12-14 (
:hover): saat kursor berada di atasp.kartu, warna.ikonberganti gelap; perubahan ini mustahil dari CSS halaman bila ikon dimuat lewatimg. - Baris 20-22 (
svgpin): satupathmembentuk pin;role="img"danaria-label="Alamat"memberinya nama. - Baris 26-29 (
svgjam): lingkaran sebagai papan jam dan duapathsebagai jarum; kedua bentuk memakaicurrentColorpadafillmaupunstroke. - Baris 19 dan 25 (
p class="kartu"): dua kartu berbagi class yang sama, sehingga satu aturan CSS melayani keduanya; inilah untung ikon yang hidup di dalam DOM.
Ikon di atas tampil tanpa satu permintaan gambar pun, tetapi markupnya ikut menumpuk dokumen. Untuk gambar yang dipakai lintas halaman atau berasal dari pihak ketiga, pola file terpisah kembali menjadi pilihan; chapter berikutnya membahasnya dari sisi caching dan keamanan.
Referensi resmi untuk pendalaman:
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
ikon-inline.html
Unduh berkas<!doctype html>
<html lang="id">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Kartu Kontak Toko</title>
<style>
.ikon {
color: #1a6b54;
vertical-align: -3px;
}
.kartu:hover .ikon {
color: #0f4c3a;
}
</style>
</head>
<body>
<h1>Kartu Kontak Toko</h1>
<p class="kartu">
<svg class="ikon" viewBox="0 0 24 24" width="18" height="18" role="img" aria-label="Alamat">
<path d="M12 2a7 7 0 0 0-7 7c0 5.2 7 13 7 13s7-7.8 7-13a7 7 0 0 0-7-7zm0 9.5a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5z" fill="currentColor"/>
</svg>
Jl. Melati No. 10, Bandung
</p>
<p class="kartu">
<svg class="ikon" viewBox="0 0 24 24" width="18" height="18" role="img" aria-label="Jam buka">
<circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="2"/>
<path d="M12 6v6l4 2" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>
Buka 08.00-16.00 WIB
</p>
</body>
</html>