클래스 이름을 가진 많은 요소가 red
있지만 class="red"
다음 CSS 규칙을 사용하여 첫 번째 요소를 선택할 수없는 것 같습니다 .
이 선택기의 문제점은 무엇이며 어떻게 수정합니까?
의견 덕분에 요소가 부모의 첫 번째 자식이어야하며 선택하지 못했습니다. 나는 다음과 같은 구조를 가지고 있으며, 주석에서 언급 한 바와 같이이 규칙은 실패합니다.
.home .red:first-child {
border: 1px solid red;
}
<div class="home">
<span>blah</span>
<p class="red">first</p>
<p class="red">second</p>
<p class="red">third</p>
<p class="red">fourth</p>
</div>
수업으로 첫 자녀를 어떻게 대상으로 할 수 red
있습니까?
답변
이것은 저자들이 어떻게 :first-child
작동 하는지 오해하는 가장 잘 알려진 예 중 하나입니다 . CSS2에 도입 의 :first-child
의사 클래스를 대표하는 부모의 최초의 아이를 . 그게 다야. 나머지 복합 선택기에서 지정한 조건과 가장 먼저 일치하는 하위 요소를 선택한다는 잘못된 오해가 있습니다. 선택기가 작동하는 방식 ( 설명 은 여기 를 참조 하십시오) 으로 인해 이는 사실이 아닙니다.
선택기 레벨 3은 :first-of-type
의사 클래스를 도입하여 요소 유형의 형제 중 첫 번째 요소를 나타냅니다. 이 답변은 그림의 차이로 설명 :first-child
하고 :first-of-type
. 그러나와 마찬가지로 :first-child
다른 조건이나 특성을 보지 않습니다. HTML에서 요소 유형은 태그 이름으로 표시됩니다. 질문에서 해당 유형은 p
입니다.
불행히도, :first-of-class
주어진 클래스의 첫 번째 자식 요소와 일치하는 유사 의사 클래스 는 없습니다 . Lea Verou 와 내가 이것에 대해 생각해 낸 한 가지 해결 방법은 (전적으로 독립적이지만) 먼저 해당 클래스의 모든 요소에 원하는 스타일을 적용하는 것 입니다.
/*
* Select all .red children of .home, including the first one,
* and give them a border.
*/
.home > .red {
border: 1px solid red;
}
… 우선 규칙에서 일반 형제 결합 자를 사용하여 첫 번째 클래스 다음에 오는 클래스의 요소 스타일을 “실행 취소”합니다 .~
/*
* Select all but the first .red child of .home,
* and remove the border from the previous rule.
*/
.home > .red ~ .red {
border: none;
}
이제 첫 번째 요소에만 class="red"
테두리가 있습니다.
규칙이 적용되는 방법은 다음과 같습니다.
<div class="home">
<span>blah</span> <!-- [1] -->
<p class="red">first</p> <!-- [2] -->
<p class="red">second</p> <!-- [3] -->
<p class="red">third</p> <!-- [3] -->
<p class="red">fourth</p> <!-- [3] -->
</div>
-
적용되는 규칙이 없습니다. 테두리가 렌더링되지 않습니다.
이 요소에는 클래스red
가 없으므로 건너 뜁니다. -
첫 번째 규칙 만 적용됩니다. 빨간색 테두리가 렌더링됩니다.
이 요소에는 클래스red
가 있지만 그 앞에는 클래스가있는 요소가 없습니다red
. 따라서 두 번째 규칙은 적용되지 않고 첫 번째 규칙 만 적용되며 요소는 경계를 유지합니다. -
두 규칙이 모두 적용됩니다. 테두리가 렌더링되지 않습니다.
이 요소에는 클래스가red
있습니다. 또한 클래스와 함께 하나 이상의 다른 요소가 앞에옵니다red
. 따라서 두 규칙이 모두 적용되고 두 번째border
선언은 첫 번째 규칙을 무시 하므로 규칙 을 “실행 취소”합니다.
이 선택기 3 년에 도입되었지만 달리 보너스로, 일반 형제 연결자, 꽤 IE7에서 잘 지원 및 최신 버전 인 :first-of-type
및 :nth-of-type()
단지 이후 IE9에서 지원하는. 좋은 브라우저 지원이 필요하다면 운이 좋을 것입니다.
사실, 형제 콤비는이 기술의 유일한 중요한 구성 요소입니다, 사실 과 , 그와 같은 놀라운 브라우저 지원이 매우 다양한이 기술을 만드는 – 당신은 클래스 선택기 외에 다른 것들에 의해 요소를 필터링을 적용 할 수 있습니다 :
-
:first-of-type
클래스 선택기 대신 유형 선택기를 제공하여 IE7 및 IE8 에서이 문제를 해결할 수 있습니다 (다시 말해서 여기에서 잘못된 사용법에 대한 자세한 내용 참조).article > p { /* Apply styles to article > p:first-of-type, which may or may not be :first-child */ } article > p ~ p { /* Undo the above styles for every subsequent article > p */ }
-
속성 선택기 또는 클래스 대신 다른 간단한 선택기로 필터링 할 수 있습니다 .
-
의사 요소가 기술적으로 단순한 선택기는 아니지만 이 재정의 기술을 의사 요소 와 결합 할 수도 있습니다 .
이것이 작동하려면 다른 형제 요소에 대한 기본 스타일이 무엇인지 미리 알아야하므로 첫 번째 규칙을 무시할 수 있습니다. 또한 여기에는 CSS의 규칙을 재정의하는 것이 포함되므로 Selectors API 또는 Selenium 의 CSS 로케이터 와 함께 사용하기 위해 단일 선택기로 동일한 작업을 수행 할 수 없습니다 .
Selectors 4 는 :nth-child()
표기법에 대한 확장 (원래 완전히 새로운 의사 클래스 :nth-match()
) :nth-child(1 of .red)
을 도입하여 가상 대신에 무언가를 사용할 수 있음을 언급 할 가치가 있습니다 .red:first-of-class
. 비교적 최근의 제안으로 인해 프로덕션 사이트에서 아직 사용할 수있을 정도로 상호 운용 가능한 구현이 충분하지 않습니다. 잘만되면 이것이 곧 바뀔 것이다. 그 동안 제안한 해결 방법은 대부분의 경우 효과적입니다.
이 답변은 질문이 주어진 클래스를 가진 모든 첫 번째 자식 요소를 찾고 있다고 가정합니다. 전체 문서 에서 복잡한 선택기의 n 번째 일치에 대한 의사 클래스 또는 일반 CSS 솔루션이 없습니다 . 솔루션의 존재 여부는 문서 구조에 따라 크게 다릅니다. jQuery를이 제공 :eq()
, :first
, :last
이 목적을 위해 더, 그러나 다시 노트는 것을 그들은 매우 다르게에서 기능 :nth-child()
등 . Selectors API를 사용하면 document.querySelector()
첫 번째 일치 항목을 얻는 데 사용할 수 있습니다 .
var first = document.querySelector('.home > .red');
또는 document.querySelectorAll()
인덱서와 함께 사용 하여 특정 일치 항목을 선택하십시오.
var redElements = document.querySelectorAll('.home > .red');
var first = redElements[0];
var second = redElements[1];
// etc
필립 Daubmeier.red:nth-of-type(1)
가 원래 받아 들인 대답 의 해결책 (원래 Martyn이 작성 했지만 이후 삭제됨)은 예상대로 작동하지 않습니다.
예를 들어, p
원래 마크 업 에서만을 선택하려는 경우 :
<p class="red"></p>
<div class="red"></div>
… 추가 사용할 수 없다 .red:first-of-type
(등가 .red:nth-of-type(1)
각 요소는 (그 유형의 최초로 유일한 하나이므로) p
와 div
되도록 각각) 모두 선택자와 일치한다.
특정 클래스의 첫 번째 요소가 유형 의 첫 번째 요소 인 경우 의사 클래스도 작동하지만 우연의 일치로만 발생합니다 . 이 동작은 Philip의 답변에서 설명합니다. 이 요소 앞에 동일한 유형의 요소를 넣으면 선택기가 실패합니다. 업데이트 된 마크 업 작성 :
<div class="home">
<span>blah</span>
<p class="red">first</p>
<p class="red">second</p>
<p class="red">third</p>
<p class="red">fourth</p>
</div>
규칙을 적용 .red:first-of-type
하면 효과가 있지만 p
수업이 없으면 다른 규칙 을 추가하면 다음과 같습니다.
<div class="home">
<span>blah</span>
<p>dummy</p>
<p class="red">first</p>
<p class="red">second</p>
<p class="red">third</p>
<p class="red">fourth</p>
</div>
… 첫 번째 .red
요소가 이제 두 번째 요소 이므로 선택기가 즉시 실패 p
합니다.
답변
:first-child
이름을 말한다처럼 선택은 부모 태그의 첫 번째 자식을 선택, 것입니다. 자식은 동일한 부모 태그에 포함되어야합니다. 정확한 예제가 작동합니다 ( 여기서 시도해 보십시오 ).
<body>
<p class="red">first</p>
<div class="red">second</div>
</body>
다른 상위 태그에 태그를 중첩했을 수 있습니다. 클래스 태그가 red
실제로 부모 아래의 첫 번째 태그입니까?
또한 이것은 전체 문서의 첫 번째 태그에만 적용되는 것이 아니라 새 부모가 감싸 질 때마다 다음과 같이 적용됩니다.
<div>
<p class="red">first</p>
<div class="red">second</div>
</div>
<div>
<p class="red">third</p>
<div class="red">fourth</div>
</div>
first
그리고 third
다음 빨간색됩니다.
최신 정보:
나는 순교자가 왜 대답을 삭제했는지 모르겠지만 :nth-of-type
선택자는 해결책을 가지고있었습니다 .
.red:nth-of-type(1)
{
border:5px solid red;
}
<div class="home">
<span>blah</span>
<p class="red">first</p>
<p class="red">second</p>
<p class="red">third</p>
<p class="red">fourth</p>
</div>
Martyn의 크레딧 . 예를 들어, 더 많은 정보를 정기적으로 여기 . 이것은 CSS 3 선택기이므로 모든 브라우저가이를 인식하지는 않습니다 (예 : IE8 이상).
답변
정답은 다음과 같습니다.
.red:first-child, :not(.red) + .red { border:5px solid red }
1 부 : 요소가 부모의 첫 번째 요소이고 클래스가 “빨간색”인 경우 테두리가 표시됩니다.
파트 II : “.red”요소가 부모의 첫 번째 요소는 아니지만 “.red”클래스가없는 요소 바로 다음에 오는 경우, 해당 경계의 명예를받을 자격이 있습니다.
Philip Daubmeier의 답변은 받아 들여졌지만 정확하지 않습니다. 첨부 된 바이올린을 참조하십시오.
BoltClock의 대답은 효과가 있지만 스타일을 불필요하게 정의하고 덮어 씁니다
(특히 다른 테두리를 상속받는 문제-다른 테두리를 선언하지 않으려는 경우 : 없음)
편집 : 당신이 빨간색이 아닌 여러 번 “빨간색”이있는 경우, 각 “첫 번째”빨간색 테두리를 가져옵니다. 이를 방지하려면 BoltClock의 답변을 사용해야합니다. 바이올린 참조
답변
당신은 사용할 수 있습니다 first-of-type
또는nth-of-type(1)
.red {
color: green;
}
/* .red:nth-of-type(1) */
.red:first-of-type {
color: red;
}
<div class="home">
<span>blah</span>
<p class="red">first</p>
<p class="red">second</p>
<p class="red">third</p>
<p class="red">fourth</p>
</div>
답변
답변
선택자와 일치 시키려면 요소의 클래스 이름이 red
있어야하며 상위의 첫 번째 자식이어야합니다.
<div>
<span class="red"> <!-- MATCH -->
</div>
<div>
<span>Blah</span>
<p class="red"> <!-- NO MATCH -->
</div>
<div>
<span>Blah</span>
<div><p class="red"></div> <!-- MATCH -->
</div>
답변
다른 답변은 무엇이 잘못되었는지 를 다루 므로 다른 절반은 어떻게 고쳐야할까요? 불행히도, 여기에 CSS 전용 솔루션이 있다는 것을 모르겠습니다 . 적어도 내가 생각할 수는 없습니다 . 그래도 다른 옵션이 있습니다 ….
-
first
클래스를 생성 할 때 다음과 같이 요소에 클래스를 지정하십시오 .<p class="red first"></p> <div class="red"></div>
CSS :
.first.red { border:5px solid red; }
이 CSS는 클래스 와 클래스 가 모두있는 요소 만 일치합니다 .
first
red
-
또는 JavaScript에서 동일한 작업을 수행하십시오. 예를 들어 위와 동일한 CSS를 사용하여 jQuery를 사용하는 방법은 다음과 같습니다.
$(".red:first").addClass("first");
