Menu

CSS Pseudo-Class: nth-child, not, first-child, focus

Pseudo-class memilih elemen berdasarkan posisi atau state-nya: :nth-child(), :first-child, :not(), :focus, :checked, :has(), dan lainnya. Pelajari sintaksnya, rumus an+b dengan alat uji langsung, dan perbedaan nth-child dan nth-of-type.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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).

RumusCocok dengan posisiArti
33Child ketiga
odd atau 2n+11, 3, 5, ...Baris ganjil
even atau 2n2, 4, 6, ...Baris genap
3n3, 6, 9, ...Setiap kelipatan tiga
n+44, 5, 6, ...Yang keempat dan seterusnya
-n+31, 2, 3Tiga yang pertama
3n+11, 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-classContohCocok dengan
:not(X)li:not(.done)Elemen yang tidak cocok dengan X
:is(X, Y):is(h1, h2, h3) aElemen yang cocok dengan salah satu dari daftar
:where(X, Y):where(ul, ol) liSama 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-classCocok dengan
:focusElemen yang sedang mendapat fokus keyboard atau mouse
:focus-visibleElemen yang difokuskan, dan browser memutuskan cincin fokus perlu ditampilkan (biasanya fokus keyboard)
:focus-withinElemen yang berisi elemen yang sedang difokuskan
:checkedCheckbox atau radio yang dicentang, atau <option> yang dipilih
:disabled / :enabledKontrol form yang dinonaktifkan (atau tidak)
:required / :optionalInput dengan atau tanpa required
:invalid / :validInput yang nilainya gagal atau lolos validasi
:user-invalidTidak valid, tetapi baru setelah pengguna berinteraksi dengannya
:placeholder-shownInput yang sedang menampilkan placeholder-nya
:emptyElemen tanpa child, bahkan tanpa teks
:targetElemen 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-child berarti "child pertama di dalam sebuah li". Tulis li:first-child.
  • Mengira p:nth-child(1) berarti "p yang pertama". Artinya "child pertama, kalau child itu adalah p". Pakai :first-of-type untuk 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 ::. :before adalah 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai