検索
ホームページウェブフロントエンドCSSチュートリアルCascadeをBEMと最新のCSSセレクターで飼育します

Taming the Cascade With BEM and Modern CSS Selectors

bem。フロントエンド開発のほとんどすべてのテクノロジーと同様に、BEM形式でCSSを作成すると偏光を引き起こす可能性があります。しかし、私のTwitterのソーシャルサークルでは、少なくとも人気のあるCSSメソッドの1つです。

私は個人的にBemは良いと思います、そしてあなたはそれを使うべきだと思います。しかし、私はあなたがそれを使用しない理由も理解することができます。

BEMの意見が何であれ、それはいくつかの利点を提供します。最大の利点は、CSSカスケードでの特定の紛争を回避するのに役立つことです。これは、適切に使用すると、BEM形式で記述されたセレクターが同じ特異性スコア(0,1,0)を持つ必要があるためです。長年にわたり、私は多くの大規模なWebサイト(政府、大学、銀行を考えてください)にCSSを設計しました。これらの大きなプロジェクトは、Bemが本当に輝く場所を発見しました。 CSSを書くことは、あなたが書いたり編集しているスタイルがウェブサイトの他の部分に影響しないことを確信している場合、より楽しいです。

実際、場合によっては、特異性を追加することは完全に受け入れられると見なされます。たとえば、:hoverおよび:focusや::beforeなど、特異性スコアは0,1,1です。ただし、この記事の残りの部分では、他の特定の広がりを期待していないと仮定しましょう。 ?::after

しかし、私は本当にあなたにベムを売りたくありません。代わりに、より強力なカスケード制御のために、最新のCSSセレクター(例:

:is():has()など)と組み合わせてどのように使用するかについてお話したいと思います。 :where()

最新のCSSセレクターとは何ですか?

CSSセレクターレベル4仕様は、要素を選択するための強力で比較的新しい方法を提供します。私のお気に入りには、すべての最新のブラウザでサポートされており、ほとんどすべてのプロジェクトで安全に使用できるようになっている

:is():where()が含まれます。 :not()

