HTML5 dan CSS3

Belum masuk. Progresmu tidak tersimpan.

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

Responsive, Variabel CSS, dan Praktik Terbaik

Di bab ini (10 bagian)
  1. Tujuan
  2. Responsive design dan mobile-first
  3. Meta viewport dulu
  4. Media queries dengan min-width
  5. CSS custom properties
  6. calc, clamp, min, max
  7. filter, mix-blend-mode, clip-path
  8. Praktik terbaik
  9. Kesalahan umum
  10. Rangkuman

Tujuan bab ini

  • Membangun halaman responsif dengan pendekatan mobile-first, meta viewport, dan media query min-width.
  • Memakai CSS custom properties (--nama, var()) untuk tema, termasuk tema gelap.
  • Menghitung ukuran dinamis dengan calc(), clamp(), min(), max(), dan mengenal filter, mix-blend-mode, serta clip-path.
  • Menerapkan praktik terbaik HTML5 dan CSS3: semantik, kontras, penamaan BEM, dan menghindari !important.

Responsive design dan mobile-first

Lebih dari separuh kunjungan web di Indonesia datang dari HP. Responsive design artinya satu halaman yang sama menyesuaikan diri dengan lebar layar apa pun, tanpa membuat versi terpisah untuk HP dan laptop.

Mobile-first artinya kamu menulis gaya untuk layar kecil lebih dulu sebagai gaya dasar, lalu menambah aturan untuk layar yang lebih besar. Alasannya praktis: tampilan HP biasanya lebih sederhana (satu kolom), jadi lebih mudah dikembangkan ke tiga kolom daripada memangkas tiga kolom jadi satu. HP juga tidak perlu memproses aturan desktop yang lalu dibatalkan.

Meta viewport dulu

Sebelum media query bekerja dengan benar di HP, pasang tag ini di <head>:

<meta name="viewport" content="width=device-width, initial-scale=1">

Tanpa tag ini, browser HP berpura-pura layarnya selebar sekitar 980px lalu mengecilkan seluruh halaman. Hasilnya tulisan mungil dan media query untuk HP tidak pernah aktif. width=device-width menyuruh browser memakai lebar asli perangkat.

Media queries dengan min-width

.container { width: 100%; padding: 16px; }

@media (min-width: 768px) {
  .container { width: 750px; margin: 0 auto; }
}

@media (min-width: 1024px) {
  .container { width: 980px; }
}

Baca dari atas: semua layar mendapat lebar 100%. Kalau lebar viewport minimal 768px, aturan kedua ikut berlaku dan menimpa. Kalau minimal 1024px, aturan ketiga menimpa lagi. Karena min-width, urutan di file harus dari kecil ke besar.

RentangKategori kasar
di bawah 768pxHP
768px sampai 1023pxtablet
1024px ke ataslaptop dan desktop

Breakpoint ini hanya patokan. Breakpoint terbaik dipilih saat konten mulai terlihat jelek, bukan berdasarkan merek perangkat. Ingat juga: gambar perlu max-width: 100%; height: auto; agar tidak meluber dari layar kecil.

CSS custom properties

Custom property (sering disebut CSS variable) adalah nilai bernama yang kamu definisikan sekali lalu pakai di banyak tempat.

:root {
  --warna-utama: #1572b6;
  --jarak: 16px;
  --radius: 8px;
}

.kartu {
  color: var(--warna-utama);
  padding: var(--jarak);
  border-radius: var(--radius);
}

Namanya wajib diawali dua tanda hubung dan peka huruf besar kecil. :root adalah elemen html, jadi variabel di sana bisa dipakai seluruh halaman. var() juga menerima nilai cadangan: var(--bayangan, none) dipakai bila --bayangan tidak didefinisikan.

Bedanya dengan variabel Sass: custom property hidup di browser dan ikut cascade. Artinya kamu bisa menimpanya di elemen tertentu, dan semua yang memakai variabel itu ikut berubah secara real-time. Inilah dasar tema gelap:

