Tanda tambah ( +
) adalah untuk saudara kandung berikutnya.
Apakah ada yang setara untuk saudara sebelumnya?
css
css-selectors
Jourkey
sumber
sumber
Jawaban:
Tidak, tidak ada pemilih "saudara sebelumnya".
Pada catatan terkait,
~
untuk saudara pengganti umum (artinya elemen datang setelah yang satu ini, tetapi tidak harus segera setelah itu) dan merupakan pemilih CSS3.+
untuk saudara berikutnya dan CSS2.1.Lihat Combinator Saudara Adjacent dari Selectors Level 3 dan 5.7 Selector Adjacent Adjacent dari Cascading Style Sheets Level 2 Revisi 1 (CSS 2.1) Spesifikasi .
sumber
Saya menemukan cara untuk gaya semua saudara sebelumnya (kebalikan dari
~
) yang dapat bekerja tergantung pada apa yang Anda butuhkan.Katakanlah Anda memiliki daftar tautan dan ketika melayang di satu tautan, semua yang sebelumnya akan berubah menjadi merah. Anda bisa melakukannya seperti ini:
sumber
float:right
). Itu memang membutuhkan ruang putih runtuh antara unit / kata dan padding bukan margin, tetapi berfungsi dengan baik sebaliknya!Selektor level 4 memperkenalkan
:has()
(sebelumnya indikator subjek!
) yang akan memungkinkan Anda memilih saudara sebelumnya dengan:... tetapi pada saat penulisan, ini agak jauh melampaui batas pendarahan untuk dukungan browser.
sumber
:has()
pseudo-class.Pertimbangkan
order
properti tata letak fleksibel dan kisi.Saya akan fokus pada flexbox pada contoh di bawah ini, tetapi konsep yang sama berlaku untuk Grid.
Dengan flexbox, pemilih saudara sebelumnya dapat disimulasikan.
Secara khusus,
order
properti fleksibel dapat memindahkan elemen di sekitar layar.Ini sebuah contoh:
LANGKAH
Buat
ul
wadah fleksibel.Balikkan urutan saudara kandung dalam mark-up.
Gunakan pemilih saudara untuk menargetkan Elemen A (
~
atau+
akan melakukannya).Gunakan
order
properti flex untuk mengembalikan urutan saudara pada tampilan visual.... dan voila! Selector saudara kandung sebelumnya lahir (atau setidaknya disimulasikan).
Berikut kode lengkapnya:
Dari spec flexbox:
Nilai awal
order
untuk semua item fleksibel adalah 0.Lihat juga
order
dalam spesifikasi Layout Kotak CSS .Contoh "penyeleksi saudara sebelumnya" dibuat dengan
order
properti flex .jsFiddle
Catatan Samping - Dua Keyakinan Lama tentang CSS
Flexbox menghancurkan keyakinan lama tentang CSS.
Salah satu kepercayaan seperti itu adalah bahwa pemilih saudara kandung sebelumnya tidak mungkin dalam CSS .
Untuk mengatakan kepercayaan ini tersebar luas akan menjadi pernyataan yang meremehkan. Inilah contoh pertanyaan terkait tentang Stack Overflow saja:
Seperti dijelaskan di atas, kepercayaan ini tidak sepenuhnya benar. Pemilih saudara sebelumnya dapat disimulasikan dalam CSS menggunakan
order
properti flex .The
z-index
MythKeyakinan lama lainnya adalah bahwa
z-index
hanya bekerja pada elemen-elemen yang diposisikan.Faktanya, versi terbaru dari spec - the W3C Editor's Draft - masih menyatakan ini benar:
Namun pada kenyataannya, informasi ini sudah usang dan tidak akurat.
Elemen yang merupakan item fleksibel atau item kisi dapat membuat konteks penumpukan bahkan ketika
position
adastatic
.Berikut ini demonstrasi
z-index
bekerja pada item fleksibel yang tidak diposisikan: https://jsfiddle.net/m0wddwxs/sumber
order
properti bukan solusi karena semata-mata dimaksudkan untuk mengubah visual yang order, sehingga tidak tidak mengembalikan asli semantical agar Anda dipaksa untuk perubahan dalam HTML untuk solusi ini bekerja.z-index
akan bekerja, bahkan ketika "omg, tidak ada yangposition
ditentukan!", Spesifikasi menyebutkan konsep konteks susun , yang dijelaskan dengan baik oleh artikel ini di MDNfloat: right
(atau cara lain untuk membalik urutan, yangflex/order
memiliki sedikit (paling sedikit?) Efek samping). Mengocok dua biola: mendemonstrasikanfloat: right
pendekatan , dan mendemonstrasikandirection: rtl
Saya memiliki pertanyaan yang sama, tetapi kemudian saya memiliki momen "duh". Alih-alih menulis
menulis
Jelas ini cocok dengan "x" bukan "y", tetapi menjawab "apakah ada kecocokan?" pertanyaan, dan traversal DOM sederhana dapat membuat Anda ke elemen yang tepat lebih efisien daripada perulangan di javascript.
Saya menyadari bahwa pertanyaan awal adalah pertanyaan CSS jadi jawaban ini mungkin sama sekali tidak relevan, tetapi pengguna Javascript lain mungkin tersandung pada pertanyaan melalui pencarian seperti yang saya lakukan.
sumber
y ~ x
bisa menyelesaikan masalah sayay ~ x
tidak menjawab "apakah ada kecocokan?" pertanyaan, karena dua penyeleksi yang diberikan di sini berarti hal yang sama sekali berbeda. Tidak ada cara yangy ~ x
bisa menghasilkan kecocokan mengingat subtree<root><x/><y/></root>
misalnya. Jika pertanyaannya adalah "apakah Anda ada?" maka pemilihnya sederhana sajay
. Jika pertanyaannya adalah "apakah Anda ada diberikan saudara x dalam posisi sewenang-wenang?" maka Anda akan membutuhkan kedua penyeleksi. (Meskipun mungkin aku hanya nitpicking pada saat ini ...)Dua trik . Pada dasarnya membalikkan urutan HTML elemen yang Anda inginkan dalam HTML dan menggunakan
~
operator saudara kandung berikutnya :float-right
+ membalik urutan elemen HTMLInduk dengan
direction: rtl;
+ terbalik urutan elemen dalamsumber
Anda dapat menggunakan dua penyeleksi kapak :
!
dan?
Ada 2 penyeleksi saudara berikutnya dalam CSS konvensional:
+
adalah yang langsung pemilih saudara berikutnya~
adalah setiap pemilih saudara berikutnyaDalam CSS konvensional, tidak ada pemilih saudara sebelumnya .
Namun, di pustaka pasca-prosesor kapak CSS, ada 2 penyeleksi saudara sebelumnya :
?
adalah pemilih saudara langsung sebelumnya (kebalikan dari+
)!
adalah setiap pemilih saudara sebelumnya (kebalikan dari~
)Contoh kerja:
Dalam contoh di bawah ini:
.any-subsequent:hover ~ div
memilih yang selanjutnyadiv
.immediate-subsequent:hover + div
memilih yang selanjutnya langsungdiv
.any-previous:hover ! div
memilih yang sebelumnyadiv
.immediate-previous:hover ? div
memilih yang sebelumnya langsungdiv
sumber
Solusi flexbox lainnya
Anda dapat menggunakan urutan elemen terbalik dalam HTML. Kemudian selain menggunakan
order
seperti pada jawaban Michael_B Anda dapat menggunakanflex-direction: row-reverse;
atauflex-direction: column-reverse;
tergantung pada tata letak Anda.Sampel kerja:
sumber
Tidak ada cara resmi untuk melakukan itu saat ini tetapi Anda dapat menggunakan sedikit trik untuk mencapai ini! Ingat bahwa ini eksperimental dan memiliki beberapa batasan ... (periksa tautan ini jika Anda khawatir tentang kompatibilitas navigator)
Yang bisa Anda lakukan adalah menggunakan pemilih CSS3: pseudo classe dipanggil
nth-child()
Keterbatasan
sumber
:nth-child(-n+4)
kelas pseudo yang perlu diterapkan ke pemilih agar berfungsi dengan benar. Jika Anda tidak yakin, cobalah untuk bereksperimen menggunakan garpu biola saya dan Anda akan melihat bahwa itu tidak wajan*
pemilih, tapi itu praktik buruk.li#someListItem
dan saya ingin simpul yang tepat sebelum itu (yang bagaimana saya mengartikan "sebelumnya") - Saya tidak melihat bagaimana informasi yang Anda berikan dapat membantu saya mengungkapkannya melalui CSS. Anda hanya memilih n saudara pertama, dan anggap saya tahu n. Berdasarkan logika ini, pemilih dapat melakukan trik dan memilih elemen yang saya butuhkan (seperti: tidak ()).Jika Anda tahu posisi pasti dan
:nth-child()
pengecualian berbasis semua saudara berikut akan bekerja.Yang akan memilih semua
li
s sebelum tanggal 3 (mis. 1 dan 2). Tapi, menurut saya ini terlihat jelek dan memiliki usecase yang sangat ketat.Anda juga dapat memilih anak ke-kanan-ke-kiri:
Yang melakukan hal yang sama.
sumber
Tidak. Itu tidak mungkin melalui CSS. Dibutuhkan "Cascade" di hati ;-).
Namun, jika Anda dapat menambahkan JavaScript ke halaman Anda, sedikit jQuery dapat membawa Anda ke tujuan akhir Anda.
Anda dapat menggunakan jQuery's
find
untuk melakukan "pandangan ke depan" pada elemen target / kelas / id Anda, lalu mundur untuk memilih target Anda.Kemudian Anda menggunakan jQuery untuk menulis ulang DOM (CSS) untuk elemen Anda.
Berdasarkan jawaban ini oleh Mike Brant , cuplikan jQuery berikut dapat membantu.
Ini pertama memilih semua
<ul>
yang segera mengikuti a<p>
.Lalu "backtracks" untuk memilih semua sebelumnya
<p>
dari set<ul>
s.Secara efektif, "saudara sebelumnya" telah dipilih melalui jQuery.
Sekarang, gunakan
.css
fungsi untuk meneruskan nilai baru CSS Anda untuk elemen itu.Dalam kasus saya, saya sedang mencari cara untuk memilih DIV dengan id
#full-width
, tetapi HANYA jika memiliki DIV turunan (tidak langsung) dengan kelas.companies
.Saya memiliki kendali atas semua HTML di bawah
.companies
, tetapi tidak dapat mengubah HTML apa pun di atasnya.Dan kaskade hanya berjalan 1 arah: turun.
Jadi saya bisa memilih SEMUA
#full-width
s.Atau saya bisa memilih
.companies
yang hanya mengikuti a#full-width
.Tetapi saya tidak dapat memilih hanya
#full-width
s yang melanjutkan.companies
.Dan, sekali lagi, saya tidak dapat menambahkan
.companies
lebih tinggi di HTML. Bagian HTML itu ditulis secara eksternal, dan dibungkus dengan kode kami.Tetapi dengan jQuery, saya dapat memilih yang diperlukan
#full-width
, kemudian menetapkan gaya yang sesuai:Ini menemukan semua
#full-width .companies
, dan memilih hanya itu.companies
, mirip dengan bagaimana penyeleksi digunakan untuk menargetkan elemen tertentu dalam standar di CSS.Kemudian ia digunakan
.parents
untuk "mundur" dan memilih SEMUA orang tua dari.companies
,tetapi memfilter hasil tersebut untuk menjaga hanya
#fill-width
elemen, sehingga pada akhirnya,itu hanya memilih
#full-width
elemen jika memiliki.companies
turunan kelas.Akhirnya, ia memberikan nilai CSS (
width
) baru ke elemen yang dihasilkan.Dokumen Referensi jQuery:
$ () atau jQuery () : elemen DOM.
. find : Dapatkan turunan dari setiap elemen dalam set elemen yang cocok saat ini, difilter oleh pemilih, objek jQuery, atau elemen.
. orangtua : Dapatkan saudara kandung yang sebelumnya mendahului setiap unsur dalam rangkaian unsur yang cocok. Jika pemilih disediakan, ia hanya mengambil saudara sebelumnya jika cocok dengan pemilih itu (memfilter hasilnya hanya menyertakan elemen / pemilih yang terdaftar).
. css : Tetapkan satu atau lebih properti CSS untuk set elemen yang cocok.
sumber
previousElementSibling
).previousElementSibling()
bagi mereka yang lebih akrab dengan fungsi asli JS DOM bisa memberikan lain jalur non-CSS ke depan.+
pemilih (tidak ada) yang diminta OP secara khusus. Pertimbangkan jawaban ini sebagai "retasan" JS. Ini di sini untuk menghemat waktu orang lain yang saya habiskan untuk menemukan solusi.Sayangnya tidak ada pemilih saudara "sebelumnya", tetapi Anda mungkin masih bisa mendapatkan efek yang sama dengan menggunakan pemosisian (mis. Float right). Itu tergantung pada apa yang Anda coba lakukan.
Dalam kasus saya, saya terutama menginginkan sistem peringkat bintang 5 CSS. Saya perlu mewarnai (atau menukar ikon) bintang-bintang sebelumnya. Dengan mengapung setiap elemen dengan benar, pada dasarnya saya mendapatkan efek yang sama (html untuk bintang-bintang karenanya harus ditulis 'mundur').
Saya menggunakan FontAwesome dalam contoh ini dan bertukar antara unicodes fa-star-o dan fa-star http://fortawesome.github.io/Font-Awesome/
CSS:
HTML: (40)
JSFiddle: http://jsfiddle.net/andrewleyva/88j0105g/
sumber
+
atau~
penyeleksi memukul saya sebagai pekerjaan paling bersih di sekitar.Bergantung pada tujuan pasti Anda, ada cara untuk mencapai kegunaan pemilih orang tua tanpa menggunakan satu (bahkan jika ada) ...
Katakanlah kita memiliki:
Apa yang bisa kita lakukan untuk membuat blok Socks (termasuk warna kaus kaki) menonjol secara visual menggunakan spasi?
Apa yang baik tetapi tidak ada:
Apa yang ada:
Ini menetapkan semua tautan jangkar untuk memiliki margin 15px di bagian atas dan mengembalikannya kembali ke 0 untuk mereka yang tidak memiliki elemen UL (atau tag lain) di dalam LI.
sumber
Saya membutuhkan solusi untuk memilih saudara kandung sebelumnya. Saya datang dengan solusi ini menggunakan komponen React dan Styled. Ini bukan solusi tepat saya (Ini dari memori, beberapa jam kemudian). Saya tahu ada cacat pada fungsi setHighlighterRow.
OnMouseOver baris akan mengatur indeks baris untuk menyatakan, dan rerender baris sebelumnya dengan warna latar belakang baru
sumber
Tidak ada, dan ada .
Jika Anda harus menempatkan label sebelum input, alih-alih menempatkan label setelah input, simpan label & input di dalam div, dan gaya div sebagai berikut:
Sekarang Anda dapat menerapkan opsi penataan saudara kandung standar berikutnya yang tersedia di css, dan itu akan tampak seperti Anda menggunakan penataan saudara kandung sebelumnya.
sumber
Saya memiliki masalah yang sama dan menemukan bahwa semua masalah seperti ini dapat diselesaikan sebagai berikut:
dan dengan cara ini Anda akan dapat menata item Anda saat ini, item sebelumnya (semua item diganti dengan item saat ini dan berikutnya) dan item berikutnya.
contoh:
Semoga ini bisa membantu seseorang.
sumber