Lebih banyak kontrol atas pilihan :nth-child() dengan sintaksis S

Memfilter awal sekumpulan elemen turunan sebelum menerapkan logika An+B padanya.

Pemilih pseudo-class :nth-child() dan :nth-last-child()

Dengan pemilih pseudo-class :nth-child(), Anda dapat memilih Elemen dalam DOM berdasarkan indeksnya. Dengan menggunakan mikrosintaksis An+B, Anda mendapatkan kontrol yang lebih baik atas elemen yang ingin Anda pilih.

  • :nth-child(2): Pilih anak ke-2.
  • :nth-child(2n): Pilih semua anak genap (ke-2, ke-4, ke-6, ke-8, dan seterusnya).
  • :nth-child(2n+1): Memilih semua elemen anak ganjil (ke-1, ke-3, ke-5, ke-7, dan seterusnya).
  • :nth-child(5n+1): Pilih anak ke-1 (=(5×0)+1), ke-6 (=(5×1)+1), ke-11 (=(5×2)+1), …
  • :nth-child(5n+2): Pilih turunan ke-2 (=(5×0)+2), ke-7 (=(5×1)+2), ke-12 (=(5×2)+2), …

Namun, ada lebih banyak pilihan materi iklan yang dapat Anda lakukan, jika Anda menghilangkan parameter A. Contoh:

  • :nth-child(n+3): Pilih setiap elemen anak dari yang ke-3 ke atas (ke-3, ke-4, ke-5, dan seterusnya).
  • :nth-child(-n+5): Pilih setiap anak hingga yang ke-5 (1, 2, 3, 4, 5).

Gabungkan beberapa pilihan :nth-child() ini dan Anda dapat memilih rentang elemen:

  • :nth-child(n+3):nth-child(-n+5): Pilih setiap elemen anak dari yang ke-3 hingga yang ke-5 (ke-3, ke-4, ke-5).

Dengan :nth-last-child(), Anda dapat melakukan pemilihan serupa, tetapi alih-alih mulai menghitung dari awal, Anda mulai menghitung dari akhir.

Memilih pra-pemfilteran dengan sintaksis of S

Yang baru di CSS Selectors Level 4 adalah kemampuan untuk secara opsional meneruskan daftar pemilih ke :nth-child() dan :nth-last-child().

:nth-child(An+B [of S]?) :nth-last-child(An+B [of S]?) 

Jika of S ditentukan, logika An+B hanya diterapkan pada elemen yang cocok dengan daftar pemilih S yang diberikan. Pada dasarnya, ini berarti Anda dapat memfilter turunan terlebih dahulu sebelum An+B melakukan tugasnya.

Browser Support

  • Chrome: 111.
  • Edge: 111.
  • Firefox: 113.
  • Safari: 9.

Contoh

Misalnya, :nth-child(2 of .highlight) memilih elemen kedua yang cocok yang memiliki class .highlight. Dengan kata lain: dari semua turunan dengan class .highlight, pilih yang kedua.

Hal ini berbeda dengan .highlight:nth-child(2) yang memilih elemen yang memiliki class .highlight dan juga merupakan turunan kedua.

Dalam demo di bawah, Anda dapat melihat perbedaan ini:

  • Elemen yang cocok dengan :nth-child(2 of .highlight) memiliki garis batas berwarna merah muda.
  • Elemen yang cocok dengan .highlight:nth-child(2) memiliki garis luar berwarna hijau.

Perhatikan bahwa S adalah daftar pemilih yang berarti menerima beberapa pemilih yang dipisahkan dengan koma. Misalnya, :nth-child(4 of .highlight, .sale) memilih elemen keempat yang berupa .highlight atau .sale dari sekumpulan elemen saudara.

Dalam demo di bawah, elemen yang cocok dengan :nth-child(4 of .highlight, .sale) memiliki garis oranye yang diterapkan padanya.

Strip zebra, yang dapat dibuka lagi

Contoh klasik penggunaan :nth-child() adalah saat membuat tabel bergaris zebra. Teknik visual ini membuat setiap baris tabel memiliki warna yang berbeda. Biasanya, hal ini akan dilakukan sebagai berikut:

tr:nth-child(even) {   background-color: lightgrey; } 

Meskipun berfungsi dengan baik untuk tabel statis, hal ini menjadi bermasalah saat Anda mulai memfilter konten tabel secara dinamis. Misalnya, jika baris kedua disembunyikan, Anda akan melihat baris pertama dan ketiga, masing-masing dengan warna latar belakang yang sama.

Untuk memperbaikinya, kita dapat memanfaatkan :nth-child(An+B [of S]?) dengan mengecualikan baris tersembunyi dari logika An+B:

tr:nth-child(even of :not([hidden])) {   background-color: lightgrey; } 

Cukup keren, bukan?

Foto oleh Markus Spiske di Unsplash