:root {
  --bg: #ffffff;
  --teks: #1a1a1a;
}
.gelap {
  --bg: #121212;
  --teks: #f0f0f0;
}
body {
  background: var(--bg);
  color: var(--teks);
}
@media (prefers-color-scheme: dark) {
  :root { --bg: #121212; --teks: #f0f0f0; }
}

Tambahkan class gelap ke <html> lewat JavaScript, atau biarkan media query prefers-color-scheme mengikuti setelan sistem. Kamu tidak perlu menulis ulang aturan body, cukup ganti nilai variabelnya.

calc, clamp, min, max

Fungsi CSS calc, clamp, min, max

.konten { width: calc(100% - 40px); }
h1      { font-size: clamp(1.5rem, 4vw, 3rem); }
.box    { width: min(90%, 600px); }
.banner { height: max(200px, 20vh); }
  • calc() mencampur satuan berbeda. Contoh di atas: lebar penuh induk dikurangi 40px. Operator + dan - wajib diapit spasi, calc(100%-40px) tidak valid.
  • clamp(min, ideal, max) memakai nilai ideal, tapi tidak pernah di bawah min atau di atas max. Judul di atas ikut membesar dengan lebar layar, tapi tetap antara 24px dan 48px. Satu baris ini menggantikan beberapa media query.
  • min() mengambil nilai terkecil. min(90%, 600px) berarti "90% dari induk, tapi maksimal 600px".
  • max() mengambil nilai terbesar. max(200px, 20vh) berarti "minimal 200px".

Semua fungsi ini bisa bersarang dan menerima custom property, misalnya calc(var(--jarak) * 2).

filter, mix-blend-mode, clip-path

Tiga properti ini untuk efek visual tanpa perlu edit gambar di aplikasi lain:

.foto-lama  { filter: grayscale(100%) blur(2px); }
.teks-hero  { mix-blend-mode: multiply; }
.avatar     { clip-path: circle(50%); }
.panah      { clip-path: polygon(0 0, 100% 50%, 0 100%); }
  • filter menerapkan efek ke elemen: blur(), grayscale(), brightness(), contrast(), saturate(), drop-shadow(). Saudaranya, backdrop-filter, memburamkan area di belakang elemen untuk efek kaca.
  • mix-blend-mode mencampur warna elemen dengan lapisan di belakangnya, seperti mode layer di aplikasi edit foto: multiply menggelapkan, screen mencerahkan.
  • clip-path memotong elemen menjadi bentuk tertentu. Bagian di luar bentuk tidak terlihat dan tidak bisa diklik.

Praktik terbaik

  • Semantik dulu. Pakai <header>, <nav>, <main>, <article>, <button> sesuai maknanya. Pembaca layar dan mesin pencari memahami halamanmu dari tag ini.
  • Kontras cukup. Teks normal butuh rasio kontras minimal 4.5:1 terhadap latarnya (standar WCAG AA). Abu-abu muda di atas putih sering gagal.
  • Penamaan BEM ringkas. Block, Element, Modifier: .kartu, .kartu__judul, .kartu--sorot. Class jadi jelas asal-usulnya dan specificity tetap rendah karena semua cukup satu class.
  • Hindari !important. Ia mengalahkan specificity normal, sehingga aturan berikutnya juga butuh !important, dan perang dimulai. Kalau gaya tidak berlaku, cek dulu specificity dan urutan aturan di DevTools.
  • Satuan konsisten, rem untuk teks dan jarak, variabel untuk warna dan spasi, serta animasi yang ringan.

Kesalahan umum

  • Lupa meta viewport, sehingga media query untuk HP tidak pernah aktif di perangkat asli.
  • Menulis media query min-width dari besar ke kecil, sehingga aturan kecil menimpa aturan besar.
  • Menulis calc(100%-40px) tanpa spasi di sekitar tanda minus.
  • Menulis var(warna-utama) tanpa dua tanda hubung.
  • Menambal masalah specificity dengan !important di mana-mana.

Rangkuman

  • Mobile-first: gaya dasar untuk HP, lalu tambah lewat @media (min-width: ...) dari kecil ke besar.
  • Meta viewport wajib agar HP memakai lebar aslinya.
  • Custom property --nama dibaca dengan var(), ikut cascade, dan memudahkan tema gelap.
  • calc, clamp, min, max membuat ukuran fluid dengan lebih sedikit breakpoint.
  • filter, mix-blend-mode, dan clip-path memberi efek visual langsung di CSS.
  • HTML5 memberi struktur dan makna, CSS3 memberi tampilan, layout, gerakan, dan adaptasi. Keduanya paling kuat bila semantik, kontras, penamaan rapi, dan specificity rendah dijaga sejak awal.

Selesaikan bab ini

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

Latihan kode: Tema dengan variabel dan ukuran fluid

Rapikan gaya halaman dengan custom property dan fungsi CSS:

  • Di :root buat --warna-utama: #1572b6, --jarak: 16px, --bg: #ffffff, dan --teks: #1a1a1a.
  • .kartu: color: var(--warna-utama) dan padding: var(--jarak).
  • .panel: background: var(--bg) dan color: var(--teks).
  • .tema-gelap cukup menimpa variabel: --bg: #121212 dan --teks: #f0f0f0.
  • .konten: width: calc(100% - 40px) (wadahnya 400px).
  • .judul: font-size: clamp(1.5rem, 4vw, 3rem).

Cek pemahaman

  1. 1Berapa lebar `.isi` hasil hitung browser?

    <style>
    .wadah { width: 500px; }
    .isi { width: min(80%, 300px); }
    </style>
    <div class="wadah">
      <div class="isi"></div>
    </div>
  2. 2Tanpa meta viewport, browser HP biasanya merender halaman seolah lebarnya sekitar 980px lalu mengecilkannya.

  3. 3Dengan pendekatan mobile-first, media query sebaiknya ditulis seperti apa?

  4. 4Apa warna teks `p` hasil hitung browser?

    <style>
    :root { --warna: red; }
    .kotak { --warna: green; }
    p { color: var(--warna, blue); }
    </style>
    <div class="kotak">
      <p>Halo</p>
    </div>