cari
Rumahhujung hadapan webtutorial cssMenjinakkan lata dengan pemilih BEM dan moden CSS

Taming the Cascade With BEM and Modern CSS Selectors

bem. Seperti hampir semua teknologi dalam pembangunan front-end, menulis CSS dalam format BEM boleh menyebabkan polarisasi. Tetapi dalam bulatan sosial Twitter saya, ia adalah sekurang -kurangnya salah satu kaedah CSS yang lebih popular.

Saya secara peribadi berfikir BEM adalah baik dan saya fikir anda harus menggunakannya. Tetapi saya juga dapat memahami mengapa anda mungkin tidak menggunakannya.

Apa pun pendapat anda tentang BEM, ia menawarkan beberapa faedah, manfaat terbesar ialah ia membantu mengelakkan konflik tertentu dalam lata CSS. Ini kerana, jika digunakan dengan betul, mana -mana pemilih yang ditulis dalam format BEM harus mempunyai skor kekhususan yang sama (0,1,0). Selama bertahun -tahun, saya telah merancang CSS untuk banyak laman web besar (berfikir kerajaan, universiti, dan bank) dan ini adalah projek -projek besar yang membuat saya dapati di mana BEM benar -benar bersinar. Menulis CSS lebih menyeronokkan apabila anda yakin bahawa gaya yang anda tulis atau penyuntingan tidak menjejaskan bahagian lain di laman web.

Malah, dalam beberapa kes, menambah kekhususan dianggap benar -benar boleh diterima. Contohnya: kelas pseudo. Skor kekhususan mereka ialah 0,2,0. Yang lain adalah pseudo-elements-contohnya, :hover dan :focus-skor kekhususan itu adalah 0,1,1. Walau bagaimanapun, dalam artikel ini, marilah kita mengandaikan bahawa kita tidak mengharapkan penyebaran khusus lain. ? ::before ::after Tetapi saya tidak mahu menjual bem anda. Sebaliknya, saya ingin bercakap tentang bagaimana kita menggunakannya bersempena dengan pemilih CSS moden (mis. ,

, :is(), dan lain -lain) untuk kawalan cascade yang lebih kuat. :has() :where() Apakah pemilih CSS moden?

Spesifikasi CSS Selector Level 4 memberikan kita beberapa cara yang kuat dan agak baru untuk memilih elemen. Beberapa kegemaran saya termasuk

,

dan :is(), yang semuanya disokong oleh semua pelayar moden dan kini selamat digunakan dalam hampir mana -mana projek. :where() :not()

dan