および:is()は基本的に同じですが、特異性に異なる効果があることを除いて。具体的には、:where()の特異性スコアは常に0,0,0です。はい、:where()さえ具体的ではありません。同時に、:where(button#widget.some-class)の特異性は、パラメーターリストの最も特定の要素の特異性です。したがって、使用できる2つの最新のセレクター間のカスケード仕上げに既に違いがあります。 :is()

強力な

リレーショナル擬似クラスもブラウザのサポートをすぐに獲得しています(私の意見では、これはグリッド以来のCSSの最大の新機能です)。ただし、執筆時点では、:has()のブラウザサポートは、生産環境で使用するのに十分ではありません。 :has()

私のbemに擬似クラスを追加させてください...

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

ああ、いや!その特定のスコアを見たことがありますか? BEMを使用すると、セレクターが0,1,0の特定のスコアを持つことを理想的に期待しています。なぜ0,2,0が良くないのですか?同様の拡張例を考えてみましょう:

<code>.something:not(a) {
  color: red;
}
.something--special {
  color: blue;
}</code>
2番目のセレクターがソースコードシーケンスに最終的に表示された場合でも、最初のセレクターのより高い特異性(0,1,1)が勝ち、

要素の色は赤に設定されます。つまり、BEMが正しく記述され、選択された要素がHTMLの.something--specialベースクラスと.somethingモディファイアクラスの両方を適用していると仮定します。 .something--special

不適切に使用すると、これらの擬似クラスは予期せぬ方法でカスケードに影響を与える可能性があります。特に、より大きく複雑なコードベースで、後でトラブルを引き起こす可能性があるのは、これらの矛盾です。

ああ。では、今何をすべきか?

私が今言ったことを覚えています

そしてその特異性はゼロですか?これを活用できます::where()

このセレクターの最初の部分(
<code>/* ✅ 特异性分数:0,1,0 */
.something:where(:not(.something--special)) {
  /* 等 */
}</code>
)は、通常の特異性スコア0,1,0を取得します。しかし、

- およびそのすべての特異性は0であり、セレクターの特異性をさらに高めることはありません。 .something :where():ここで、()により

をネストすることができます

私と同じように特異性についてあまり気にしない人(そして、おそらく多くの人が公平であるため)は、営巣にうまくやっています。いくつかのランダムなキーボードタイピングを使用すると、このようなCSSを取得する可能性があります(SASSを使用してシンプルさを使用していることに注意してください):

この例では、この例では

コンポーネントがあります。 (
<code>.card { ... }

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

.card__title { ... }
.card__img { ... }</code>
クラスを使用)「注目」カードの場合、カードのタイトルと画像は異なるスタイルである必要があります。ただし、現在ご存知のように、上記のコードによって引き起こされる特異性スコアは、システムの残りの部分と矛盾しています。

.card頑固な特定の狂信者はこれを行うかもしれません:.card--featured 悪くないよね?率直に言って、これはかなりのCSSです。

ただし、HTMLには欠点もあります。経験豊富なBEMの著者は、複数の要素にモディファイアクラスを条件付けて適用するには、複雑なテンプレートロジックが必要であることを痛々しいほど認識しているかもしれません。この例では、HTMLテンプレートは、

modifierクラスを3つの要素(

<code>.card { ... }
.card--featured { ... }
.card__title { ... }
.card__title--featured { ... }
.card__img { ... }
.card__img--featured { ... }</code>
、および

)に条件付きで追加する必要がありますが、実際の例では、より多くの要素を追加する必要があります。声明がたくさんあります。

--featuredセレクターは、特異性レベルを上げることなく、より少ないテンプレートロジックとBEMクラスの少ない書き込みを作成するのに役立ちます。 .card .card__title .card__img以下はSASSのコンテンツと同じです(トレーリング対トレーニングに注意してください):

:where()モディファイアクラスをさまざまな子要素に適用する代わりにこの方法を選択する必要があるかどうかは、個人の好みに依存します。しかし、少なくとも

今では選択肢があります!
<code>.card { ... }
.card--featured { ... }

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

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

bem htmlをお持ちでない場合はどうすればよいですか?

私たちは不完全な世界に住んでいます。時には、あなたのコントロールを超えたHTMLに対処する必要があります。たとえば、HTMLをスタイリングする必要があるサードパーティスクリプトを挿入します。これらのタグは通常、BEMクラス名を使用して書かれていません。場合によっては、これらのスタイルはクラスをまったく使用しませんが、IDです!

同様に、:where()この問題を解決するのにも役立ちます。このソリューションは、存在することがわかっているDOMツリーのクラスを参照する必要があるため、少し不器用です。

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

を引用して、親要素は少し危険で制限的だと感じます。親クラスが変更された場合、または何らかの理由で存在しない場合はどうなりますか?より良い(しかしおそらく同様に不器用な)ソリューションは、代わりに:is()を使用することです。 :is()の特異性は、そのセレクターリストの中で最も特定のセレクターに等しいことに注意してください。

したがって、上記の例のように

を使用するのではなく、:is()を使用して、存在する(または希望!)存在するクラスを参照することができます。 :where()

<code>.something:not(a) {
  color: red;
}
.something--special {
  color: blue;
}</code>
常に存在する

は、body要素を選択するのに役立ち、同じ#widgetクラスの存在は:is()セレクターをクラスと同じ特異性スコア(0,1,0)にします。 .dummy-class bodyそれだけです! :where() これは、CSSをBEM形式で作成する際に得られた

および

がサポートされると、その特異性を元に戻すために

と組み合わせることができます。 :is() :where()あなたがBEMと完全に命名しているかどうかにかかわらず、セレクターの特異性が良いことであることに同意できることを願っています! :has()

以上がCascadeをBEMと最新のCSSセレクターで飼育しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
@KeyFrames対CSSトランジション:違いは何ですか?@KeyFrames対CSSトランジション:違いは何ですか?May 14, 2025 am 12:01 AM

@keyframesandcsstransitionsdifferincomplexity:@keyframesallowsfordeTailedAnimationのシーケンス、whilecsstransitionshandlesimplestatechanges.usecsstransitionsは、ButtonColorChanges、および@keyframesforintricateanimationslikerotatingingspinnnersを使用します。

静的サイトコンテンツ管理にページCMSを使用します静的サイトコンテンツ管理にページCMSを使用しますMay 13, 2025 am 09:24 AM

私は知っています、私は知っています:たくさんのコンテンツ管理システムオプションが利用可能であり、私はいくつかテストしましたが、実際にはY&#039;知っているものはありませんでしたか?奇妙な価格設定モデル、困難なカスタマイズ、一部は全体になることさえあります&

HTMLのCSSファイルをリンクするための究極のガイドHTMLのCSSファイルをリンクするための究極のガイドMay 13, 2025 am 12:02 AM

CSSファイルをHTMLにリンクすることは、HTMLの一部で要素を使用することで実現できます。 1)タグを使用して、ローカルCSSファイルをリンクします。 2)複数のタグを追加することにより、複数のCSSファイルを実装できます。 3)外部CSSファイルは、そのような絶対URLリンクを使用します。 4)ファイルパスとCSSファイルの読み込み順序の正しい使用を確認し、パフォーマンスを最適化すると、CSSプリプロセッサを使用してファイルをマージできます。

