HTML5 dan CSS3

Belum masuk. Progresmu tidak tersimpan.

Masuk
  • Bab 4 dari 10
  • 30 menit
  • 1 latihan kode
  • 4 soal kuis

Multimedia dan Web API HTML5

Di bab ini (9 bagian)
  1. Tujuan
  2. Multimedia tanpa plugin
  3. iframe: jendela ke halaman lain
  4. canvas: kertas gambar untuk JavaScript
  5. Web Storage: memori kecil di browser
  6. Geolocation: lokasi dengan izin
  7. Drag and drop sekilas
  8. Kesalahan umum
  9. Rangkuman

Tujuan bab ini

  • Memutar audio dan video dengan <audio>, <video>, controls, dan <source>, lengkap dengan subtitle lewat <track>.
  • Menyematkan halaman lain dengan <iframe> dan menggambar sederhana di <canvas>.
  • Memakai Web Storage (localStorage dan sessionStorage) untuk menyimpan data kecil di browser.
  • Mengenal Geolocation API beserta izinnya, dan drag and drop secara sekilas.

Multimedia tanpa plugin

Dulu, memutar video di web butuh plugin seperti Flash. Plugin itu berat, sering crash, dan punya banyak celah keamanan. HTML5 menyelesaikannya dengan elemen <audio> dan <video> yang dipahami browser secara langsung.

<video controls width="400" poster="sampul.jpg">
  <source src="tutorial.webm" type="video/webm">
  <source src="tutorial.mp4" type="video/mp4">
  <track src="subtitle-id.vtt" kind="subtitles" srclang="id" label="Indonesia" default>
  Browsermu belum mendukung video HTML5.
</video>

Hasilnya: kotak video selebar 400px yang menampilkan gambar sampul.jpg sebelum diputar, dengan tombol play, volume, timeline, layar penuh, dan menu subtitle bawaan browser.

Contoh kode video dan canvas serta daftar Web API HTML5

Mari bedah:

  • controls adalah atribut boolean yang memunculkan tombol pemutar. Tanpa controls, video tampil tapi pengguna tidak bisa mengaturnya, kecuali kamu membuat tombol sendiri dengan JavaScript.
  • <source> boleh lebih dari satu. Browser mencoba dari atas ke bawah dan memakai format pertama yang bisa ia putar. Atribut type membantu browser melewati format yang tidak didukung tanpa harus mengunduhnya dulu.
  • <track> menambahkan subtitle atau caption dari file WebVTT (.vtt). kind="subtitles" untuk terjemahan, kind="captions" untuk transkrip termasuk suara latar seperti "[musik]". srclang berisi kode bahasa, label adalah nama di menu, dan default mengaktifkannya sejak awal.
  • Teks di dalam <video> hanya muncul di browser yang sangat lama.

Isi file .vtt sederhananya seperti ini:

WEBVTT

00:00:01.000 --> 00:00:04.000
Halo, selamat datang di tutorial ini.

<audio> bekerja dengan cara yang sama, hanya tanpa gambar:

<audio controls>
  <source src="podcast.mp3" type="audio/mpeg">
</audio>

Atribut lain yang berguna: autoplay, loop, muted, dan preload. Perlu diingat, browser modern memblokir autoplay yang bersuara. Video autoplay biasanya hanya boleh jalan kalau juga muted.

iframe: jendela ke halaman lain

<iframe> menyematkan halaman web lain di dalam halamanmu. Contoh klasiknya adalah video YouTube atau peta.

<iframe src="https://www.youtube.com/embed/ID_VIDEO" width="560" height="315"
  title="Video tutorial seduh kopi" loading="lazy" allowfullscreen></iframe>

Beri title agar screen reader tahu isi iframe, dan loading="lazy" agar iframe baru dimuat saat hampir terlihat. Atribut sandbox bisa membatasi apa yang boleh dilakukan halaman di dalamnya. Latihan kode di Ruang Materi pun berjalan di iframe ber-sandbox.

canvas: kertas gambar untuk JavaScript

<canvas> adalah area kosong berukuran piksel. HTML-nya hanya menyediakan tempat, gambarnya dibuat oleh JavaScript.

<canvas id="grafik" width="300" height="150"></canvas>
<script>
  const ctx = document.querySelector("#grafik").getContext("2d");
  ctx.fillStyle = "seagreen";
  ctx.fillRect(20, 20, 100, 60);
</script>

Hasilnya: persegi panjang hijau 100 x 60 piksel, berjarak 20 piksel dari kiri dan atas. Canvas dipakai untuk grafik, game, dan editor gambar. Untuk ikon atau logo yang harus tajam di semua ukuran, pilih <svg> karena berbasis vektor.

Web Storage: memori kecil di browser

Web Storage menyimpan pasangan kunci dan nilai berupa teks di browser pengguna. Ada dua jenis:

localStoragesessionStorage
Bertahan sampaiDihapus manual atau oleh penggunaTab ditutup
Dibagi antar tabYa, untuk situs yang samaTidak, per tab
Cocok untukTema gelap, isi keranjang, draftLangkah form sementara

Cara pakainya sama:

localStorage.setItem("tema", "gelap");
localStorage.getItem("tema");       // "gelap"
localStorage.getItem("tidakAda");   // null
localStorage.removeItem("tema");

