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 */
}

그러나 다양한 논리 조합을 사용하여 이러한 종류의 논리를 많이 수행해야한다고 가정하면 더 나은 구문이 있습니까?


CSS 선택기에서 둘 이상의 클래스 이름을 무시하므로 Internet Explorer 6을 지원해야하는 경우주의하십시오.
fforw

24
운 좋게도,이 프로젝트에서는 IE6 사용자들에게 스스로 업그레이드하도록 지시 할 수 있습니다.
Josh

12
명확성을 위해 항상 쉼표 뒤에 또는 최소한 공백에 줄 바꿈을 시도합니다.
ANeves

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가 Selectors 4에 대해 제안하기 오래 전에 나타났습니다 (현재의 화신으로 이어짐 :matches()).
BoltClock

1
드래프트가 제공되는 시간에 관계없이 공급 업체가 불안정한 드래프트의 기능을 구현할 것으로 기대하는 것도 타당하지 않습니다 (이는 Selectors 4가 FPWD 이후 3 년 이상 불안정하고 크게 구현되지 않은 사실을 설명하기위한 것입니다). .
BoltClock

@BoltClock은 2001 년에 존재하지 않았던 것에 대해 10 년 동안 IE6를 비난했습니다. 사람들은 누군가를 비난하고 싶어합니다.
GetFree

실험적인 것들에 대한 한 마디는 공식적으로 구현되지 않는 한 의존하기를 원하지 않는다는 것입니다. 훌륭한 솔루션처럼 보일 수는 있지만 개인적으로 프로젝트에서 구현하지 못하게하는 것이 사라질 가능성이 있습니다. 하나의 실험용 의사 클래스를 추적해도 안전하다고 느끼지 않습니다. 대부분 프로젝트에서 둘 이상의 장소에서 사용될 것이며 아마도 사용하는 곳이 둘 이상인 경우 어떻게 든 모든 것을 추적해야합니다. 당신은 확실히 폴백을 가지고 여전히 그것을 뽑을 수 있지만 깨끗하게 들리지 않습니다
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>

그리고 당신은 .x( .a또는 .b) 가있는 요소 만 선택하려고합니다 .

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

그러나 세 개의 "하위 클래스"가 있고 그 중 두 개를 선택하려는 경우에만 편리합니다.

하나의 하위 클래스 만 선택 (예 .a:) :.a.x

두 개의 하위 클래스 선택 (예 : .a.b) :.x:not(.c)

세 가지 서브 클래스 모두 선택 : .x


6
형식의 모든 논리 절은 '또는'은 실제로는 편의 기능 a or b or c or d과 동일 not(not(a) and not(b) and not(c) and not(d))합니다. 이론적으로 모든 경우 에없이 그것을 통과 할 수 있어야합니다 . OP의 경우 (.a or .b) and .c->:not(:not(.a):not(.b)).c
Max Murphy

2
@MaxMurphy 이것을 테스트 했습니까?
Šime Vidas

4
오늘 아침 5시 기준으로 그렇습니다! 나는 잎에 선택 기가있는 1 차 논리를 뱉어내는 js가 있으며 다음과 같은 결과를 얻습니다 :not(:not([data-status="ACT"]):not([data-status="ISS"]):not([data-status="COR"]))[data-month="08"]. 이 코드는 퍼블릭 퍼 usal을 위해 충분히 깨끗하지는 않지만 게시하지 않았습니다. 크롬, 사파리 및 저가형 안드로이드 폰에서 테스트했습니다.
Max Murphy

2
@MaxMurphy 좋은 지적이 있지만 "편의 함수"라는 다소 고문 된 정의를 불러 온 것 같습니다. 디지털 컴퓨터가 할 수있는 모든 것은 NAND 게이트로 분해 될 수 있지만 나머지 소프트웨어 엔지니어링을 "편리한 기능"이라고 부르지는 않습니다. 구조의 조합이 가능할 때 정도의 차이는 사실상 사실상의 종류의 차이가됩니다.
Sarah G

1
@MaxMurphy 나는 당신이 농담하는 것을 알아내는 데 어려움을 겪었습니다. :( 부정 CSS 의사 클래스 :하지 (X)를 복용하는 기능 표기법 간단한 선택 인수로 X 그것은 인수로 표현되지 않는 요소를 일치 X는.. 또 다른 부정 선택기를 포함 할 수 없습니다 . (에서 Mozilla docs , emphasis mine)
törzsmókus

5

아니요. 표준 CSS는 원하는 종류를 제공하지 않습니다.

그러나 LESSSASS 를 살펴볼 수 있습니다 .

변수, 중첩 규칙 및 기타 향상된 기능을 포함한 추가 기능을 도입하여 기본 CSS 구문을 확장하려는 두 프로젝트입니다.

그것들은 훨씬 더 구조화 된 CSS 코드를 작성할 수있게하며, 어느 쪽이든 당신의 특정 사용 사례를 거의 확실히 해결할 것입니다.

물론 어떤 브라우저도 확장 된 구문을 지원하지 않습니다 (특히 두 프로젝트마다 구문과 기능이 다르기 때문에). LESS 또는 SASS 코드를 표준 CSS로 변환하는 "컴파일러"를 제공하면됩니다. 귀하의 사이트에 배포하십시오.


이 시점에서 PHP 출력 "Content-type : text / css"
Josh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.