Pengenalan HTML 17
CSS Tingkat Lanjut

oleh: Suryo Adhy Chandra, ST

Sekarang kita naik satu tingkat. Selain memberi style langsung ke tag, kita juga bisa memilih tag yang berada di dalam tag lain, menggabungkan beberapa class, dan membuat tampilan tabel lebih rapi.

1. Styling CSS untuk tag di dalam tag lain

Dalam CSS, kita bisa memilih elemen yang berada di dalam elemen lain. Cara ini disebut selector turunan atau descendant selector.

<style> div p { color: #2563eb; font-size: 20px; } p span { color: #dc2626; font-weight: bold; } </style> <div> <p>Ini paragraf yang ada di dalam div.</p> </div> <p> Ini paragraf biasa dengan <span>teks penting</span> di dalamnya. </p>

Penjelasan:

div p artinya semua tag p yang ada di dalam div.

p span artinya semua tag span yang ada di dalam p.

Preview hasil:

Ini paragraf yang ada di dalam div.

Ini paragraf biasa dengan teks penting di dalamnya.

2. Contoh sederhana gabungan class untuk div, p, dan span

Kita juga bisa memberi lebih dari satu class pada sebuah elemen. Ini berguna agar style lebih fleksibel dan bisa digabung-gabung sesuai kebutuhan.

<style> .kotak { background-color: #dbeafe; padding: 16px; border-radius: 10px; } .teks-besar { font-size: 22px; } .teks-biru { color: #1d4ed8; } .teks-penting { color: #b91c1c; font-weight: bold; } </style> <div class="kotak teks-besar"> <p class="teks-biru"> Ini paragraf di dalam kotak. <span class="teks-penting">Bagian ini penting!</span> </p> </div>

Preview hasil:

Ini paragraf di dalam kotak. Bagian ini penting!

Dengan gabungan class, kita tidak perlu menulis ulang style yang sama. Satu class bisa untuk warna, class lain untuk ukuran huruf, dan class lain lagi untuk bentuk kotaknya.

3. Membuat styling untuk table

Tabel akan terlihat jauh lebih enak dibaca jika diberi border, warna header, padding, dan warna selang-seling.

<style> table { width: 100%; border-collapse: collapse; margin-top: 12px; } th { background-color: #1d4ed8; color: white; padding: 10px; } td { border: 1px solid #cbd5e1; padding: 10px; } tr:nth-child(even) { background-color: #eff6ff; } </style> <table> <thead> <tr> <th>Nama</th> <th>Kelas</th> <th>Nilai</th> </tr> </thead> <tbody> <tr> <td>Andi</td> <td>8A</td> <td>90</td> </tr> <tr> <td>Sinta</td> <td>8B</td> <td>95</td> </tr> </tbody> </table>

Preview tabel:

Nama Kelas Nilai
Andi 8A 90
Sinta 8B 95

Kesimpulan

CSS tingkat lanjut membantu kita memilih elemen dengan lebih tepat, menggabungkan class supaya styling lebih rapi, dan membuat tabel tampak profesional. Ini adalah langkah penting sebelum membuat halaman web yang lebih besar dan lebih terstruktur.

4. Macam-macam selector dan kombinasinya

Selector turunan hanyalah salah satu dari beberapa cara memilih elemen. Mengenal beberapa lainnya membuat kamu bisa menunjuk elemen secara tepat tanpa menambah banyak class. Bayangkan alamat rumah: "Jalan Mawar" menunjuk semua rumah di jalan itu, sedangkan "Jalan Mawar nomor 5" menunjuk satu rumah saja. Selector bekerja dengan cara serupa, dari yang umum hingga yang sangat khusus.

  • p, span (dipisah koma) memilih semua p dan semua span sekaligus.
  • div > p memilih p yang menjadi anak langsung dari div, bukan cucunya.
  • h2 + p memilih p yang tepat berada setelah h2.
  • p.penting memilih paragraf yang memiliki class penting.
  • #menu memilih satu elemen dengan id menu.
<style>
.kartu > p { margin: 0; color: #334155; }
.kartu h2 + p { font-weight: bold; }
p.penting { color: #b91c1c; }
</style>

<div class="kartu">
    <h2>Pengumuman</h2>
    <p>Paragraf ini tepat setelah judul, jadi tebal.</p>
    <p class="penting">Paragraf penting berwarna merah.</p>
</div>

Pada contoh ini aturan pertama berlaku untuk dua paragraf. Aturan kedua hanya mengenai paragraf pertama karena ia tepat setelah h2. Aturan ketiga membuat paragraf kedua berwarna merah, dan karena p.penting lebih spesifik daripada .kartu > p, warna merah yang dipakai.

5. Pseudo-class: gaya berdasarkan keadaan

Pseudo-class memilih elemen berdasarkan keadaannya. Contoh paling terkenal adalah :hover, yang aktif saat kursor berada di atas elemen. Pada tabel kamu sudah melihat :nth-child(even) yang memilih baris genap. Ada pula :first-child dan :last-child untuk anak pertama dan terakhir, serta :focus untuk kolom input yang sedang dipilih.

<style>
.tombol {
    background: #2563eb;
    color: white;
    padding: 10px 18px;
    border: none;
    border-radius: 6px;
    transition: background 0.2s;
}
.tombol:hover { background: #1e3a8a; }
input:focus   { outline: 3px solid #93c5fd; }
</style>

Properti transition membuat perubahan warna berlangsung halus selama 0,2 detik, bukan berganti mendadak. Sedikit sentuhan seperti ini sudah membuat halaman terasa hidup.

6. Menggabungkan class dengan bijak

Menggabung class yang kecil-kecil dan punya satu tugas disebut pendekatan utility. Contohnya .teks-biru hanya mengatur warna, .kotak hanya mengatur bentuk. Keuntungannya, kamu tidak menulis ulang aturan yang sama. Kekurangannya, atribut class bisa menjadi panjang. Keseimbangan terbaik adalah memberi nama berdasarkan makna (misalnya .kartu-berita) untuk komponen, dan memakai class kecil untuk penyesuaian.

7. Kesalahan yang sering terjadi

  • Menaruh spasi pada selector gabungan: p .penting (turunan) berbeda arti dengan p.penting (paragraf ber-class penting).
  • Berharap tr:nth-child(even) bekerja ketika tabel tidak memakai struktur baris yang benar.
  • Memberi tabel border pada table, th, dan td tanpa border-collapse, sehingga garis tampak ganda.
  • Membuat selector turunan yang terlalu panjang seperti div div div p span; sulit dirawat dan mudah rusak saat struktur berubah.

8. Latihan

  1. Apa beda div p dan div > p?
    Lihat jawabandiv p memilih semua p di dalam div pada tingkat mana pun; div > p hanya anak langsung.
  2. Tuliskan aturan agar baris tabel disorot abu-abu muda saat kursor di atasnya.
    Lihat jawabantr:hover { background-color: #f1f5f9; }
  3. Mengapa border-collapse: collapse berguna pada tabel?
    Lihat jawabanIa menyatukan garis sel yang bersebelahan sehingga tidak tampak ganda.
  4. Rancang selector untuk memilih hanya paragraf pertama di dalam elemen ber-class artikel.
    Lihat jawaban.artikel p:first-child { ... }