CSSセレクター「(AまたはB)およびC」?


176

これは簡単なはずですが、検索キーワードを見つけるのに苦労しています。
私がこれを持っているとしましょう:

<div class="a c">Foo</div>
<div class="b c">Bar</div>

CSSでは、「(。aまたは.b)および.c」に一致するセレクターをどのように作成できますか?

私はこれができると知っています:

.a.c,.b.c {
  /* CSS stuff */
}

しかし、私がこの種のロジックをさまざまな論理的な組み合わせで何度も実行する必要があると仮定すると、より良い構文はありますか?


Internet Explorer 6をサポートする必要がある場合は注意してください。CSSセレクターで複数のクラス名が無視されるためです。
fforw

24
幸い、このプロジェクトでは、IE6ユーザーに自分でアップグレードするように指示できます。
Josh

12
わかりやすくするために、常にカンマの後に改行、または少なくともスペースを入れようとしています。
ANeves、2011

2
新しい行の@ANeves +1。これは、特にソース管理を使用する場合、私の意見では最良のアプローチです。
Curt

回答:


149

より良い構文はありますか?

いいえ。CSSのor演算子(,)はグループ化を許可していません。これは本質的にセレクターで最も優先順位の低い論理演算子であるため、を使用する必要があります.a.c,.b.c


25

まだですが、それだけを行う実験的:matches()な疑似クラス関数があります。

:matches(.a .b) .c {
  /* stuff goes here */
}

詳細については、こちらこちらをご覧ください。現在、ほとんどのブラウザ:any()は同じように機能する初期バージョンをサポートしていますが、に置き換えられ:matches()ます。これをどこでも使用する前に、もう少し待つ必要があります(きっとそうなるでしょう)


彼らが単に考えたこともないし、そもそも草稿になかったものを実装しなかったとしてIEを非難することは不合理です。:-moz-any()そして、:-webkit-any()Mozillaがセレクター4のために提案するずっと前に現れました(現在の化身としては:matches())。
BoltClock

1
ドラフトが利用可能になった期間に関係なく、ベンダが不安定なドラフトから機能を実装することを期待することも同様に不合理です(これは、セレクタ4が不安定であり、FPWDから3年以上経過してもほとんど未実装であることを説明するためです) 。
BoltClock

@BoltClock、彼らは2001年には存在しなかった事柄についてIE6を10年間非難していた。人々は誰かのせいにしたいだけだ。
GetFree 2015

実験的なものに関する一言は、正式に実装されない限り、それらに依存し始めたくないということです。それは素晴らしい解決策のように見えるかもしれませんが-それが消えてしまう可能性は、私が自分のプロジェクトにそれを実装することを個人的に妨げています。1つの実験的な疑似クラスを追跡しても、安全だとは感じません。ほとんどの場合、プロジェクト内の複数の場所で使用されます。また、使用する場所が複数ある場合は、何とかしてすべてを追跡する必要があります。あなたは確かにフォールバックを持つことができ、それでもそれを引き離すことができますが、それはきれいに聞こえません
Alexey Shevelyov

Uncaught DOMException: Failed to execute 'querySelector' on 'Document': ':any(.a .b)' is not a valid selector.エラーが発生するのは私だけですか?🤔–
トーマス

12

これがあれば:

<div class="a x">Foo</div>
<div class="b x">Bar</div>
<div class="c x">Baz</div>

そして、あなたは.xand(.aまたは.b)を持っている要素を選択したいだけです、あなたは書くことができます:

.x:not(.c) { ... }

ただし、3つの「サブクラス」があり、そのうちの2つを選択する場合にのみ便利です。

サブクラスを1つだけ選択する(例:).a.a.x

2つのサブクラスを選択する(例:.a.b):.x:not(.c)

3つのサブクラスをすべて選択します。 .x


6
フォームの論理節はどれa or b or c or dも同じなnot(not(a) and not(b) and not(c) and not(d))ので、「or」は実際には単なる便利な関数です。理論的には、すべてのケースでそれなしで済むことが可能であるはずです。OPの場合(.a or .b) and .c->:not(:not(.a):not(.b)).c
Max Murphy

2
@MaxMurphyこれをテストしましたか?
サイムVIDAS

4
今朝の5時現在、そうです!私は、一次論理を吐き出し、セレクターをリーフに配置して、などの結果を返すjsがあり:not(:not([data-status="ACT"]):not([data-status="ISS"]):not([data-status="COR"]))[data-month="08"]ます。このコードは公開閲覧には十分にクリーンではありませんが、それ以外の場合は投稿します。私はクロム、サファリ、ローエンドのandroid携帯電話でテストしました。
マックスマーフィー

2
@MaxMurphyすばらしい点はありますが、「便利な機能」のかなり拷問された定義を呼び出したと思います。デジタルコンピューターで実行できることはすべてNANDゲートに分解できますが、ソフトウェアエンジニアリングの残りの部分を「便利な機能の集まり」とは言いません。次数の違いは、構成を組み合わせるとすぐに事実上の種類の違いになります。
サラG

1
@MaxMurphy冗談を言っているだけだと理解するのに苦労しました。:( 否定CSS擬似クラス:ていない(X)は、撮影機能表記で単純な選択の引数としてXは、引数で示されていない要素に一致Xは。。別の否定セレクタを含んではならない(からMozillaのドキュメント、強調鉱山)
törzsmókus

5

いいえ。標準のCSSは、あなたが探しているようなものを提供しません。

ただし、LESSSASSを調べることをお勧めします。

これらは、変数、ネストされたルール、その他の拡張機能などの追加機能を導入して、デフォルトのCSS構文を拡張することを目的とした2つのプロジェクトです。

これらを使用すると、はるかに構造化されたCSSコードを記述できます。どちらを使用しても、特定の使用例はほぼ確実に解決されます。

もちろん、どのブラウザーも拡張構文をサポートしていません(特に2つのプロジェクトはそれぞれ異なる構文と機能を持っているため)。しかし、ブラウザーが行うのは、LESSまたはSASSコードを標準CSSに変換する「コンパイラー」を提供することです。サイトにデプロイします。


その時点で、PHP印刷 "Content-type:text / css"を使用することもできます
Josh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.