Hal yang sering menjebak:

  1. Semua nilai disimpan sebagai teks. setItem("skor", 5) menyimpan "5". Ubah kembali dengan Number(...), dan untuk objek pakai JSON.stringify saat menyimpan serta JSON.parse saat membaca.
  2. Kapasitasnya kecil, umumnya sekitar 5 MB per situs.
  3. Jangan simpan rahasia seperti password atau token sensitif. Semua JavaScript di halaman itu bisa membacanya.
  4. Storage bisa ditolak. Di mode privat tertentu, saat pengguna memblokir data situs, atau di dalam iframe sandbox, mengakses localStorage bisa melempar error. Bungkus dengan try...catch supaya halaman tetap jalan.

Contoh kecil yang aman, penghitung kunjungan yang tetap jalan walaupun storage diblokir:

let kunjungan = 0;
try {
  kunjungan = Number(localStorage.getItem("kunjungan")) || 0;
  localStorage.setItem("kunjungan", String(kunjungan + 1));
} catch (e) {
  // storage ditolak, tetap lanjut dengan nilai 0
}

Number(null) menghasilkan 0, jadi kunjungan pertama aman. Operator || 0 menjaga dari nilai rusak yang menghasilkan NaN.

Geolocation: lokasi dengan izin

Geolocation API memberi koordinat pengguna, tapi selalu meminta izin lewat popup browser, dan hanya tersedia di halaman HTTPS (atau localhost).

navigator.geolocation.getCurrentPosition(
  (pos) => console.log(pos.coords.latitude, pos.coords.longitude),
  (err) => console.log("Lokasi tidak didapat:", err.message)
);

Fungsi pertama dipanggil kalau berhasil, fungsi kedua kalau pengguna menolak atau lokasi tidak tersedia. Selalu siapkan jalan keluar, misalnya kolom untuk mengetik kota secara manual. Minta izin tepat saat dibutuhkan, misalnya setelah tombol "Cari toko terdekat" diklik, bukan begitu halaman dibuka.

Drag and drop sekilas

Elemen bisa dibuat bisa diseret dengan atribut draggable="true". Alurnya: event dragstart di elemen yang diseret menyimpan data, dragover di area tujuan memanggil event.preventDefault() agar elemen boleh dijatuhkan di sana, lalu drop membaca data dan memindahkan elemen. Pola ini dipakai di papan tugas ala kanban dan area upload file.

Kesalahan umum

  • Lupa controls sehingga video tampil tapi tidak bisa diputar.
  • Hanya satu format video tanpa cadangan, atau type yang salah.
  • Mengharapkan autoplay bersuara padahal browser memblokirnya.
  • Lupa bahwa nilai storage berupa teks, akhirnya "1" + 1 menghasilkan "11".
  • Mengakses localStorage tanpa try...catch sehingga seluruh skrip berhenti di lingkungan yang memblokir storage.
  • Meminta izin lokasi saat halaman baru dibuka. Pengguna cenderung menolak permintaan yang tidak jelas alasannya.

Rangkuman

  • <audio> dan <video> memutar media tanpa plugin. controls memunculkan tombol, <source> memberi format cadangan, <track> menambahkan subtitle WebVTT.
  • <iframe> menyematkan halaman lain, <canvas> menjadi area gambar yang dikendalikan JavaScript.
  • localStorage bertahan lama, sessionStorage hilang saat tab ditutup. Keduanya menyimpan teks dan bisa ditolak, jadi pakai try...catch.
  • Geolocation selalu butuh izin pengguna dan HTTPS. Drag and drop memakai draggable, dragstart, dragover, dan drop.

Selesaikan bab ini

  1. 1. Baca materi
  2. 2. Latihan kode (1)
  3. 3. Kuis (4 soal)

Latihan kode: Pemutar video dengan tombol suka

Lengkapi halaman tutorial ini:

  • <video> diberi atribut controls, dan <source>-nya diberi type="video/mp4".
  • Tambahkan <track> di dalam video dengan src="subtitle-id.vtt", kind="subtitles", srclang="id", dan label="Indonesia".
  • Di JavaScript, tombol #suka menambah angka di #jumlah sebesar 1 setiap diklik dan menyimpannya ke localStorage dengan kunci "suka". Baca nilai awalnya dari localStorage juga.
  • Bungkus semua akses localStorage dengan try...catch. Latihan ini berjalan di iframe sandbox yang memblokir storage, jadi tanpa itu skripmu langsung error.
  • Gambar persegi berwarna apa saja di canvas #logo dengan getContext("2d") dan fillRect.

Cek pemahaman

  1. 1Apa gunanya menulis beberapa `<source>` di dalam satu `<video>`?

  2. 2Teks apa yang tampil di elemen `#hasil`?

    <p id="hasil"></p>
    <script>
      sessionStorage.setItem("skor", 5);
      const s = sessionStorage.getItem("skor") + 1;
      document.querySelector("#hasil").textContent = s;
    </script>
  3. 3Geolocation API bisa membaca lokasi pengguna tanpa meminta izin, asalkan halamannya memakai HTTPS.

  4. 4Atribut apa yang membuat tombol play, volume, dan timeline bawaan muncul di `<video>`?