Pemilih CSS3: tipe pertama dengan nama kelas?


230

Apakah mungkin menggunakan pemilih CSS3 :first-of-typeuntuk memilih elemen pertama dengan nama kelas yang diberikan? Saya belum berhasil dengan tes saya jadi saya pikir tidak?

Kode ( http://jsfiddle.net/YWY4L/ ):

p:first-of-type {color:blue}
p.myclass1:first-of-type {color:red}
.myclass2:first-of-type {color:green}
<div>
  <div>This text should appear as normal</div>
  <p>This text should be blue.</p>
  <p class="myclass1">This text should appear red.</p>
  <p class="myclass2">This text should appear green.</p>
</div>

Jawaban:


336

Tidak, tidak mungkin menggunakan hanya satu pemilih. The :first-of-typepseudo-class memilih elemen pertama dari yang jenis ( div,p , dll). Menggunakan pemilih kelas (atau pemilih jenis) dengan kelas pseudo berarti memilih elemen jika memiliki kelas yang diberikan (atau dari jenis yang diberikan) dan merupakan yang pertama dari jenisnya di antara saudara kandungnya.

Sayangnya, CSS tidak menyediakan :first-of-classpemilih yang hanya memilih kemunculan pertama kelas. Sebagai solusinya, Anda dapat menggunakan sesuatu seperti ini:

.myclass1 { color: red; }
.myclass1 ~ .myclass1 { color: /* default, or inherited from parent div */; }

Penjelasan dan ilustrasi untuk solusi diberikan di sini dan di sini .


7
Tidak @justNik ini berfungsi untuk banyak elemen. The .myclass1pemilih akan memilih setiap elemen .myclass1. Selector .myclass1 ~ .myclass1menggunakan penggabung saudara kandung umum untuk memilih setiap elemen dengan kelas .myclass1yang merupakan saudara kandung dari elemen dengan kelas .myclass1. Ini dijelaskan dengan sangat rinci di sini .
WebWanderer

solusi hebat! itu bekerja dengan baik untuk implementasi spy-scroll menggunakan pengamat persimpangan, di mana beberapa bagian mungkin keduanya terlihat pada halaman, tetapi kami ingin menggambar dengan tebal hanya yang aktif pertama.
zavr

45

Draf Selektor CSS Level 4 mengusulkan untuk menambahkan of <other-selector>tata bahasa di dalam :nth-childpemilih . Hal ini akan memungkinkan Anda untuk memilih yang n th anak pencocokan pemilih lain yang diberikan:

:nth-child(1 of p.myclass) 

Draf sebelumnya menggunakan pseudo-class baru :nth-match(), sehingga Anda dapat melihat sintaks itu dalam beberapa diskusi fitur:

:nth-match(1 of p.myclass)

Ini sekarang telah diterapkan di WebKit , dan karenanya tersedia di Safari, tetapi itu tampaknya satu-satunya browser yang mendukungnya . Ada tiket yang diajukan untuk mengimplementasikannya Blink (Chrome) , Gecko (Firefox) , dan permintaan untuk mengimplementasikannya di Edge , tetapi tidak ada kemajuan yang jelas pada semua ini.


102
Hanya 10 tahun, dan saya bisa menggunakannya. Padahal proyek yang akan saya gunakan ini perlu dilakukan besok.
Lajos Meszaros

1
: n-match () dijatuhkan mendukung fitur baru untuk n-anak (), yang tidak didukung belum: caniuse.com/#feat=css-nth-child-of
nabrown

@ nabrown78 Terima kasih atas sarannya, memperbarui jawabannya menjadi terkini.
Brian Campbell

19

Ini tidak mungkin untuk menggunakan pemilih CSS3 : tipe pertama untuk memilih elemen pertama dengan nama kelas yang diberikan.

Namun, jika elemen yang ditargetkan memiliki elemen saudara sebelumnya, Anda dapat menggabungkan negasi CSS pseudo-class dan pemilih saudara yang berdekatan untuk mencocokkan elemen yang tidak langsung memiliki elemen sebelumnya dengan nama kelas yang sama:

:not(.myclass1) + .myclass1

Contoh kode kerja lengkap:

p:first-of-type {color:blue}
p:not(.myclass1) + .myclass1 { color: red }
p:not(.myclass2) + .myclass2 { color: green }
<div>
  <div>This text should appear as normal</div>
  <p>This text should be blue.</p>
  <p class="myclass1">This text should appear red.</p>
  <p class="myclass2">This text should appear green.</p>
</div>


9

Saya menemukan solusi untuk referensi Anda. dari beberapa div grup pilih dari grup dua div kelas yang sama yang pertama

p[class*="myclass"]:not(:last-of-type) {color:red}
p[class*="myclass"]:last-of-type {color:green}

BTW, saya tidak tahu mengapa :last-of-typebekerja, tetapi :first-of-typetidak berhasil.

Eksperimen saya di jsfiddle ... https://jsfiddle.net/aspanoz/m1sg4496/


Ini tidak berfungsi seperti yang diminta, seperti yang sudah bisa dilihat dari biola. Satu-satunya hal ini, tidak memilih div terakhir jika tidak memiliki kelas.
Marten Koetsier

6

Ini adalah utas lama, tetapi saya merespons karena masih muncul tinggi dalam daftar hasil pencarian. Sekarang setelah masa depan telah tiba, Anda dapat menggunakan: nth-child pseudo-selector.

p:nth-child(1) { color: blue; }
p.myclass1:nth-child(1) { color: red; }
p.myclass2:nth-child(1) { color: green; }

Selektor pseudo-anak-n sangat kuat - tanda kurung menerima rumus serta angka.

Lebih lanjut di sini: https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child


6
Ya, saya tidak berpikir itu berhasil, setidaknya tidak di Chrome ... jsfiddle.net/YWY4L/91
Adam Youngers

2
Apa yang Anda maksud dengan "sekarang bahwa masa depan telah tiba"? Ini hanya berfungsi di Safari pada saat penulisan.
Alejandro García Iglesias

4

Sebagai solusi fallback, Anda bisa membungkus kelas Anda dalam elemen induk seperti ini:

<div>
    <div>This text should appear as normal</div>
    <p>This text should be blue.</p>
    <div>
        <!-- first-child / first-of-type starts from here -->
        <p class="myclass1">This text should appear red.</p>
        <p class="myclass2">This text should appear green.</p>
    </div>
</div>

1

Tidak yakin bagaimana menjelaskan ini tetapi saya mengalami sesuatu yang serupa hari ini. Tidak dapat diatur .user:first-of-type{}saat .user:last-of-type{}bekerja dengan baik. Ini diperbaiki setelah saya membungkusnya di dalam div tanpa kelas atau gaya:

https://codepen.io/adrianTNT/pen/WgEpbE

<style>
.user{
  display:block;
  background-color:#FFCC00;
}

.user:first-of-type{
  background-color:#FF0000;
}
</style>

<p>Not working while this P additional tag exists</p>

<p class="user">A</p>
<p class="user">B</p>
<p class="user">C</p>

<p>Working while inside a div:</p>

<div>
<p class="user">A</p>
<p class="user">B</p>
<p class="user">C</p>
</div>

0

Anda dapat melakukan ini dengan memilih setiap elemen kelas yang merupakan saudara kandung dari kelas yang sama dan membalikkannya, yang akan memilih hampir setiap elemen pada halaman, jadi Anda harus memilih lagi oleh kelas.

misalnya:

<style>
    :not(.bar ~ .bar).bar {
        color: red;
    }
<div>
    <div class="foo"></div>
    <div class="bar"></div> <!-- Only this will be selected -->
    <div class="foo"></div>
    <div class="bar"></div>
    <div class="foo"></div>
    <div class="bar"></div>
</div>

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.