- Bab 4 dari 7
- 30 menit
- 1 latihan kode
- 4 soal kuis
JavaScript ke CSS dan Event sebagai Perekat
Di bab ini (7 bagian)
Tujuan bab ini
- Membandingkan
element.styledanclassListuntuk mengubah tampilan, dan tahu kenapaclassListlebih baik. - Menyimpan state elemen dengan
datasetdan memakainya di selector CSS. - Mengubah CSS variables dari JavaScript dengan
setProperty. - Memakai event sebagai perekat: satu klik yang mengubah HTML dan CSS sekaligus.
Dua cara JavaScript mengubah tampilan
Kamu sudah bisa mengubah teks dan atribut lewat DOM. Sekarang koneksi keempat: JavaScript ke CSS. Ada dua jalan.
Cara 1: element.style
Nama properti CSS yang memakai tanda hubung ditulis camelCase: background-color jadi backgroundColor, font-size jadi fontSize. Nilainya string lengkap dengan satuan: "20px", bukan 20.
Yang sebenarnya terjadi: JavaScript menulis inline style ke elemen. Kalau kamu buka DevTools tab Elements, elemen itu sekarang punya atribut style="background-color: crimson; font-size: 20px; display: none;". Ingat urutan prioritas dari bab HTML ke CSS: inline mengalahkan aturan di file CSS. Jadi gaya ini sulit ditimpa nanti.
Satu jebakan lagi: el.style hanya membaca inline style, bukan gaya akhir. Kalau warna datang dari file CSS, el.style.color bernilai string kosong. Untuk membaca gaya akhir yang benar-benar dipakai, gunakan getComputedStyle(el).color.
Cara 2: classList
Saat aktif terpasang, kotak berubah dari abu-abu jadi merah dengan teks putih, dan perubahannya halus selama 0,3 detik karena transition. Saat class dilepas, kotak kembali abu-abu.
Kenapa classList lebih baik
element.style | classList | |
|---|---|---|
| Gaya ditulis di | JavaScript | CSS |
| Hasil di HTML | Atribut style inline | Atribut class |
| Mengubah 5 properti | 5 baris JS | 1 baris JS |
| Mudah ditimpa CSS | Tidak, inline menang | Ya, ikut cascade biasa |
| Ganti desain | Edit JS | Edit CSS saja |
Dengan classList, keputusan "seperti apa tampilan aktif" tetap tinggal di CSS. JavaScript cukup memutuskan kapan class itu dipasang. Ini separation of concerns dari bab pertama, diterapkan ke interaksi. element.style tetap berguna untuk nilai yang benar-benar dihitung saat itu, misalnya posisi elemen yang mengikuti kursor.
dataset untuk menyimpan state
Kadang yang mau kamu simpan bukan sekadar "aktif atau tidak", tapi nilai seperti "terbuka", "memuat", atau "habis". Atribut data-* cocok untuk ini, dan CSS bisa membacanya lewat selector atribut.
Setelah baris JS itu jalan, atribut HTML-nya berubah jadi data-status="selesai", dan teks otomatis hijau tebal. JavaScript tidak menyentuh warna sama sekali. Ingat aturan penamaannya: data-user-id di HTML dibaca dataset.userId di JS, dan nilainya selalu string. dataset.suka = true akan tersimpan sebagai "true".
CSS variables diubah lewat JavaScript
CSS variables (custom properties) adalah variabel yang didefinisikan di CSS dan bisa dipakai berulang:
Semua tombol dan judul memakai warna oranye dari --aksen. Sekarang JavaScript cukup mengganti satu nilai, dan semua yang memakainya ikut berubah:
document.documentElement adalah elemen <html>, tempat yang sama dengan :root. Setelah baris ini, tombol dan judul berubah jadi biru. Untuk custom property kamu wajib memakai setProperty, karena style.--aksen bukan sintaks JavaScript yang valid. Membacanya kembali bisa dengan getComputedStyle(document.documentElement).getPropertyValue("--aksen").
Teknik ini sering dipakai untuk fitur pilih warna tema, ukuran huruf yang bisa diatur pengguna, atau mode gelap.
Event: perekat ketiganya
Semua yang kita bahas baru berguna kalau ada pemicunya. Itulah event. Alurnya lima langkah:
- Pengguna beraksi, misalnya mengklik tombol (HTML).
- Browser membuat event
clickuntuk tombol itu. - Fungsi handler JavaScript yang terdaftar dijalankan.
- Handler mengubah DOM: teks, atribut, atau class.
- Browser menerapkan aturan CSS yang sekarang cocok, dan tampilan berubah.
Contoh lengkapnya:
Klik pertama: judul berganti teks dan jadi merah. Klik kedua: teks tetap, tapi warna kembali normal karena toggle melepas class.
Beberapa hal tentang addEventListener:
- Argumen kedua adalah fungsi, bukan hasil pemanggilan fungsi. Tulis
addEventListener("click", ubah), bukanaddEventListener("click", ubah()). Versi kedua langsung menjalankanubahsekali saat halaman dimuat. - Handler menerima event object. Isinya antara lain
event.type(nama event),event.target(elemen yang memicu),event.key(tombol keyboard, di eventkeydown), dan methodevent.preventDefault()untuk membatalkan aksi bawaan, misalnya formulir yang memuat ulang halaman saatsubmit. - Event yang sering dipakai:
click,input(isi kolom berubah),submit,keydown,scroll, danDOMContentLoaded.
Kesalahan umum
- Menulis banyak
el.style.xxxpadahal cukup satu class. Gaya jadi tersebar di JS dan sulit ditimpa. - Lupa satuan:
el.style.width = 200tidak berefek. Tulis"200px". - Menulis
classList.add(".aktif"). Nama class ditulis tanpa titik. Titik hanya dipakai di selector. - Membaca warna dari
el.style.colorlalu dapat string kosong. PakaigetComputedStyle. - Memanggil handler saat mendaftarkannya:
addEventListener("click", ubah()). - Mengira
datasetmenyimpan boolean atau angka. Semua nilainya string, jadi bandingkan dengan=== "true".
Rangkuman
element.stylemenulis inline style,classListmemasang dan melepas class. UtamakanclassListagar keputusan tampilan tetap di CSS.datasetmenyimpan state sebagai atributdata-*yang bisa dipakai selector CSS seperti[data-status="selesai"].- CSS variables diubah dengan
document.documentElement.style.setProperty("--nama", nilai), dan semua yang memakaivar(--nama)ikut berubah. - Event adalah perekat: pengguna beraksi, handler JS mengubah DOM, lalu CSS menentukan tampilan barunya.
addEventListenermenerima nama event dan fungsi, dan handler menerima event object berisitype,target, danpreventDefault().
Slide 16 sampai 17 dari deck HTML CSS JavaScript. Penjelasan lengkapnya ada di Bacaan.

Selesaikan bab ini
- 1. Baca materi
- 2. Latihan kode (1)
- 3. Kuis (4 soal)
Latihan kode: Tombol suka dengan class, dataset, dan CSS variable
Semua gaya sudah disiapkan di CSS. Tugasmu hanya JavaScript, tanpa memakai kartu.style:
- Saat
.tombol-sukadiklik, toggle classaktifdi.kartu. - Di klik yang sama, set
kartu.dataset.sukajadi"true"saat aktif dan"false"saat tidak. - Di klik yang sama, ubah teks tombol jadi
"Disukai"saat aktif dan kembali"Suka"saat tidak. - Saat
.ganti-aksendiklik, ubah--aksendi:rootjadi#1572b6dengansetProperty.
Petunjuk: classList.toggle() mengembalikan true kalau class akhirnya terpasang.
Cek pemahaman
1Kenapa `classList` lebih disarankan daripada `element.style` untuk mengubah tampilan?
2Apa warna akhir teks paragraf ini?
<style> .kotak { color: black; } .kotak.aktif { color: green; } </style> <p class="kotak">Halo</p> <script> const k = document.querySelector(".kotak"); k.classList.add("aktif"); k.classList.toggle("aktif"); k.classList.toggle("aktif"); </script>3Custom property `--aksen` bisa diubah dengan menulis `el.style.--aksen = "blue"`.
4Sebelum judul diklik, apa warna teksnya?
<style> :root { --aksen: red; } .judul { color: var(--aksen); } </style> <h1 class="judul">Halo</h1> <script> const judul = document.querySelector(".judul"); judul.addEventListener("click", () => { document.documentElement.style.setProperty("--aksen", "green"); }); document.documentElement.style.setProperty("--aksen", "blue"); </script>