pada dasarnya sama, kecuali bahawa mereka mempunyai kesan yang berbeza terhadap kekhususan. Khususnya, skor kekhususan :is() sentiasa 0,0,0. Ya, walaupun :where() tidak spesifik. Pada masa yang sama, kekhususan :where() adalah kekhususan elemen yang paling spesifik dalam senarai parameternya. Oleh itu, kita sudah mempunyai perbezaan dalam penamat Cascade antara dua pemilih moden yang boleh digunakan. :where(button#widget.some-class) :is() kelas pseudo yang kuat juga cepat mendapat sokongan pelayar (pada pendapat saya, ini adalah ciri baru CSS terbesar sejak grid). Walau bagaimanapun, pada masa penulisan, sokongan penyemak imbas untuk

tidak cukup baik untuk digunakan dalam persekitaran pengeluaran.

:has() izinkan saya menambah kelas pseudo ke bem saya ... :has()

<code>/* ❌ 特异性分数:0,2,0 */
.something:not(.something--special) {
  /* 所有 something 的样式,除了特殊的 something */
}</code>

oh tidak! Pernahkah anda melihat skor khusus itu? Ingat, dengan BEM, kami dengan idealnya mengharapkan pemilih kami mempunyai skor tertentu sebanyak 0,1,0. Mengapa 0,2,0 tidak baik? Pertimbangkan contoh lanjutan yang sama:

<code>.something:not(a) {
  color: red;
}
.something--special {
  color: blue;
}</code>

Walaupun pemilih kedua akhirnya muncul dalam urutan kod sumber, kekhususan yang lebih tinggi pemilih pertama (0,1,1) akan menang, dan warna unsur .something--special akan ditetapkan ke merah. Iaitu, anggap bahawa BEM anda ditulis dengan betul dan elemen yang dipilih menggunakan kedua -dua kelas asas .something dan kelas pengubah .something--special dalam HTML.

Jika digunakan secara tidak wajar, kelas pseudo ini boleh menjejaskan lata dengan cara yang tidak dijangka. Ia adalah ketidakkonsistenan yang boleh menyebabkan masalah kemudian, terutamanya dalam pangkalan kod yang lebih besar dan lebih kompleks.

oh. Jadi apa yang perlu dilakukan sekarang?

ingat apa yang saya katakan :where() dan kekhususannya adalah sifar? Kita boleh memanfaatkannya:

<code>/* ✅ 特异性分数:0,1,0 */
.something:where(:not(.something--special)) {
  /* 等 */
}</code>

Bahagian pertama pemilih ini (.something) memperoleh skor kekhususan biasa 0,1,0. Tetapi kekhususan :where() -dan segala -galanya di dalamnya -adalah 0, dan tidak lagi meningkatkan kekhususan pemilih.

: di mana () membolehkan kita bersarang

Mereka yang tidak peduli tentang kekhususan seperti yang saya lakukan (dan bersikap adil, mungkin banyak orang) telah melakukan yang baik dalam bersarang. Dengan beberapa menaip papan kekunci rawak, kami mungkin mendapat CSS seperti ini (perhatikan bahawa saya menggunakan sass untuk kesederhanaan):

<code>.card { ... }

.card--featured {
  /* 等 */  
  .card__title { ... }
  .card__title { ... }
}

.card__title { ... }
.card__img { ... }</code>

Dalam contoh ini, kita mempunyai komponen .card. Apabila ia adalah kad "dipaparkan" (menggunakan kelas .card--featured), tajuk dan imej kad perlu menjadi gaya yang berbeza. Walau bagaimanapun, seperti yang kita ketahui sekarang, skor kekhususan yang disebabkan oleh kod di atas tidak konsisten dengan sistem kami yang lain. Fanatik khusus yang degil mungkin melakukan ini:

tidak buruk, bukan? Terus terang, ini adalah CSS yang cantik.
<code>.card { ... }
.card--featured { ... }
.card__title { ... }
.card__title--featured { ... }
.card__img { ... }
.card__img--featured { ... }</code>
Walau bagaimanapun, HTML juga mempunyai kelemahannya. Penulis BEM yang berpengalaman mungkin menyedari bahawa logik templat kompleks diperlukan untuk menggunakan kelas pengubahsuaian secara kondusif untuk pelbagai elemen. Dalam contoh ini, templat HTML perlu menambahkan kelas pengubahsuaian

kepada tiga elemen (

,

, dan --featured), tetapi mungkin lebih banyak dalam contoh dunia nyata. Terdapat banyak jika kenyataan. .card Pemilih .card__title .card__img boleh membantu kami menulis kurang logik template -dan kurang kelas BEM -tanpa meningkatkan tahap kekhususan.

:where() Berikut adalah kandungan yang sama dalam SASS (perhatikan trailing versus):

<code>.card { ... }
.card--featured { ... }

.card__title { ... }
:where(.card--featured) .card__title { ... }

.card__img { ... }
:where(.card--featured) .card__img { ... }</code>

sama ada anda harus memilih kaedah ini dan bukannya menggunakan kelas pengubah kepada pelbagai elemen kanak -kanak bergantung kepada keutamaan peribadi. Tetapi sekurang -kurangnya

sekarang kita mempunyai pilihan!
<code>.card { ... }
.card--featured { ... }
.card__title { 
  /* 等 */ 
  :where(.card--featured) & { ... }
}
.card__img { 
  /* 等 */ 
  :where(.card--featured) & { ... }
}</code>

Apa yang harus saya lakukan jika saya tidak mempunyai BEM HTML?

kita hidup dalam dunia yang tidak sempurna. Kadang -kadang anda perlu berurusan dengan HTML yang berada di luar kawalan anda. Sebagai contoh, suntikan skrip pihak ketiga yang anda perlukan untuk gaya HTML. Tag ini biasanya tidak ditulis menggunakan nama kelas BEM, dan dalam beberapa kes, gaya ini tidak menggunakan kelas sama sekali, tetapi ID!

Begitu juga, :where() juga boleh membantu kita menyelesaikan masalah ini. Penyelesaian ini agak kekok kerana kita perlu merujuk kepada kelas di dalam pokok Dom yang kita tahu ada.

<code>/* ❌ 特异性分数:0,2,0 */
.something:not(.something--special) {
  /* 所有 something 的样式,除了特殊的 something */
}</code>

memetik elemen induk terasa sedikit berisiko dan ketat. Bagaimana jika kelas induk berubah atau tidak wujud atas sebab tertentu? Penyelesaian yang lebih baik (tetapi mungkin sama -sama canggung) adalah menggunakan :is() sebaliknya. Ingat bahawa kekhususan :is() adalah sama dengan pemilih yang paling spesifik dalam senarai pemilihnya.

jadi kita boleh menggunakan :is() untuk merujuk kepada kelas yang kita tahu (atau harapan!) Ada, bukannya menggunakan :where() seperti dalam contoh di atas.

<code>.something:not(a) {
  color: red;
}
.something--special {
  color: blue;
}</code>

yang sentiasa sedia ada body akan membantu kami memilih elemen #widget, dan kehadiran kelas :is() dalam .dummy-class yang sama akan menjadikan pemilih body mempunyai skor kekhususan yang sama (0,1,0) sebagai kelas ... dan gunakan :where() untuk memastikan pemilih tidak lebih spesifik daripada ini.

itu sahaja!

Ini adalah bagaimana kita mengambil kesempatan daripada keupayaan pengurusan khusus moden :is() dan :where() kelas pseudo dan keupayaan pencegahan konflik tertentu yang diperoleh ketika menulis CSS dalam format BEM. Dalam masa terdekat, sekali :has() disokong oleh Firefox (ia kini disokong di belakang logo pada masa penulisan), kita mungkin mahu memasangkannya dengan :where() untuk membatalkan kekhususannya.

Sama ada anda menamakan sepenuhnya dengan BEM atau tidak, saya harap kami boleh bersetuju bahawa kekhususan pemilih adalah perkara yang baik!

Atas ialah kandungan terperinci Menjinakkan lata dengan pemilih BEM dan moden CSS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Gaya CSS peringkat seterusnya untuk kursorGaya CSS peringkat seterusnya untuk kursorApr 23, 2025 am 11:04 AM

Kursor adat dengan CSS adalah hebat, tetapi kita boleh mengambil sesuatu ke peringkat seterusnya dengan JavaScript. Menggunakan JavaScript, kita boleh beralih antara negeri kursor, letakkan teks dinamik dalam kursor, gunakan animasi kompleks, dan gunakan penapis.

Dunia bertembung: Pengesanan Perlanggaran Kerangka Key menggunakan pertanyaan gayaDunia bertembung: Pengesanan Perlanggaran Kerangka Key menggunakan pertanyaan gayaApr 23, 2025 am 10:42 AM

Animasi CSS interaktif dengan unsur -unsur yang menghilangkan satu sama lain kelihatan lebih masuk akal pada tahun 2025. Walaupun tidak perlu untuk melaksanakan pong dalam CSS, peningkatan fleksibiliti dan kuasa CSS mengukuhkan kecurigaan Lee '

Menggunakan penapis latar belakang CSS untuk kesan UIMenggunakan penapis latar belakang CSS untuk kesan UIApr 23, 2025 am 10:20 AM

Petua dan cara untuk menggunakan harta penapis latar belakang CSS ke antara muka pengguna gaya. Anda akan belajar bagaimana untuk meletakkan penapis latar belakang di antara pelbagai elemen, dan mengintegrasikannya dengan kesan grafik CSS yang lain untuk membuat reka bentuk yang rumit.

SMIL ON?SMIL ON?Apr 23, 2025 am 09:57 AM

Nah, ternyata ciri-ciri animasi terbina dalam SVG ' s tidak pernah ditamatkan seperti yang dirancang. Pasti, CSS dan JavaScript lebih mampu membawa beban, tetapi ia baik untuk mengetahui bahawa SMIL tidak mati di dalam air seperti sebelumnya

'Cantik' berada di mata penonton'Cantik' berada di mata penontonApr 23, 2025 am 09:40 AM

Yay, let ' s melompat untuk teks-wrap: Pretty Landing dalam Pratonton Teknologi Safari! Tetapi berhati -hatilah bahawa ia ' s berbeza dari bagaimana ia berfungsi dalam pelayar kromium.

CSS-Tricks Chronicles XLIIICSS-Tricks Chronicles XLIIIApr 23, 2025 am 09:35 AM

Kemas kini trik CSS ini menyoroti kemajuan yang ketara dalam almanak, penampilan podcast baru-baru ini, panduan kaunter CSS baru, dan penambahan beberapa penulis baru yang menyumbang kandungan berharga.

Ciri tailwind ' s @ply lebih baik daripada bunyiCiri tailwind ' s @ply lebih baik daripada bunyiApr 23, 2025 am 09:23 AM

Kebanyakan masa, orang mempamerkan ciri-ciri Tailwind ' Apabila dipamerkan dengan cara ini, @apply tidak menjanjikan sama sekali. Jadi obvio

Rasa seperti saya tidak mempunyai pelepasan: perjalanan ke arah penyebaran yang warasRasa seperti saya tidak mempunyai pelepasan: perjalanan ke arah penyebaran yang warasApr 23, 2025 am 09:19 AM

Menggunakan seperti idiot datang ke ketidakcocokan antara alat yang anda gunakan untuk menggunakan dan ganjaran dalam kerumitan dikurangkan berbanding kerumitan yang ditambah.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan