Selector CSS Modern: `:is()`, `:where()`, dan `:has()` (Selector Induk Masa Kini)

Selector CSS Modern: `:is()`, `:where()`, dan `:has()` (Selector Induk Masa Kini)
CSS terus berkembang, membawa berbagai fitur baru yang memudahkan kita dalam membuat tampilan web yang kompleks dan dinamis. Di antara fitur-fitur modern tersebut, selector `:is()`, `:where()`, dan `:has()` adalah yang paling menarik. Mereka memungkinkan kita menulis CSS dengan lebih efisien, modular, dan yang paling penting, memberikan kemampuan untuk menyeleksi elemen berdasarkan keberadaan elemen anak (parent selector!). Artikel ini akan membahas ketiga selector ini secara mendalam, memberikan contoh penggunaan praktis, dan menjelaskan bagaimana mereka dapat meningkatkan kemampuan Anda dalam membuat CSS.
Apa Itu `:is()`?

Selector `:is()` adalah functional pseudo-class yang memungkinkan kita untuk mengelompokkan beberapa selector menjadi satu. Ini sangat berguna ketika kita ingin menerapkan gaya yang sama ke beberapa elemen yang berbeda. Tanpa `:is()`, kita mungkin akan menulis kode CSS yang berulang-ulang, yang membuatnya sulit dibaca dan dipelihara.
Sintaks:
:is(selector1, selector2, selector3, ...) {
/ Gaya CSS /
}
Contoh:
Misalkan kita ingin memberikan warna teks merah pada elemen h1, h2, dan h3. Dengan `:is()`, kita dapat melakukannya seperti ini:
:is(h1, h2, h3) {
color: red;
}
Tanpa `:is()`, kita harus menulis:
h1 {
color: red;
}
h2 {
color: red;
}
h3 {
color: red;
}
Terlihat jelas bahwa `:is()` membuat kode kita lebih ringkas dan mudah dibaca. Selain itu, `:is()` juga meningkatkan specificity dari selector yang dikelompokkan, tetapi tetap lebih rendah daripada menulis selector individual.
Contoh Lanjutan:
`:is()` juga dapat digunakan dengan selector yang lebih kompleks. Misalnya, kita ingin memberikan padding pada semua elemen a yang berada di dalam elemen nav atau aside:
:is(nav, aside) a {
padding: 0.5em;
}
Ini setara dengan:
nav a {
padding: 0.5em;
}
aside a {
padding: 0.5em;
}
Dengan `:is()`, kita dapat menghindari pengulangan dan membuat kode kita lebih terstruktur.
Mengenal `:where()`: Saudara Kandung `:is()` dengan Spefisitas Rendah

Selector `:where()` sangat mirip dengan `:is()`, tetapi perbedaan utamanya terletak pada specificity. `:where()` selalu memiliki specificity 0 (nol), yang berarti gaya yang diterapkan oleh `:where()` akan lebih mudah ditimpa oleh selector lain, bahkan selector yang lebih umum.
Sintaks:
:where(selector1, selector2, selector3, ...) {
/ Gaya CSS /
}
Contoh:
Misalkan kita ingin memberikan warna teks biru pada elemen p di dalam elemen div, article, atau section. Kita bisa menggunakan `:where()`:
:where(div, article, section) p {
color: blue;
}
Karena `:where()` memiliki specificity 0, gaya ini akan mudah ditimpa oleh selector lain yang menargetkan elemen p secara lebih spesifik. Ini sangat berguna ketika kita ingin menerapkan gaya dasar (baseline styles) yang mudah diubah kemudian.
Kapan Menggunakan `:where()`?
`:where()` sangat berguna dalam situasi berikut:
- Reset CSS/Normalisasi: Kita dapat menggunakan `:where()` untuk menerapkan gaya dasar yang akan di-override oleh gaya yang lebih spesifik.
- Tema: `:where()` memungkinkan kita untuk mengubah tema situs web dengan mudah, karena gaya tema akan menimpa gaya dasar yang diterapkan oleh `:where()`.
- Komponen: Ketika membuat komponen UI yang dapat digunakan kembali, `:where()` memastikan bahwa gaya komponen dapat disesuaikan di berbagai konteks tanpa konflik specificity yang rumit.
Perbandingan `:is()` dan `:where()`:
| Fitur | `:is()` | `:where()` |
|---|---|---|
| Specificity | Sama dengan selector yang paling spesifik di dalam grup | 0 (nol) |
| Penggunaan | Mengelompokkan selector dengan specificity yang lebih tinggi | Menerapkan gaya dasar yang mudah di-override |
`:has()`: Sang Penakluk, Selector Induk yang Kita Tunggu-tunggu

Inilah bintang utama artikel ini: selector `:has()`! Selama bertahun-tahun, pengembang web telah mendambakan kemampuan untuk memilih elemen berdasarkan keberadaan elemen anak. Sebelum `:has()`, ini seringkali hanya mungkin dilakukan dengan JavaScript. Kini, dengan `:has()`, kita dapat melakukan ini langsung di CSS!
Sintaks:
element:has(selector_anak) {
/ Gaya CSS /
}
Selector `:has()` menyeleksi elemen (element) yang memiliki elemen anak (selector_anak) yang sesuai dengan selector yang diberikan. Dengan kata lain, `:has()` memungkinkan kita memilih elemen induk berdasarkan keberadaan atau karakteristik elemen anaknya.
Contoh Sederhana:
Misalkan kita ingin memberikan border pada semua elemen div yang memiliki elemen p di dalamnya:
div:has(p) {
border: 1px solid black;
}
Kode ini akan memilih semua elemen div yang memiliki elemen p sebagai anaknya dan menambahkan border hitam. Luar biasa, bukan?
Contoh Lanjutan:
`:has()` menawarkan banyak kemungkinan. Berikut beberapa contoh:
- Menyeleksi elemen
articleyang memiliki gambar: - Memberikan gaya berbeda pada elemen
liyang memiliki tautan (a): - Menampilkan pesan kesalahan jika input tidak valid:
article:has(img) {
background-color: #f0f0f0;
}
li:has(a) {
font-weight: bold;
}
input:not(:placeholder-shown):invalid:has(+ span.error-message) + span.error-message {
display: block;
}
Contoh ini (sedikit lebih kompleks) menunjukkan bagaimana `:has()` dapat digunakan bersama dengan selector lain untuk membuat validasi form yang lebih canggih. Ini memilih elemen span.error-message yang berada setelah elemen input yang tidak valid dan menampilkan pesan kesalahan.
Kombinasi dengan Selector Lain:
Kekuatan `:has()` semakin terasa ketika dikombinasikan dengan selector lain. Kita dapat menggunakan `:has()` untuk menyeleksi elemen berdasarkan:
- Atribut:
div:has([data-type="warning"]) { / Gaya CSS / }(Memilihdivyang memiliki elemen dengan atributdata-typebernilai "warning") - Pseudo-classes:
a:has(:hover) { / Gaya CSS / }(Memilih elemenayang memiliki elemen yang sedang di-hover) - Selector kompleks:
nav:has(ul > li.active) { / Gaya CSS / }(Memilih elemennavyang memiliki elemenulyang memiliki elemenlidengan kelas "active")
Perhatian Penting tentang Performa:
Meskipun `:has()` sangat kuat, penting untuk diingat bahwa penggunaannya dapat mempengaruhi performa, terutama pada halaman dengan banyak elemen dan struktur DOM yang kompleks. Hindari menggunakan `:has()` secara berlebihan atau dengan selector yang sangat kompleks, karena ini dapat memperlambat rendering halaman. Gunakan alat pengembang browser untuk memantau performa dan mengoptimalkan kode CSS Anda.
Contoh Implementasi Lengkap
Mari kita lihat contoh implementasi lengkap yang menggabungkan `:is()`, `:where()`, dan `:has()` untuk membuat struktur navigasi sederhana:
HTML:
<nav>
<ul>
<li><a href="#">Beranda</a></li>
<li class="active"><a href="#">Tentang Kami</a></li>
<li><a href="#">Layanan</a></li>
<li>Kontak</li> <!-- Tidak memiliki tautan -->
</ul>
</nav>
CSS:
/ Reset CSS menggunakan :where() /
:where(ul, li, a) {
margin: 0;
padding: 0;
list-style: none;
text-decoration: none;
}
/ Gaya dasar navigasi /
nav {
background-color: #333;
color: white;
padding: 1em;
}
nav ul {
display: flex;
gap: 1em;
}
/ Gaya tautan menggunakan :is() /
:is(nav a, nav li) {
color: white;
padding: 0.5em;
display: block;
}
/ Gaya list item yang memiliki tautan menggunakan :has() /
li:has(a) {
border-bottom: 2px solid transparent;
}
li:has(a):hover {
border-bottom-color: white;
}
/ Gaya list item aktif /
li.active {
font-weight: bold;
}
Dalam contoh ini:
- `:where()` digunakan untuk melakukan reset CSS dasar, memastikan konsistensi di semua browser.
- `:is()` digunakan untuk menerapkan gaya yang sama ke elemen
adanlidi dalamnav. - `:has()` digunakan untuk memberikan efek hover hanya pada elemen `li` yang memiliki tautan (elemen `a`). Elemen `li` "Kontak" tidak memiliki tautan, sehingga tidak akan memiliki efek hover.
Kesimpulan
Selector `:is()`, `:where()`, dan `:has()` adalah tambahan yang sangat berharga untuk gudang senjata CSS kita. `:is()` memungkinkan kita mengelompokkan selector, `:where()` memberikan fleksibilitas dengan specificity rendah, dan `:has()` membuka kemungkinan baru untuk menyeleksi elemen induk berdasarkan keberadaan elemen anak. Dengan memahami dan memanfaatkan ketiga selector ini, kita dapat menulis kode CSS yang lebih efisien, modular, dan mudah dipelihara, serta menciptakan tampilan web yang lebih dinamis dan responsif.
Ingatlah untuk selalu mempertimbangkan performa dan kompatibilitas browser saat menggunakan fitur CSS modern ini. Eksperimen, latihan, dan teruslah belajar! Selamat mencoba!
Posting Komentar untuk "Selector CSS Modern: `:is()`, `:where()`, dan `:has()` (Selector Induk Masa Kini)"
Posting Komentar