이것은 방법 :nth-child()
과 :nth-of-type()
작업 에 대한 오해로 인해 발생하는 매우 일반적인 문제입니다 . 안타깝게도 현재 선택기 기반 솔루션은 없습니다. 선택자는 홀수, 짝수 또는 임의의 an+b
위치 a != 1
와 같은 패턴을 기반으로 임의의 선택자와 일치하는 n 번째 자식을 일치시키는 방법을 제공하지 않기 때문 b != 0
입니다. 이것은 클래스 선택자뿐만 아니라 속성 선택자, 부정 및 단순한 선택 자의 더 복잡한 조합까지 확장됩니다.
:nth-child()
의사 클래스 사이의 요소를 계산 모두 같은 부모 아래에서 자신의 형제를. 나머지 선택기와 일치하는 형제 만 계산하지 않습니다. 유사하게, :nth-of-type()
유사 클래스 는 동일한 요소 유형을 공유하는 형제를 계산합니다. 이는 나머지 선택자가 아닌 HTML의 태그 이름을 참조합니다.
이것은 또한 같은 부모의 모든 경우 자녀는 자녀 테이블 본체의 경우, 예를 들어, 같은 요소 유형의 것을 의미 tr
요소 나 어린이 만하는리스트 요소 li
요소는 다음 :nth-child()
과 :nth-of-type()
동일하게 동작합니다, 즉, 의 모든 값에 대해 an+b
, :nth-child(an+b)
그리고 :nth-of-type(an+b)
요소의 동일한 세트를 일치합니다.
사실, 다음과 같은 가상 클래스를 포함하는 특정 화합물 선택기 모두 간단한 선택기, :nth-child()
및 :not()
작업 독립적으로 서로, 오히려 찾고보다 일부 선택기의 나머지가 매칭 소자.
이는 또한 각 개별 화합물 선택자 1 내에서 단순 선택자간에 순서 개념이 없음 을 의미합니다. 즉, 예를 들어 다음 두 선택자가 동일하다는 것을 의미합니다.
table.myClass tr.row:nth-child(odd)
table.myClass tr:nth-child(odd).row
영어로 번역하면 둘 다 다음을 의미합니다.
다음의 모든 tr
독립 조건과 일치 하는 요소를 선택하십시오 .
- 부모의 홀수 번째 자식입니다.
- "row"클래스가 있습니다. 과
table
"myClass"클래스가 있는 요소 의 자손입니다 .
(단지 포인트를 집으로 옮기기 위해 여기에서 정렬되지 않은 목록을 사용하는 것을 알 수 있습니다.)
현재 순수한 CSS 솔루션이 없기 때문에 스크립트를 사용하여 요소를 필터링하고 그에 따라 스타일 또는 추가 클래스 이름을 적용해야합니다. 예를 들어, 다음은 jQuery를 사용하는 일반적인 해결 방법입니다 ( tr
테이블 내에 요소로 채워진 행 그룹이 하나만 있다고 가정 ).
$('table.myClass').each(function() {
// Note that, confusingly, jQuery's filter pseudos are 0-indexed
// while CSS :nth-child() is 1-indexed
$('tr.row:even').addClass('odd');
});
해당 CSS 사용 :
table.myClass tr.row.odd {
...
}
Selenium과 같은 자동화 된 테스트 도구를 사용하거나 lxml과 같은 도구로 HTML을 처리하는 경우 이러한 도구 중 대부분은 XPath를 대안으로 허용합니다.
//table[contains(concat(' ', @class, ' '), ' myClass ')]//tr[contains(concat(' ', @class, ' '), ' row ')][position() mod 2)=1]
다른 기술을 사용하는 다른 솔루션은 독자에게 연습으로 남겨집니다. 이것은 단지 설명을위한 간단하고 인위적인 예입니다.
그만한 가치를 위해, 주어진 선택자와 일치하는 모든 n 번째 자식을 선택하는 특정 목적을 위해 선택기 레벨 4에 추가 할 표기법 에 대한 확장에:nth-child()
대한 제안 이 있습니다. 2
일치 항목을 필터링 :nth-child()
할 선택자는 기존 선택자 구문에서 지시 한대로 선택자가 시퀀스에서 서로 독립적으로 작동하는 방식으로 인해에 인수로 제공됩니다 . 따라서 귀하의 경우에는 다음과 같이 보일 것입니다.
table.myClass tr:nth-child(odd of .row)
(기민한 독자는 :nth-child(odd of tr.row)
단순한 선택자 tr
이고 :nth-child()
서로 독립적으로 작동하기 때문에 이것이 대신 있어야한다는 것을 바로 알아 차릴 것입니다 . 이것은 선택자를 받아들이는 기능적 가상 클래스의 문제 중 하나입니다. 웜 캔입니다. 대신이 답변의 중간에 열리지 않습니다. 대신 대부분의 사이트는 tr
테이블 본문에서 서로의 형제 요소가 아닌 다른 요소를 가지지 않으므로 두 옵션 중 하나를 기능적으로 동일하게 만들 것입니다.)
물론, 완전히 새로운 사양의 새로운 제안이기 때문에 몇 년 후에야 구현 될 것입니다. 그동안 위와 같이 스크립트를 계속 사용해야합니다.
1 유형 또는 범용 선택기를 지정하는 경우 먼저 와야합니다. 그러나 이것은 선택자가 기본적으로 작동하는 방식을 변경하지 않습니다. 통사론 적 특징에 지나지 않습니다.
2 이것은 원래로 제안되었지만 :nth-match()
, 주어진 선택자와 일치하는 다른 모든 요소가 아닌 형제에 대해서만 상대적인 요소를 계산하기 때문에 2014 년부터 기존의 확장으로 용도가 변경되었습니다 :nth-child()
.