Salah satu pertanyaan CSS yang paling sering dicari Stack overflow Dengan 4.283 suara dan 3,7 juta tampilan adalah “Apakah ada pemilih induk CSS?” (Gambar 1).

Tangkapan layar pertanyaan Stack Overflow yang menunjukkan bahwa ia memiliki 4283 suara, 33 jawaban, dan 3,7 juta tampilan.
Tumpukan pertanyaan overflow1

Sejak Stack overflow Jawaban biasanya hanya membahas kasus penggunaan spesifik yang disajikan dan tidak harus teknik atau alasan menyeluruh, mari kita gali pertanyaan itu sedikit lebih jauh. Apakah ada pemilih induk di CSS? Secara teknis tidak, tidak ada cara dari elemen anak untuk merangkak kembali ke pohon DOM untuk menemukan elemen induk. Namun, itu tidak berarti kita tidak dapat mencapai hasil yang sama dalam latihan dengan menggeser sudut pandang kita.

Yang bisa kita lakukan adalah menggunakan pemilih yang memeriksa apakah elemen berisi saudara kandung atau anak tertentu menggunakan :has() kelas semu, dan kemudian menata elemen awal, saudara kandung, atau anak yang sesuai. Telah mencapai Baseline kompatibilitas pada tahun 2023, :has() sekarang tersedia di semua browser utama, dengan caniuse melaporkannya tersedia untuk 93,9% pengguna secara global.2

Mari kita lihat case penggunaan beton untuk melihat bagaimana kita bisa menggunakan :has() dalam konteks suatu bentuk. Untuk contoh ini kami akan menggunakan formulir kontak yang sangat umum yang meminta nama orang, email, dan (opsional) orang tersebut, dan berisi a textarea bagi pengguna untuk menggambarkan sifat pertanyaan mereka (Listing 1).

Bentuk html
<form>
  <div class="input-container">
    <label for="name">Your Name</label>
    <input name="name" id="name" type="text" required maxlength="100">
  </div>
  
  <div class="input-container">
    <label for="email">Your Email Address</label>
    <input name="email" id="email" type="email" required maxlength="100">
  </div>
    
  <div class="input-container">
    <label for="tel">Your Phone Number</label>
    <input name="tel" id="tel" type="tel" maxlength="25">
  </div>
  
  <div class="input-container">
    <label for="message">How can we help you?</label>
    <textarea name="message" id="message" required maxlength="1000">
    </textarea>
  </div>
  
  <div class="actions">
    <button type="submit">Send</button>
    <button type="clear">Clear</button>
  </div>
</form>

Secara visual, dengan beberapa gaya tema dasar ditambahkan, bentuk kami terlihat sebagai berikut (Gambar 2). Apa yang ingin kami lakukan, secara terprogram melalui CSS, adalah menampilkan tanda bintang merah

sebelum teks label pada bidang yang diperlukan.
Tangkapan layar bentuk, tidak diisi dengan kesalahan yang ditampilkan untuk bidang yang diperlukan

Formulir Kontak div Setiap bidang kami dibungkus dengan a input-containerdengan kelas div.input-container Jadi kami ingin memilih label yang ada di a yang berisi elemen yang ditandai sebagai diperlukan ::before seperti yang terlihat di Listing 2. Kami kemudian menggunakan content elemen semu ditambah dengan

properti untuk memasukkan tanda bintang. Gambar 3 menjelaskan setiap bagian dari pemilih.
  div.input-container:has(:required) label::before {
    content: "* ";
    color: var(--danger);
  }
Menata label berdasarkan apakah wadah input berisi elemen dengan properti yang diperlukan
Div.Input-Container menggabungkan elemen dan pemilih kelas untuk mencari div dengan kelas input-container. : has (: wajib) adalah kelas semu yang mencari anak-anak div dengan kontainer input kelas yang memiliki atribut yang diperlukan. : Diperlukan di dalam: memiliki () kelas semu adalah kelas semu yang memilih elemen yang memiliki atribut yang diperlukan. Label adalah pemilih elemen. :: Sebelum menciptakan elemen semu yang merupakan anak pertama dari label.

Rincian pemilih label elemen yang diperlukan

Daripada harus ingat untuk menambahkan tanda bintang dalam HTML setiap kali kita memiliki elemen yang diperlukan, kita dapat mengontrol bagaimana elemen -elemen ini dibedakan dari yang opsional melalui CSS (Gambar 4).

Bentuk dengan tanda bintang di depan label bidang yang diperlukan optional Dengan mengendalikan perbedaan ini di CSS, jika mengubah pikiran kami dan memutuskan kami ingin menyoroti bidang opsional alih -alih yang diperlukan (Gambar 5) dengan menambahkan kata tersebut

Dalam tanda kurung setelah label, kami dapat mengedit CSS dan hanya perlu mengubah kode di satu tempat seperti yang terlihat di Listing 3.
div.input-container:has(:where(input, textarea):not(:required)) label::after {
  content: " (optional)";
  font-style: italic;
}

Menata label lapangan opsional divUntuk menata label opsional, kami memulai dengan cara yang sama seperti yang sebelumnya kami lakukan dengan mencari anak -anak input-container s dengan kelas input Namun, kali ini kami harus menentukan bahwa kami mencari secara khusus textarea Dan div elemen tanpa atribut yang diperlukan. Untuk menghindari secara tidak sengaja menandai semua bidang sebagai opsional, kami menentukan elemen mana yang tidak memiliki atribut yang diperlukan yang kami targetkan, karena kami juga memiliki label di dalam wadah kami required yang tidak memiliki file

atribut. Gambar 5 lebih lanjut menjelaskan pemilih.
Div.Input-Container menggabungkan elemen dan pemilih kelas untuk mencari div dengan kelas input-container. : memiliki (: di mana (input, textarea): not (: wajib)) adalah kelas semu yang mencari elemen anak -anak yang merupakan input atau textarea yang tidak memiliki atribut yang diperlukan. : di mana (input, textarea) adalah elemen pemilihan kelas semu yang merupakan input atau textarea. : not (: wajib) adalah kelas semu yang tidak termasuk elemen dengan atribut yang diperlukan. : Diperlukan di dalam: not () kelas semu adalah kelas semu yang memilih elemen yang memiliki atribut yang diperlukan. Label, Input, dan TextArea adalah pemilih elemen. :: Setelah menciptakan elemen semu yang merupakan anak terakhir dari label.

Rincian Pemilih Label Elemen Opsional

Gambar 6 menunjukkan formulir dengan pemilih yang diperbarui. Bentuk dengan (opsional)

Setelah label bidang yang opsional Kode yang disajikan dalam artikel ini dapat ditemukan di bawah atau diCodepen

. Sekarang Anda tahu cara membangun pemilih yang memeriksa elemen tanpa memilih elemen itu. Beri tahu saya

Barang keren apa yang Anda bangun dengan teknik ini.


Happy Coding! Stack Exchange Inc. “sering 'pertanyaan CSS'.” Stack overflow,https://stackoverflow.com/questions/tagged/css?tab=frequent

. Diakses 9 Februari 2025. Deveria, Alexis. “Dapatkah saya menggunakan: Have?” caniuse,https://caniuse.com/?search=%3ahas



Pemilih induk CSS | Blog

Tags: , ,