CSS Flexbox vsグリッド:包括的なレビューCSS Flexbox vsグリッド:包括的なレビューMay 12, 2025 am 12:01 AM

FlexBoxまたはグリッドの選択は、レイアウト要件によって異なります。1)FlexBoxは、ナビゲーションバーなどの1次元レイアウトに適しています。 2)グリッドは、雑誌のレイアウトなどの2次元レイアウトに適しています。この2つは、レイアウト効果を改善するためにプロジェクトで使用できます。

CSSファイルを含める方法:メソッドとベストプラクティスCSSファイルを含める方法:メソッドとベストプラクティスMay 11, 2025 am 12:02 AM

CSSファイルを含める最良の方法は、タグを使用してHTMLパーツに外部CSSファイルを導入することです。 1.タグを使用して、外部CSSファイルを導入します。 2。小さな調整のために、インラインCSSを使用できますが、注意して使用する必要があります。 3.大規模プロジェクトでは、@Importを介して他のCSSファイルをインポートするために、SASS以下などのCSSプリプロセッサを使用できます。 4。パフォーマンスのために、CSSファイルをマージし、CDNを使用し、CSSNANOなどのツールを使用して圧縮する必要があります。

FlexBox対グリッド:両方を学ぶべきですか?FlexBox対グリッド:両方を学ぶべきですか?May 10, 2025 am 12:01 AM

はい、Youはrelearnbothlexboxandgrid.1)FlexBoxisidealforone-Dimensional、FlexiblleayoutslikenavigationMenus.2)Gridexcelsintwo-digsignssuchasmagazinelayouts.3)Bothenhanceslaysutibulivedibulisunivedivition、floctonsulururを

軌道力学(またはCSSキーフレームアニメーションの最適化方法)軌道力学(またはCSSキーフレームアニメーションの最適化方法)May 09, 2025 am 09:57 AM

独自のコードをリファクタリングするのはどのように見えますか?ジョン・レアは、彼が書いた古いCSSアニメーションを選び、それを最適化するという思考プロセスを歩きます。

CSSアニメーション:それらを作成するのは難しいですか?CSSアニメーション:それらを作成するのは難しいですか?May 09, 2025 am 12:03 AM

cssanimationsArenotintinlentyhardbutrepracticeanderstanding ofcsspropertiesandtimingfunctions.1)

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい