menengahdomcssMenengah3 mnt baca

DOM: Class & Style

Mengubah tampilan elemen dengan dua pendekatan: classList (add, remove, toggle, contains) untuk perubahan yang rapi via CSS, dan properti style langsung untuk nilai dinamis. Termasuk kapan memilih yang mana.

Dua Cara Mengubah Tampilan

Ada dua pendekatan mengubah tampilan dari JS: lewat class CSS (classList) atau langsung ke properti style (el.style). Keduanya sah, tapi dipakai untuk kebutuhan berbeda. Aturan umumnya: kalau perubahannya kompleks atau dipakai ulang, taruh di class CSS; kalau nilainya dihitung saat runtime (posisi drag, lebar progress bar), pakai style langsung.

classList: Cara yang Rapi

javascript
const box = document.getElementById("kotak");
box.classList.add("aktif");      // tambah class
box.classList.add("a", "b");     // bisa banyak sekaligus
box.classList.remove("aktif");   // hapus class
box.classList.toggle("aktif");   // ada -> hapus, tidak ada -> tambah
box.classList.contains("aktif"); // true/false, untuk pengecekan
box.classList.replace("lama", "baru"); // ganti class

toggle mengembalikan boolean status barunya, berguna untuk logika lanjutan. Contoh sederhana memakai playground modul ini (ada <p id="teks"> dan class .aktif di CSS):

javascript
const teks = document.getElementById("teks");
teks.classList.add("aktif");
console.log("Punya class aktif?", teks.classList.contains("aktif")); // true

Contoh realistis: dark mode satu baris plus menu buka/tutup.

javascript
// Dark mode: cukup toggle class di <body>, CSS yang urus sisanya
document.getElementById("btnTema").addEventListener("click", () => {
  const gelap = document.body.classList.toggle("dark");
  console.log(gelap ? "Mode gelap aktif" : "Mode terang aktif");
});

// Accordion FAQ: klik pertanyaan -> jawabannya mengembang
document.querySelectorAll(".faq-tanya").forEach(btn => {
  btn.addEventListener("click", () => {
    btn.parentElement.classList.toggle("buka");
  });
});

Dengan class, semua detail visual (warna, transisi, animasi) tetap di CSS tempatnya yang semestinya. JS hanya mengatur STATUS.

style Langsung: Untuk Nilai Dinamis

javascript
box.style.color = "red";
box.style.backgroundColor = "yellow"; // camelCase, bukan background-color!
box.style.fontSize = "24px";          // satuan wajib ditulis (kecuali 0)
box.style.display = "none";           // sembunyikan elemen

Properti CSS yang memakai strip berubah menjadi camelCase di JS: background-color jadi backgroundColor, font-size jadi fontSize. Contoh realistis: progress bar yang lebarnya dihitung dari data.

javascript
function setProgress(persen) {
  const bar = document.getElementById("bar");
  const aman = Math.min(Math.max(persen, 0), 100); // clamp 0-100
  bar.style.width = aman + "%";
  bar.textContent = aman + "%";
}
setProgress(73);

Nilai 73% tidak mungkin ditulis sebagai class statis untuk setiap kemungkinan persen, inilah wilayahnya style langsung.

Mana yang Dipilih?

SituasiPilih
Perubahan banyak properti sekaligusclass
Status on/off (aktif, buka, gelap)toggle + class
Nilai dihitung runtime (posisi, lebar)style langsung
Animasiclass + CSS transition

Contoh gabungan yang realistis: validasi input dengan status visual.

javascript
const input = document.getElementById("nama");
input.addEventListener("input", () => {
  const valid = input.value.trim().length >= 3;
  input.classList.toggle("error", valid === false); // toggle dengan paksa!
  input.classList.toggle("ok", valid);
});

toggle punya parameter kedua opsional: toggle("error", kondisi) memaksa tambah jika kondisi true, hapus jika false. Sangat rapi untuk status validasi.

Jebakan Umum

  • Mengatur el.style menimpa inline style dan menang atas class CSS (spesifisitas tinggi). Jangan heran kalau class tidak mempan setelah style diset langsung.
  • Lupa satuan: box.style.width = 100 tidak jalan, harus "100px" atau "100%".
  • Mengubah style tiap frame dari JS untuk animasi membuat layout thrashing. Ubah class sekali, biarkan CSS transition yang menganimasikan.
  • classList tidak bisa dipakai untuk mengatur BANYAK class via string berspasi: add("a b") error, harus add("a", "b").

Ringkasan

Gunakan classList (add/remove/toggle/contains) untuk perubahan status dan tampilan kompleks, biarkan CSS yang bekerja. Gunakan el.style (camelCase!) hanya untuk nilai dinamis hasil perhitungan. Prinsipnya: JS mengatur STATUS dan ANGKA, CSS mengatur TAMPILAN.

Live Playground
export default function App(): JSX.Element {
  return <h1>Hello world</h1>
}

Edit kode di kiri, preview kanan ter-update otomatis.

Tantangan

Toggle Sorot

Ada p#teks di playground. Buat fungsi toggleSorot() yang men-toggle class "aktif" pada #teks. Panggil 2 kali dan log hasilnya tiap kali. Pola toggle class adalah jantung fitur dark mode, menu mobile, dan accordion FAQ di website nyata: satu baris JS mengubah status, CSS mengurus seluruh tampilannya.

<!doctype html>
<html>
<head>
<meta charset="utf-8" />

</head>
<body>
<h1>Halo JS</h1>
<p>Buka console preview untuk melihat output.</p>
<script src="index.js"></script>
</body>
</html>