Saya memiliki banyak elemen dengan nama kelas red
, tetapi sepertinya saya tidak dapat memilih elemen pertama dengan class="red"
menggunakan aturan CSS berikut:
.red:first-child {
border: 5px solid red;
}
<p class="red"></p>
<div class="red"></div>
Apa yang salah dalam pemilih ini dan bagaimana cara memperbaikinya?
Berkat komentarnya, saya menemukan bahwa elemen tersebut harus menjadi anak pertama dari orang tuanya untuk dipilih yang bukan kasus yang saya miliki. Saya memiliki struktur berikut, dan aturan ini gagal seperti yang disebutkan dalam komentar:
.home .red:first-child {
border: 1px solid red;
}
<div class="home">
<span>blah</span>
<p class="red">first</p>
<p class="red">second</p>
<p class="red">third</p>
<p class="red">fourth</p>
</div>
Bagaimana saya bisa menargetkan anak pertama dengan kelas red
?
css
css-selectors
Rajat
sumber
sumber
:first-of-type
melakukan pekerjaan.Jawaban:
Ini adalah salah satu contoh paling terkenal dari penulis yang salah mengerti bagaimana cara
:first-child
kerjanya. Diperkenalkan dalam CSS2 ,:first-child
pseudo-class mewakili anak pertama dari induknya . Itu dia. Ada kesalahpahaman yang sangat umum bahwa ia mengambil elemen anak mana saja yang pertama kali cocok dengan kondisi yang ditentukan oleh pemilih pemilih gabungan. Karena cara penyeleksi bekerja (lihat di sini untuk penjelasan), itu tidak benar.Selectors level 3 memperkenalkan
:first-of-type
pseudo-class , yang mewakili elemen pertama di antara saudara kandung dari tipe elemennya. Jawaban ini menjelaskan, dengan ilustrasi, perbedaan antara:first-child
dan:first-of-type
. Namun, seperti halnya:first-child
, itu tidak melihat kondisi atau atribut lainnya. Dalam HTML, tipe elemen diwakili oleh nama tag. Dalam pertanyaan, tipe itu adalahp
.Sayangnya, tidak ada
:first-of-class
kelas pseudo serupa untuk mencocokkan elemen anak pertama dari kelas yang diberikan. Salah satu solusi yang Lea Verou dan saya buat untuk ini (meskipun sepenuhnya independen) adalah dengan menerapkan gaya yang Anda inginkan untuk semua elemen Anda dengan kelas itu:... lalu "batalkan" gaya untuk elemen dengan kelas yang datang setelah yang pertama , menggunakan kombinator saudara umum
~
dalam aturan utama:Sekarang hanya elemen pertama dengan
class="red"
akan memiliki perbatasan.Berikut ilustrasi tentang bagaimana aturan diterapkan:
Tidak ada aturan yang diterapkan; tidak ada batas yang diberikan.
Elemen ini tidak memiliki kelas
red
, jadi ini dilewati.Hanya aturan pertama yang diterapkan; perbatasan merah diberikan.
Elemen ini memiliki kelas
red
, tetapi tidak didahului oleh elemen apa pun dengan kelasred
di induknya. Jadi aturan kedua tidak diterapkan, hanya yang pertama, dan elemen menjaga perbatasannya.Kedua aturan tersebut diterapkan; tidak ada batas yang diberikan.
Elemen ini memiliki kelas
red
. Itu juga didahului oleh setidaknya satu elemen lain dengan kelasred
. Dengan demikian kedua aturan tersebut diterapkan, danborder
deklarasi kedua mengesampingkan yang pertama, dengan demikian "membatalkan", jadi untuk berbicara.Sebagai bonus, meskipun diperkenalkan di Selectors 3, combinator saudara kandung sebenarnya cukup didukung oleh IE7 dan yang lebih baru, tidak seperti
:first-of-type
dan:nth-of-type()
yang hanya didukung oleh IE9 dan seterusnya. Jika Anda membutuhkan dukungan browser yang bagus, Anda beruntung.Faktanya, fakta bahwa combinator saudara adalah satu-satunya komponen penting dalam teknik ini, dan memiliki dukungan browser yang luar biasa, membuat teknik ini sangat fleksibel - Anda dapat mengadaptasinya untuk memfilter elemen dengan hal lain, selain pemilih kelas:
Anda dapat menggunakan ini untuk bekerja di
:first-of-type
dalam IE7 dan IE8, dengan hanya menyediakan pemilih jenis daripada pemilih kelas (sekali lagi, lebih lanjut tentang penggunaannya yang salah di bagian selanjutnya):Anda dapat memfilter berdasarkan pemilih atribut atau pemilih sederhana lainnya alih-alih kelas.
Anda juga dapat menggabungkan teknik pengesampingan ini dengan elemen semu meskipun elemen semu secara teknis bukan penyeleksi sederhana.
Perhatikan bahwa agar ini berfungsi, Anda harus tahu terlebih dahulu apa gaya default untuk elemen saudara Anda yang lain sehingga Anda dapat mengganti aturan pertama. Selain itu, karena ini melibatkan aturan utama dalam CSS, Anda tidak dapat mencapai hal yang sama dengan pemilih tunggal untuk digunakan dengan API Pemilih , atau pencari CSS Selenium .
Perlu disebutkan bahwa Penyeleksi 4 memperkenalkan ekstensi untuk
:nth-child()
notasi (awalnya merupakan kelas pseudo yang sama sekali baru:nth-match()
), yang akan memungkinkan Anda untuk menggunakan sesuatu seperti:nth-child(1 of .red)
sebagai pengganti hipotetis.red:first-of-class
. Menjadi proposal yang relatif baru, belum ada implementasi interoperable yang cukup untuk dapat digunakan di lokasi produksi. Semoga ini akan segera berubah. Sementara itu, solusi yang saya sarankan harus bekerja untuk sebagian besar kasus.Ingatlah bahwa jawaban ini mengasumsikan bahwa pertanyaannya adalah mencari setiap elemen anak pertama yang memiliki kelas tertentu. Tidak ada kelas pseudo atau bahkan solusi CSS generik untuk kecocokan n dari pemilih kompleks di seluruh dokumen - apakah solusi ada sangat tergantung pada struktur dokumen. jQuery menyediakan
:eq()
,:first
,:last
dan lebih untuk tujuan ini, tapi catatan lagi bahwa mereka berfungsi sangat berbeda dari:nth-child()
et al . Menggunakan Selectors API, Anda dapat menggunakandocument.querySelector()
untuk mendapatkan kecocokan pertama:Atau gunakan
document.querySelectorAll()
dengan pengindeks untuk memilih kecocokan spesifik:Meskipun
.red:nth-of-type(1)
solusi dalam jawaban yang diterima asli oleh Philip Daubmeier berfungsi (yang semula ditulis oleh Martyn tetapi dihapus sejak itu), itu tidak berperilaku seperti yang Anda harapkan.Misalnya, jika Anda hanya ingin memilih
p
markup asli Anda:... maka Anda tidak dapat menggunakan
.red:first-of-type
(setara dengan.red:nth-of-type(1)
), karena setiap elemen adalah yang pertama (dan satu-satunya) dari tipenya (p
dandiv
masing - masing), sehingga keduanya akan dicocokkan oleh pemilih.Ketika elemen pertama dari kelas tertentu juga merupakan yang pertama dari jenisnya , kelas pseudo akan bekerja, tetapi ini hanya terjadi secara kebetulan . Perilaku ini ditunjukkan dalam jawaban Philip. Saat Anda menempel pada elemen dengan tipe yang sama sebelum elemen ini, pemilih akan gagal. Mengambil markup yang diperbarui:
Menerapkan aturan dengan
.red:first-of-type
akan berhasil, tetapi begitu Anda menambahkan yang lainp
tanpa kelas:... pemilih akan segera gagal, karena
.red
elemen pertama sekarang adalah elemen keduap
.sumber
:last-of-class
? Pilih elemen terakhir dari sebuah kelas.general sibling selector ~
karya seperti:not(:first-of-*)
untuk tipe tertentu, saya berasumsi bahwa itu harus menerapkan aturan untuk setiap elemen yang cocok, tetapi itu diterapkan hanya untuk pertandingan pertama bahkan ketika ada 3 atau lebih kemungkinan pertandingan.:nth-child(1 of .foo)
ekstensi telah diterapkan di Safari 9.1+. (Saya belum memeriksa)The
:first-child
pemilih dimaksudkan, seperti namanya mengatakan, untuk memilih anak pertama dari tag induk. Anak-anak harus disematkan dalam tag induk yang sama. Contoh persis Anda akan berfungsi (Coba saja di sini ):Mungkin Anda telah menyarangkan tag Anda di tag induk yang berbeda? Apakah tag kelas Anda
red
benar-benar tag pertama di bawah induk?Perhatikan juga bahwa ini tidak hanya berlaku untuk tag seperti pertama di seluruh dokumen, tetapi setiap kali orang tua baru melilitnya, seperti:
first
danthird
akan menjadi merah.Memperbarui:
Saya tidak tahu mengapa martyn menghapus jawabannya, tetapi ia memiliki solusinya,
:nth-of-type
pemilih:Kredit untuk Martyn . Lebih banyak info misalnya di sini . Perlu diketahui bahwa ini adalah pemilih CSS 3, oleh karena itu tidak semua browser akan mengenalinya (mis. IE8 atau lebih lama).
sumber
:nth-of-type
mengalami sedikit masalah karena tidak berfungsi sama sekali dalam versi IE apa pun saat ini..red:nth-of-type(1)
akan memilih elemen apa saja yang (a) adalah anak pertama dari jenis elemennya, dan (b) memiliki kelas "merah". Jadi jika, dalam contoh, <p> pertama tidak memiliki kelas "merah", itu tidak akan dipilih. Atau jika <span> dan <p> pertama keduanya memiliki kelas "merah", keduanya akan dipilih. jsfiddle.net/fvAxn:first-of-type
setara dengan:nth-of-type(1)
, jadi tentu saja itu berfungsi juga. Itu juga bisa gagal, dengan cara yang sama karena alasan yang sama yang dinyatakan dalam jawaban saya.:nth-of-type
berarti "elemen / tag" ketika dikatakan "ketik". Jadi itu hanya mempertimbangkan elemen, bukan hal-hal seperti kelas.Jawaban yang benar adalah:
Bagian I: Jika elemen pertama ke induknya dan memiliki kelas "merah", itu akan mendapatkan perbatasan.
Bagian II: Jika elemen ".red" tidak pertama kali ke induknya, tetapi segera mengikuti elemen tanpa kelas ".red", elemen itu juga harus mendapatkan kehormatan perbatasan tersebut.
Biola atau itu tidak terjadi.
Jawaban Philip Daubmeier, meskipun diterima, tidak benar - lihat biola terlampir.
Jawaban BoltClock akan berfungsi, tetapi mendefinisikan dan menimpa gaya yang tidak perlu
(terutama masalah di mana ia akan mewarisi perbatasan yang berbeda - Anda tidak ingin mendeklarasikan yang lain ke perbatasan: tidak ada)
EDIT: Jika Anda memiliki "merah" mengikuti non-merah beberapa kali, setiap merah "pertama" akan mendapatkan perbatasan. Untuk mencegahnya, seseorang harus menggunakan jawaban BoltClock. Lihat biola
sumber
.red
Berikut:not(.red)
ini tidak selalu membuatnya menjadi yang pertama di.red
antara saudara kandungnya. Dan jika perbatasan perlu diwariskan, itu hanya masalah mendeklarasikanborder: inherit
alih-alihborder: none
dalam aturan override.first-child
kelast-child
, tapi saya lihat setelah pengujian bahwa ini tidak selalu melakukan trik.Anda bisa menggunakan
first-of-type
ataunth-of-type(1)
sumber
<p></p>
antaraspan
danp
elemen pertama Anda denganred
kelas. Lihatlah JSFiddle ini .Jawaban di atas terlalu rumit.
Ini akan memilih tipe kelas pertama. Sumber MDN
sumber
first-type
telah berganti nama menjadifirst-of-type
<span>
, dan beberapa memiliki kelashighlight
. The.highlight:first-of-type
pemilih akan memilih contoh pertama dari "jenis" dengan kelas yang dipilih, dalam contoh ini yang pertama<span>
, dan bukan contoh pertama dari kelashighlight
. Hanya jika instance span pertama itu juga memiliki highlight kelas maka style akan diimplementasikan. ( codepen.io/andrewRmillar/pen/poJKJdJ )Untuk mencocokkan pemilih Anda, elemen harus memiliki nama kelas
red
dan harus menjadi anak pertama dari induknya.sumber
Karena jawaban lain mencakup apa yang salah dengan itu, saya akan mencoba setengah lainnya, bagaimana cara memperbaikinya. Sayangnya, saya tidak tahu bahwa Anda memiliki solusi CSS saja di sini, setidaknya tidak yang dapat saya pikirkan . Ada beberapa opsi lain ....
Tetapkan
first
kelas ke elemen saat Anda menghasilkannya, seperti ini:CSS:
CSS ini hanya cocok dengan elemen dengan kelas dan keduanya .
first
red
Sebagai alternatif, lakukan hal yang sama dalam JavaScript, misalnya inilah jQuery yang akan Anda gunakan untuk melakukan ini, menggunakan CSS yang sama seperti di atas:
sumber
:first-of-class
, saya juga menyarankan untuk menambahkan kelas tambahan ke elemen pertama. Tampaknya solusi termudah untuk saat ini.Saya mendapatkan yang ini di proyek saya.
sumber
Menurut masalah Anda yang diperbarui
bagaimana tentang
Ini akan memilih kelas home , lalu span elemen dan akhirnya semua elemen .red yang ditempatkan segera setelah elemen span.
Referensi: http://www.w3schools.com/cssref/css_selectors.asp
sumber
Anda dapat menggunakan nth-of-type (1) tetapi pastikan bahwa situs tidak perlu mendukung IE7 dll, jika ini kasusnya gunakan jQuery untuk menambahkan kelas tubuh kemudian menemukan elemen melalui kelas tubuh IE7 lalu nama elemen, lalu tambahkan dalam styling n-anak untuk itu.
sumber
Anda dapat mengubah kode Anda menjadi seperti ini untuk membuatnya berfungsi
Ini bekerja untuk Anda
Berikut ini adalah referensi CSS dari SnoopCode tentang itu.
sumber
Saya menggunakan CSS di bawah ini untuk memiliki gambar latar belakang untuk daftar ul li
sumber
Coba ini :
sumber
Untuk beberapa alasan tidak ada jawaban di atas yang tampaknya menangani kasus anak pertama dan satu - satunya orang tua yang nyata.
Semua jawaban di atas akan gagal jika Anda ingin menerapkan gaya hanya anak kelas satu dalam kode ini.
sumber
:first-child
pseudo Anda menyesatkan karena ia menambahkan.class_name
sebelum tidak mengubah cara kerjanya dan hanya membuatnya bertindak sebagai filter. Jika Anda memiliki div sebelumnya<div class="class_name">First content that need to be styled</div>
maka pemilih Anda tidak akan cocok karena itu bukan anak pertama yang sebenarnya.Coba ini Sederhana dan Efektif
sumber
Saya percaya bahwa menggunakan pemilih relatif
+
untuk memilih elemen yang ditempatkan segera setelah, bekerja di sini yang terbaik (seperti yang disarankan sebelumnya).Mungkin juga untuk kasus ini menggunakan pemilih ini
tapi ini adalah pemilih elemen bukan yang kelas.
Di sini Anda memiliki daftar pemilih CSS yang bagus: https://kolosek.com/css-selectors/
sumber
Coba solusi ini:
Tautan CodePen
sumber