Apa itu pseudo-class
Pseudo-class adalah kata kunci setelah titik dua yang memilih elemen berdasarkan posisi-nya di dokumen atau state-nya. Kamu menempelkannya pada selector biasa: li:first-child, input:focus, a:hover.
Pseudo-class state untuk link dan mouse (:hover, :active, :visited) punya halamannya sendiri, CSS hover.
:nth-child() dan rumus an+b
:nth-child() menerima angka, kata kunci, atau rumus an+b. Browser mencoba n = 0, 1, 2, ... dan mencocokkan setiap posisi yang dihasilkan rumus itu (posisi dimulai dari 1).
| Rumus | Cocok dengan posisi | Arti |
|---|---|---|
3 | 3 | Child ketiga |
odd atau 2n+1 | 1, 3, 5, ... | Baris ganjil |
even atau 2n | 2, 4, 6, ... | Baris genap |
3n | 3, 6, 9, ... | Setiap kelipatan tiga |
n+4 | 4, 5, 6, ... | Yang keempat dan seterusnya |
-n+3 | 1, 2, 3 | Tiga yang pertama |
3n+1 | 1, 4, 7, ... | Setiap tiga, mulai dari yang pertama |
Ketik sebuah rumus dan lihat item mana yang cocok:
Coba odd, even, 4, n+7, -n+5, dan 2n+3. Rumus yang tidak valid tidak cocok dengan apa pun.
Kembarannya yang menghitung dari belakang adalah :nth-last-child(): li:nth-last-child(-n+2) memilih dua item terakhir.
nth-child vs nth-of-type
:nth-child() menghitung setiap elemen saudara, apa pun tag-nya, baru kemudian memeriksa sisa selector-nya. :nth-of-type() hanya menghitung saudara dengan tag yang sama. Perbedaannya langsung terlihat begitu saudara-saudaranya bercampur:
Pasangan yang sama juga ada untuk kedua ujung: :first-child / :first-of-type, :last-child / :last-of-type, :only-child / :only-of-type.
:not(), :is() dan :where()
| Pseudo-class | Contoh | Cocok dengan |
|---|---|---|
:not(X) | li:not(.done) | Elemen yang tidak cocok dengan X |
:is(X, Y) | :is(h1, h2, h3) a | Elemen yang cocok dengan salah satu dari daftar |
:where(X, Y) | :where(ul, ol) li | Sama seperti :is(), dengan specificity nol |
:has(X) | li:has(> input:checked) | Elemen yang berisi sesuatu yang cocok dengan X |
:not() adalah yang dipakai sehari-hari, misalnya untuk menaruh pemisah di antara item tetapi tidak setelah item terakhir:
Pseudo-class state: focus, checked, disabled, invalid
| Pseudo-class | Cocok dengan |
|---|---|
:focus | Elemen yang sedang mendapat fokus keyboard atau mouse |
:focus-visible | Elemen yang difokuskan, dan browser memutuskan cincin fokus perlu ditampilkan (biasanya fokus keyboard) |
:focus-within | Elemen yang berisi elemen yang sedang difokuskan |
:checked | Checkbox atau radio yang dicentang, atau <option> yang dipilih |
:disabled / :enabled | Kontrol form yang dinonaktifkan (atau tidak) |
:required / :optional | Input dengan atau tanpa required |
:invalid / :valid | Input yang nilainya gagal atau lolos validasi |
:user-invalid | Tidak valid, tetapi baru setelah pengguna berinteraksi dengannya |
:placeholder-shown | Input yang sedang menampilkan placeholder-nya |
:empty | Elemen tanpa child, bahkan tanpa teks |
:target | Elemen yang id-nya cocok dengan #fragment di URL |
Klik di kolom email: label-nya berubah biru berkat :focus-within. Ketik sesuatu yang bukan email lalu tinggalkan kolomnya: :user-invalid membuat border-nya berwarna kuning. :invalid biasa akan menandai kolom wajib yang masih kosong dengan warna kuning bahkan sebelum kamu menyentuhnya.
Apa pun yang kamu lakukan dengan :focus, tetap pertahankan style fokus yang terlihat. Menghapus outline tanpa penggantinya membuat pengguna keyboard tidak bisa melihat posisi mereka.
:has(), selector induk
:has() mencocokkan elemen berdasarkan isinya. Inilah "selector induk" yang sudah lama diminta, dan pseudo-class ini berfungsi di Chrome, Firefox, dan Safari versi terbaru.
Pilih paket yang lain: seluruh kartu mengikuti tombol radio, tanpa JavaScript.
Kesalahan yang sering terjadi
- Spasi sebelum titik dua.
li :first-childberarti "child pertama di dalam sebuah li". Tulisli:first-child. - Mengira
p:nth-child(1)berarti "p yang pertama". Artinya "child pertama, kalau child itu adalah p". Pakai:first-of-typeuntuk p yang pertama. - Menghitung dari 0. Posisi dimulai dari 1:
:nth-child(0)tidak cocok dengan apa pun. - Menghapus outline fokus.
:focus { outline: none }tanpa pengganti merusak navigasi keyboard. - Tertukar antara
:dan::.:beforeadalah ejaan lama dari pseudo-element::before. Pseudo-class selalu memakai satu titik dua.
Pertanyaan yang sering diajukan
Apa itu pseudo-class di CSS?
Kata kunci setelah titik dua yang memilih elemen berdasarkan state atau posisinya, bukan berdasarkan namanya, misalnya a:hover, li:first-child, atau input:focus. Pseudo-class ditambahkan ke selector biasa, dan sebagian besar pseudo-class dihitung seperti class untuk specificity (:where() dihitung nol).
Bagaimana cara kerja nth-child di CSS?
:nth-child(an+b) mencocokkan elemen yang posisinya di antara saudara-saudaranya adalah a×n+b untuk n = 0, 1, 2, dan seterusnya, dihitung mulai dari 1. :nth-child(3) adalah child ketiga, :nth-child(odd) atau 2n+1 setiap child ganjil, dan :nth-child(n+4) child keempat dan seterusnya.
Apa perbedaan nth-child dan nth-of-type?
:nth-child() menghitung semua elemen saudara, lalu memeriksa sisa selector-nya. :nth-of-type() hanya menghitung saudara dengan jenis elemen yang sama. Dalam daftar berisi sebuah h2 yang diikuti paragraf, p:nth-child(1) tidak cocok dengan apa pun, sedangkan p:nth-of-type(1) cocok dengan paragraf pertama.
Bagaimana cara memakai :not() di CSS?
Taruh selector yang ingin dikecualikan di dalam tanda kurung: li:not(.done) mencocokkan setiap item list yang tidak punya class done. Pseudo-class ini juga menerima daftar, input:not([type="checkbox"], [type="radio"]).
Apa perbedaan pseudo-class dan pseudo-element?
Pseudo-class (satu titik dua, :hover) memilih seluruh elemen yang sudah ada dalam state tertentu. Pseudo-element (dua titik dua, ::before) menyasar bagian dari elemen atau membuat konten yang dihasilkan.