CSS 부모 선택기가 있습니까?


3175

<li>앵커 요소의 직접 부모 인 요소를 어떻게 선택 합니까?

예를 들어 내 CSS는 다음과 같습니다.

li < a.active {
    property: value;
}

분명히 JavaScript 로이 작업을 수행하는 방법이 있지만 CSS 레벨 2에 고유 한 일종의 해결 방법이 있기를 바랍니다.

스타일을 지정하려는 메뉴가 CMS에 의해 분출되고 있으므로 활성 요소를 요소로 옮길 수 없습니다 <li>...

어떤 아이디어?

답변:


2531

현재 CSS에서 요소의 부모를 선택할 수있는 방법이 없습니다.

그렇게 할 수있는 방법이 있다면 현재 CSS 선택기 사양 중 하나에 있습니다.

즉, Selectors Level 4 실무 초안 에는 :has()이 기능을 제공 할 의사 클래스가 포함되어 있습니다. jQuery 구현 과 비슷하다 .

li:has(> a.active) { /* styles to apply to the li tag */ }

그러나 2020 년 5 월부터는 여전히 모든 브라우저에서 지원되지 않습니다 .

그 동안 부모 요소를 선택해야하는 경우 JavaScript를 사용해야합니다.


68
이미 제안되어 거부 된 것 같습니다 : stackoverflow.com/questions/45004/…
RobM

14
다음 을 사용하는 것을 제외하고는 주제 선택기 가 다시 방문한 것 !같습니다 :The subject of the selector can be explicitly identified by appending an exclamation mark (!) to one of the compound selectors in a selector.
animuson

13
prepended $가 나에게 더 좋아 보였습니다 ... 첨부 파일 !을보다 쉽게 ​​간과 할 수 있습니다.
Christoph

51
주요 플롯 트위스트! Selectors 4 WD는 CSS 구현에서 사용되는 빠른 프로파일에서 주제 표시기를 제외하기 위해 오늘 업데이트되었습니다 . 이 변경 사항이 남아 있으면 더 이상 스타일 시트에서 주제 표시기를 사용할 수 없다는 것을 의미합니다 ( 다른 답변에 설명 된 것과 같은 일종의 폴리 필을 추가하지 않는 한)-Selectors API 및 다른 곳에서만 사용할 수 있습니다 그렇지 않으면 완전한 프로파일이 구현 될 수있다.
BoltClock

55
또 다른 주요 업데이트 : 주제 선택기 구문을 완전히 없애고 :has()모든 사람들이 jQuery에서 알고 사랑하는 의사로 대체하는 것을 고려하는 것처럼 보입니다 . 최신 ED는 주제 지표에 대한 모든 참조를 제거하고 :has()의사 로 대체했습니다 . 정확한 이유를 모르지만 CSSWG는 얼마 전에 설문 조사를 실시했으며 그 결과는이 결정에 영향을 미쳤습니다. jQuery와의 호환성이 가장 높기 때문에 (수정없이 qSA를 활용할 수 있음) 주제 표시기 구문이 너무 혼란 스러웠습니다.
BoltClock

152

CSS에서만 부모를 선택할 수 있다고 생각하지 않습니다.

그러나 이미 .active수업 이있는 것처럼 보이 므로 해당 수업을 li(대신)으로 이동하는 것이 더 쉽습니다 a. 그렇게하면 CSS liavia CSS에만 액세스 할 수 있습니다 .


4
의사 선택기는 포커스 가능한 요소가 아니기 때문에 목록 항목으로 이동할 수 없습니다. 그는 : active 선택기를 사용하므로 앵커가 활성화되면 목록 항목이 영향을 받기를 원합니다. 목록 항목은 활성 상태가되지 않습니다. 제쳐두고, 그런 선택기가 존재하지 않는 것은 불행합니다. 순수한 CSS 메뉴를 키보드로 완전히 액세스 할 수 없다면 키보드 선택기가 없으면 불가능한 것처럼 보입니다 (형제 선택기를 사용하면 중첩 목록을 사용하여 만든 하위 메뉴를 표시 할 수 있지만 목록에 포커스가 있으면 다시 숨겨집니다). 이 특정 conun에 대한 CSS 전용 솔루션이있는 경우

12
@Dominic Aquilina 질문을 살펴보십시오. OP는 의사 선택기가 아닌 클래스를 사용하고 있습니다.
jeroen

125

이 스크립트 를 사용할 수 있습니다 :

*! > input[type=text] { background: #000; }

텍스트 입력의 부모를 선택합니다. 그러나 아직 더 많은 것이 있습니다. 원하는 경우 지정된 부모를 선택할 수 있습니다.

.input-wrap! > input[type=text] { background: #000; }

또는 활성화되어있을 때 선택하십시오.

.input-wrap! > input[type=text]:focus { background: #000; }

이 HTML을 확인하십시오.

<div class="input-wrap">
    <input type="text" class="Name"/>
    <span class="help hide">Your name sir</span>
</div>

이 활성화 된 span.help상태에서이를 선택 input하여 표시 할 수 있습니다.

.input-wrap! .help > input[type=text]:focus { display: block; }

더 많은 기능이 있습니다. 플러그인 설명서를 확인하십시오.

BTW, Internet Explorer에서 작동합니다.


5
jquery를 사용하는 patent()것이 더 빠를 것이라고 가정하십시오 . 그러나 이것은 테스트가 필요하다
Dan

2
@Idered 그것은 당신이 자식 선택기와 선택기 주제의 CSS 선언이있을 때 (실패 #a!만에서 오류가 발생, #a! p작동), 그리고 때문이 아니라 중 하나 일 것이다 다른 사람이 있도록 Uncaught TypeError: Cannot call method 'split' of undefined다음을 참조 jsfiddle.net/HerrSerker/VkVPs
yunzen

3
@HerrSerker 생각합니다 #a! 선택기가 잘못 되었으면 어떻게 선택해야합니까?
13:17에

2
@ 몰랐어. 사양은 그것이 불법이라고 말하지 않습니다. #ㅏ! 스스로 선택해야합니다. 적어도 자바 스크립트에 오류들이 없어야합니다
yunzen

5
허용 된 답변에 대한 내 의견에 따르면, 주제 표시기가 CSS의 브라우저에서 결코 구현되지 않을 수 있기 때문에 가까운 미래에도 폴리 필이 필요할 수 있습니다.
BoltClock

108

다른 사람들이 언급했듯이 CSS 만 사용하여 요소의 부모 스타일을 지정할 수있는 방법은 없지만 다음은 jQuery 와 함께 작동합니다 .

$("a.active").parents('li').css("property", "value");

21
<선택기 (jQuery를 1.7.1을 사용하여 확인) 존재하지 않습니다.
Rob W

6
아마도 <-syntax는 2009 년에 작동했지만 2013 년에 업데이트했습니다.
Alastair

5
더 좋은 방법은 jQuery의 내장 :has()선택기를 사용 하십시오 $("li:has(a.active)").css("property", "value");. CSS 4의 제안 된 !셀렉터 와 유사하게 읽습니다 . :parentselector , .parents()method , .parent()method 도 참조하십시오 .
Rory O'Kane

7
그리고 .css("property", "value")선택한 요소의 스타일을 지정하는 데 사용 하는 대신 .addClass("someClass")CSS 를 통해.someClass { property: value } ( via )해야합니다. 이런 식으로 CSS의 강력한 기능과 사용중인 모든 전처리기를 사용하여 스타일을 지정할 수 있습니다.
Rory O'Kane


69

부모 선택기가 없습니다. 이전 형제 선택기가없는 방식입니다. 이러한 선택기를 갖지 않는 한 가지 좋은 이유는 브라우저가 클래스의 적용 여부를 결정하기 위해 요소의 모든 하위를 통과해야하기 때문입니다. 예를 들어, 다음과 같이 쓴 경우 :

body:contains-selector(a.active) { background: red; }

그런 다음 브라우저는 브라우저가로드 될 때까지 기다려서 </body>페이지가 빨간색인지 아닌지를 결정하기 위해 모든 것을 구문 분석 해야합니다.

부모 선택 기가 없는 이유 기사 에 자세히 설명되어 있습니다.


11
브라우저를 더 빠르게 만드십시오. 인터넷 자체가 더 빠릅니다. 이 선택기는 반드시 필요하며, 슬프게도 우리가 느리고 원시적 인 세계에 살고 있기 때문에 구현하지 않은 이유는 슬프다.
vsync

11
실제로, 선택기는 매우 빠른 브라우저를 느리게 보이게합니다.
살만 A

5
나는 브라우저 개발자가 자바 스크립트 버전 (최소한)의 빠른 구현을 내놓을 것이라고 믿습니다.이 자바 스크립트 버전은 어쨌든 사람들이 사용합니다.
Marc.2377 2018 년

"우리는 느리고 원시적 인 세상에 살고있다" 기침 기침 새로운 사과 시계 기침
Marvin

@ Marc.2377 웹 사이트의 JS에서 위의 예제를 시도하면 절대 방문하지 않을 것입니다. 다른 한편으로, 나는 대부분의 경우, 직계 자녀에 대해서만 관심이 있기 때문에 직계 자녀에게만 국한된 경우에는 큰 영향을 미치지 않으면서도 좋은 추가 물이 될 것입니다.
xryl669

54

CSS 2에서는이를 수행 할 방법이 없습니다. 클래스를에 추가하고 다음 li을 참조 할 수 있습니다 a.

li.active > a {
    property: value;
}

3
요소 표시 : 블록을 만들어 li 영역 전체에 맞게 스타일을 지정할 수 있습니다. 당신이 찾고있는 스타일을 설명 할 수 있다면 아마도 해결책을 도울 수 있습니다.
Josh

이것은 실제로 간단하고 우아한 솔루션이며 많은 경우 부모에 클래스를 설정하는 것이 좋습니다.
Ricardo

35

전환 시도 ablock표시 한 다음 원하는 스타일을 사용합니다. a요소는 채울 li요소를, 당신은 당신이 원하는대로 그 모양을 수정할 수 있습니다. li패딩을 0 으로 설정하는 것을 잊지 마십시오 .

li {
  padding: 0;
  overflow: hidden;
}
a {
  display: block;
  width: 100%;
  color: ..., background: ..., border-radius: ..., etc...
}
a.active {
  color: ..., background: ...
}

31

CSS 선택기“ General Sibling Combinator ”는 원하는 용도로 사용될 수 있습니다.

E ~ F {
    property: value;
}

이것은 F요소가 앞에 오는 요소 와 일치합니다 E.


24
이 단지 형제입니다 선택, 그것은 아이, 부모 ... 정말 질문 메이트에 대답하지 않다
알리레자

26

내가 아는 한 CSS 2에는 없습니다. CSS 3에는 더 강력한 선택기가 있지만 모든 브라우저에서 일관되게 구현되지는 않습니다. 개선 된 선택기조차도 귀하의 예제에서 지정한 것을 정확하게 달성 할 것이라고는 생각하지 않습니다.


24

OP가 CSS 솔루션을 찾고 있었지만 jQuery를 사용하는 것은 간단합니다. 내 경우 에는 자식에 포함 된 태그 의 <ul>부모 태그 를 찾아야했습니다 . jQuery에는 선택기가 있으므로 포함 된 자식으로 부모를 식별 할 수 있습니다.<span><li>:has

$("ul:has(#someId)")

ulID가 someId 인 자식 요소가있는 요소를 선택합니다 . 또는 원래 질문에 대답하려면 다음과 같은 방법으로 트릭을 수행해야합니다 (예상되지 않음).

$("li:has(.active)")

3
또는 사용 $yourSpan.closest("ul")하면 span 요소의 부모 UL을 얻습니다. 그럼에도 불구하고 귀하의 답변은 완전히 다른 주제입니다. jQuery 솔루션으로 모든 CSS 태그 질문에 대답 할 수 있습니다.
Robin van Baalen

1
다른 답변에서 식별했듯이 CSS 2를 사용 하여이 작업을 수행 할 수있는 방법이 없습니다. 그 제약 조건을 감안할 때, 내가 제공 한 답변은 효과적이며 javascript imho를 사용하여 질문에 대답하는 가장 간단한 방법입니다.
David Clarke

공감대가 주어지면 일부 사람들이 당신에게 동의합니다. 그러나 유일한 대답은 받아 들여진 것입니다. 평범하고 간단한 "원하는대로 할 수 없습니다". 자전거에서 60mph를 보관하는 방법이 "간단한 것입니다. 차에 타서 가스를 치십시오"라고 대답하는 것은 여전히 ​​답이 아닙니다. 따라서 내 의견.
Robin van Baalen

1
이 접근법은 SO를 거의 완전히 쓸모 없게 만들 것입니다. 문제를 해결하는 방법을 찾기 위해 SO를 검색하지만 "답변 만"을 찾지 못하면 문제가 해결되지 않습니다. 그렇기 때문에 항상 고양이를 껍질을 벗기는 방법은 여러 가지가 있기 때문에 너무 훌륭합니다.
David Clarke

23

의사 요소 :focus-within는 하위 항목에 포커스가있는 경우 부모를 선택할 수 있습니다.

tabindex속성 이있는 요소는 초점을 맞출 수 있습니다 .

초점 내 브라우저 지원

탭 인덱스

.click {
  cursor: pointer;
}

.color:focus-within .change {
  color: red;
}

.color:focus-within p {
  outline: 0;
}
<div class="color">
  <p class="change" tabindex="0">
    I will change color
  </p>
  <p class="click" tabindex="1">
    Click me
  </p>
</div>


2
이것은 내 경우에는 잘 작동합니다, 감사합니다! 그냥, 형제가 아닌 부모로 색상을 변경하면 예제가 더 설명이 .color:focus-within .change됩니다 .color:focus-within. 제 경우에는 활성 상태 일 때 클래스를 자식에 추가하는 부트 스트랩 nav-bar를 사용하고 있으며 부모 .nav-bar에 클래스를 추가하고 싶습니다. 나는 이것이 마크 업을 소유하고 있지만 css + js 구성 요소가 부트 스트랩 (또는 기타) 인 매우 일반적인 시나리오라고 생각하므로 동작을 변경할 수 없습니다. tabindex를 추가 하고이 CSS를 사용할 수 있지만. 감사!
cancerbero 2016 년

22

이것이 Selectors Level 4 사양 에서 가장 많이 논의 된 측면입니다 . 이를 통해 선택자는 주어진 선택기 (!) 뒤에 느낌표를 사용하여 자식에 따라 요소의 스타일을 지정할 수 있습니다.

예를 들면 다음과 같습니다.

body! a:hover{
   background: red;
}

사용자가 앵커 위로 마우스를 가져 가면 빨간색 배경색이 설정됩니다.

그러나 우리는 브라우저의 구현을 기다려야합니다 :(


21

하이퍼 링크를 부모로 사용하려고 시도한 다음 호버에서 내부 요소를 변경하십시오. 이처럼 :

a.active h1 {color:red;}

a.active:hover h1 {color:green;}

a.active h2 {color:blue;}

a.active:hover h1 {color:yellow;}

이렇게하면 부모 요소의 롤오버를 기반으로 여러 내부 태그에서 스타일을 변경할 수 있습니다.


1
맞습니다. 그러나 aXHTML 표준을 준수하려는 경우 태그 내의 마크 업 코드 를 특정 요소로만 제한합니다 . 예를 들어 스키마 위반 경고를받지 않고 는 divwithin을 사용할 수 없습니다 a.
Ivaylo Slavov

2
완전 맞아 이바 일로! "a"는 비 블록 요소이므로 그 안에 블록 요소를 사용할 수 없습니다.
riverstorm

1
HTML5에서는 블록 요소를 링크 안에 넣는 것이 좋습니다.
Matthew James Taylor

2
... 의미 상 잘못 되었다면 이전에는 없었던 HTML5에서는 허용되지 않았을 것입니다.
BoltClock

14

현재는 부모 선택자가 없으며 W3C의 어떤 대화에서도 논의되지 않습니다. CSS가 필요한지 실제로 이해하려면 브라우저에서 CSS를 평가하는 방법을 이해해야합니다.

여기에 많은 기술적 인 설명이 있습니다.

Jonathan Snook는 CSS 평가 방법을 설명합니다 .

Chris Coyier는 부모 선택기의 대화에 대해 설명 합니다.

Harry Roberts는 다시 효율적인 CSS 선택기를 작성합니다 .

그러나 Nicole Sullivan은 긍정적 인 경향에 대한 흥미로운 사실을 가지고 있습니다 .

이 사람들은 모두 프론트 엔드 개발 분야에서 최고 수준입니다.


12
need사양은 웹 개발자의 요구 사항에 따라 정의되며 사양에 포함할지 여부는 다른 요인에 의해 결정됩니다.
nicodemus13

14

가로 메뉴에 대한 아이디어 ...

HTML의 일부

<div class='list'>
  <div class='item'>
    <a>Link</a>
  </div>
  <div class='parent-background'></div>
  <!-- submenu takes this place -->
</div>

CSS의 일부

/* Hide parent backgrounds... */
.parent-background {
  display: none; }

/* ... and show it when hover on children */
.item:hover + .parent-background {
  display: block;
  position: absolute;
  z-index: 10;
  top: 0;
  width: 100%; }

업데이트 된 데모 및 나머지 코드

텍스트 입력과 함께 사용하는 또 다른 예 -부모 필드 세트 선택


3
부모 선택기 사용 사례의 일부 / 많은 / 대부분에 이것을 일반화하는 방법이 무엇인지, 또는이 CSS의 어떤 부분이 정확히 무엇을하는지 정확하게 알 수는 없습니다. 철저한 설명을 추가 할 수 있습니까?
Nathan Tuggy

2
나는 이것을 실제 시나리오에 적용하려고 시도하지 않았기 때문에 "생산 용이 아님"이라고 말합니다. 그러나 고정 된 항목 너비의 2 수준 메뉴에만 적용 할 수 있다고 생각합니다. "이 CSS의 어떤 부분이 무엇을하고 있는지"-.test-sibling은 실제로 부모 항목 (CSS의 마지막 줄)의 배경입니다.
Ilya B.

2
설명을 추가했습니다 ( "MAIN PART"에서 시작하는 jsfiddle의 CSS 섹션).
Ilya B.

13

다음 pointer-events과 함께 사용하는 해킹 이 있습니다 hover.

<!doctype html>
<html>
	<head>
		<title></title>
		<style>
/* accessory */
.parent {
	width: 200px;
	height: 200px;
	background: gray;
}
.parent, 
.selector {
	display: flex;
	justify-content: center;
	align-items: center;
}
.selector {
	cursor: pointer;
	background: silver;
	width: 50%;
	height: 50%;
}
		</style>
		<style>
/* pertinent */
.parent {
	background: gray;
	pointer-events: none;
}
.parent:hover {
	background: fuchsia;
}
.parent 
.selector {
	pointer-events: auto;
}
		</style>
	</head>
	<body>
		<div class="parent">
			<div class="selector"></div>
		</div>
	</body>
</html>


12

웹 사이트를 디자인 할 때 실제로 도움이 될 수있는 비표준 기능을 포함하도록 CSS를 확장하는 플러그인이 있습니다. 이를 EQCSS 라고 합니다 .

EQCSS가 추가하는 것 중 하나는 부모 선택기입니다. 모든 브라우저, Internet Explorer 8 이상에서 작동합니다. 형식은 다음과 같습니다.

@element 'a.active' {
  $parent {
    background: red;
  }
}

그래서 우리는 모든 요소에 대한 요소 쿼리를 열었고, a.active해당 쿼리 내부의 스타일에 대해서는 $parent참조 점이 있기 때문에 의미가 있습니다. 브라우저는 parentNodeJavaScript 와 매우 유사하므로 부모를 찾을 수 있습니다 .

여기의 데모입니다$parent다른 $parent인터넷 익스플로러 8에서 작동한다는 데모 뿐만 아니라, 경우에 스크린 샷이 당신이 테스트 주위에 인터넷 익스플로러 8이 없습니다 .

EQCSS도 포함 메타 선택기 : $prev요소의 선택된 요소 전에 $this많은 요소 쿼리와 일치하고, 요소 만합니다.


11

현재 2019 년이며 CSS Nesting Module최신 초안에는 실제로 이와 같은 것이 있습니다. @nestat-rules 소개 .

3.2. 중첩 규칙 : @nest

직접 중첩은 멋지게 보이지만 다소 취약합니다. .foo &와 같은 일부 유효한 중첩 선택기는 허용되지 않으며 특정 방법으로 선택기를 편집하면 규칙이 예기치 않게 유효하지 않게 될 수 있습니다. 또한 일부 사람들은 중첩이 시각적으로 주변 선언과 구별되는 데 어려움을 겪습니다.

이러한 모든 문제를 해결하기 위해이 사양에서는 @nest 규칙을 정의합니다.이 규칙은 스타일 규칙을 올바르게 중첩하는 방법에 대한 제한을 줄입니다. 구문은 다음과 같습니다.

@nest = @nest <selector> { <declaration-list> }

@nest 규칙은 스타일 규칙과 동일하게 작동합니다.이 규칙은 선택기로 시작하며 선택자와 일치하는 요소에 적용되는 선언을 포함합니다. 유일한 차이점은 @nest 규칙에 사용 된 선택기는 중첩을 포함해야한다는 것입니다. 즉, 어딘가에 중첩 선택기가 포함되어 있습니다. 개별 복합 셀렉터가 모두 네스트 포함 인 경우 셀렉터 목록은 네스트를 포함합니다.

(위의 URL에서 복사하여 붙여 넣기).

이 사양에서 유효한 선택기의 예 :

.foo {
  color: red;
  @nest & > .bar {
    color: blue;
  }
}
/* Equivalent to:
   .foo { color: red; }
   .foo > .bar { color: blue; }
 */

.foo {
  color: red;
  @nest .parent & {
    color: blue;
  }
}
/* Equivalent to:
   .foo { color: red; }
   .parent .foo { color: blue; }
 */

.foo {
  color: red;
  @nest :not(&) {
    color: blue;
  }
}
/* Equivalent to:
   .foo { color: red; }
   :not(.foo) { color: blue; }
 */

10

기술적으로이 작업을 수행하는 직접적인 방법은 없습니다. 그러나 jQuery 또는 JavaScript로 정렬 할 수 있습니다.

그러나 이와 같은 작업을 수행 할 수도 있습니다.

a.active h1 {color: blue;}
a.active p {color: green;}

jQuery

$("a.active").parents('li').css("property", "value");

jQuery를 사용하여이를 수행하려면 jQuery 상위 선택기에 대한 참조가 있습니다.


9

W3C는 브라우저에 큰 성능 영향을 주므로 이러한 선택기를 제외했습니다.


27
그릇된. DOM은 나무이기 때문에 자식에게 가기 전에 부모에게 가야하므로 간단히 한 노드로 돌아갑니다. oo
NullVoxPopuli

9
CSS 선택기는 대기열 이므로 문서 XPath 또는 DOM 계층이 아니라 선택기 순서 가 평가됩니다.
Paul Sweatte

3
@rgb 적어도 그들이 말한 것입니다.
yunzen

9

짧은 대답은 아니오입니다 . 우리는이없는 parent selectorCSS에서이 단계에서,하지만 당신은 어쨌든 요소 또는 클래스를 교체 할 필요가없는 경우, 두 번째 옵션은 자바 스크립트를 사용하고 있습니다. 이 같은:

var activeATag = Array.prototype.slice.call(document.querySelectorAll('a.active'));

activeATag.map(function(x) {
  if(x.parentNode.tagName === 'LI') {
    x.parentNode.style.color = 'red'; // Your property: value;
  }
});

또는 애플리케이션에서 jQuery 를 사용하는 경우 더 짧은 방법 :

$('a.active').parents('li').css('color', 'red'); // Your property: value;

5

현재 표준 CSS에는 부모 선택기가 없지만 , 7 개의 새로운 선택자 중 다음 두 가지를 모두 포함하는 ax ( 개인화 된 CSS 선택기 구문 / ACSSSS ) 프로젝트를 진행 하고 있습니다.

  1. 바로 위 부모 셀렉터 <(에 반대 선택을 할 수 있습니다 >)
  2. 모든 조상 선택기 ^ (에 대향 선택 가능 [SPACE])

도끼 는 현재 비교적 초기 베타 개발 단계에 있습니다.

여기 데모를보십시오 :

http://rounin.co.uk/projects/axe/axe2.html

(표준 선택기로 스타일이 지정된 왼쪽의 두 목록과 도끼 선택기로 스타일이 지정된 오른쪽의 두 목록 비교)


3
이 프로젝트는 현재 초기 베타 단계에 있습니다. <script src="https://rouninmedia.github.io/axe/axe.js"></script>HTML 문서의 맨 앞에을 포함시켜 CSS 스타일에서 (최소한의) 도끼 선택기를 활성화 할 수 있습니다 </body>.
Rounin

4

적어도 CSS 3 이하를 포함하면 선택할 수 없습니다. 그러나 오늘날 JavaScript에서는 쉽게 수행 할 수 있습니다. 바닐라 JavaScript를 약간 추가하면 코드가 매우 짧습니다.

cells = document.querySelectorAll('div');
[].forEach.call(cells, function (el) {
    //console.log(el.nodeName)
    if (el.hasChildNodes() && el.firstChild.nodeName=="A") {
        console.log(el)
    };
});
<div>Peter</div>
<div><a href="#">Jackson link</a></div>
<div>Philip</div>
<div><a href="#">Pullman link</a></div>


4

어떤 아이디어?

CSS 4는 거꾸로 걸어 갈 때 약간의 고리 를 추가하면 환상적 입니다. 그때까지이 (비록 수 없는 것이 좋습니다)를 사용 및 / 또는 이야 하는 휴식 도 CSS가 정상 범위의 외부에서 작동 할 수 있도록 일들이 연결되어 일반적인 방법을, 그 통해 ...checkboxradio input

/* Hide things that may be latter shown */
.menu__checkbox__selection,
.menu__checkbox__style,
.menu__hidden {
  display: none;
  visibility: hidden;
  opacity: 0;
  filter: alpha(opacity=0); /* Old Microsoft opacity */
}


/* Base style for content and style menu */
.main__content {
  background-color: lightgray;
  color: black;
}

.menu__hidden {
  background-color: black;
  color: lightgray;
  /* Make list look not so _listy_ */
  list-style: none;
  padding-left: 5px;
}

.menu__option {
  box-sizing: content-box;
  display: block;
  position: static;
  z-index: auto;
}

/* &#9660; - \u2630 - Three Bars */
/*
.menu__trigger__selection::before {
  content: '\2630';
  display: inline-block;
}
*/

/* &#9660; - Down Arrow */
.menu__trigger__selection::after {
  content: "\25BC";
  display: inline-block;
  transform: rotate(90deg);
}


/* Customize to look more `select` like if you like */
.menu__trigger__style:hover,
.menu__trigger__style:active {
  cursor: pointer;
  background-color: darkgray;
  color: white;
}


/**
 * Things to do when checkboxes/radios are checked
 */

.menu__checkbox__selection:checked + .menu__trigger__selection::after,
.menu__checkbox__selection[checked] + .menu__trigger__selection::after {
  transform: rotate(0deg);
}

/* This bit is something that you may see elsewhere */
.menu__checkbox__selection:checked ~ .menu__hidden,
.menu__checkbox__selection[checked] ~ .menu__hidden {
  display: block;
  visibility: visible;
  opacity: 1;
  filter: alpha(opacity=100); /* Microsoft!? */
}


/**
 * Hacky CSS only changes based off non-inline checkboxes
 * ... AKA the stuff you cannot unsee after this...
 */
.menu__checkbox__style[id="style-default"]:checked ~ .main__content {
  background-color: lightgray;
  color: black;
}

.menu__checkbox__style[id="style-default"]:checked ~ .main__content .menu__trigger__style[for="style-default"] {
  color: darkorange;
}

.menu__checkbox__style[id="style-one"]:checked ~ .main__content {
  background-color: black;
  color: lightgray;
}

.menu__checkbox__style[id="style-one"]:checked ~ .main__content .menu__trigger__style[for="style-one"] {
  color: darkorange;
}

.menu__checkbox__style[id="style-two"]:checked ~ .main__content {
  background-color: darkgreen;
  color: red;
}

.menu__checkbox__style[id="style-two"]:checked ~ .main__content .menu__trigger__style[for="style-two"] {
  color: darkorange;
}
<!--
  This bit works, but will one day cause troubles,
  but truth is you can stick checkbox/radio inputs
  just about anywhere and then call them by id with
  a `for` label. Keep scrolling to see what I mean
-->
<input type="radio"
       name="colorize"
       class="menu__checkbox__style"
       id="style-default">
<input type="radio"
       name="colorize"
       class="menu__checkbox__style"
       id="style-one">
<input type="radio"
       name="colorize"
       class="menu__checkbox__style"
       id="style-two">


<div class="main__content">

  <p class="paragraph__split">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
  </p>

  <input type="checkbox"
         class="menu__checkbox__selection"
         id="trigger-style-menu">
  <label for="trigger-style-menu"
         class="menu__trigger__selection"> Theme</label>

  <ul class="menu__hidden">
    <li class="menu__option">
      <label for="style-default"
             class="menu__trigger__style">Default Style</label>
    </li>

    <li class="menu__option">
      <label for="style-one"
             class="menu__trigger__style">First Alternative Style</label>
    </li>

    <li class="menu__option">
      <label for="style-two"
             class="menu__trigger__style">Second Alternative Style</label>
    </li>
  </ul>

  <p class="paragraph__split">
    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
    cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
    proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </p>

</div>

... 꽤 하지만 터치 다시 터치 아무것도 할 수 있지만, 단지 CSS와 HTML body:root거의 어디서나 연결하여 idfor특성 radio/ checkbox inputSlabel 트리거 ; 누군가가 언젠가 다시 수정하는 방법을 보여줄 것입니다.

한 추가주의해야 할 점은 단지이다 input 특정의 id아마, 사용 먼저 checkbox/ radio 승리 즉의 전환 상태 ... 그러나 여러 레이블이 같은 모든 점은 수 input즉, 심지어 그로서의되는 HTML과 CSS의 모습을 모두 만들 것입니다 불구하고.


... CSS 레벨 2에 고유 한 일종의 해결 방법이 있기를 바랍니다.

다른 :셀렉터 에 대해서는 잘 모르겠지만 :checkedCSS 3 이전에 대한 것입니다. 올바르게 기억 [checked]하면 위 코드에서 찾을 수있는 것과 같은 것입니다.

.menu__checkbox__selection:checked ~ .menu__hidden,
.menu__checkbox__selection[checked] ~ .menu__hidden {
 /* rules: and-stuff; */
}

...하지만 같은 것들에 대해 ::after그리고 :hover, 나는 그 처음 나타난 CSS 버전에서 모든 일정에 아니에요.

모든 것이 언급되었으므로, 분노가 아닌 프로덕션 환경에서는 절대 사용하지 마십시오. 농담으로, 즉 무언가를 할 수 있다고해서 반드시 해야 한다는 의미는 아닙니다 .


3

아니요, CSS에서만 부모를 선택할 수 없습니다.

그러나 이미 .active수업 이있는 것처럼 보이 므로 해당 수업을 li(대신)으로 이동하는 것이 더 쉽습니다 a. 그렇게하면 CSS liavia CSS에만 액세스 할 수 있습니다 .


1

자식 요소를 기반으로 부모 요소를 변경하는 것은 현재 <input>부모 요소 안에 요소 가있을 때만 가능 합니다. 입력에 포커스가 있으면 해당 상위 요소가 CSS를 사용하여 영향을받을 수 있습니다.

다음 예제는 :focus-withinCSS에서의 사용법 을 이해하는 데 도움이됩니다 .

.outer-div {
  width: 400px;
  height: 400px;
  padding: 50px;
  float: left
}

.outer-div:focus-within {
  background: red;
}

.inner-div {
  width: 200px;
  height: 200px;
  float: left;
  background: yellow;
  padding: 50px;
}
<div class="outer-div">
  <div class="inner-div">
    I want to change outer-div(Background color) class based on inner-div. Is it possible?
    <input type="text" placeholder="Name" />
  </div>
</div>


1

Sass 에서 앰퍼샌드로 가능합니다 .

h3
  font-size: 20px
  margin-bottom: 10px
  .some-parent-selector &
    font-size: 24px
    margin-bottom: 20px

CSS 출력 :

h3 {
  font-size: 20px;
  margin-bottom: 10px;
}
.some-parent-selector h3 {
  font-size: 24px;
  margin-bottom: 20px;
}

2
사실이지만 선택기를 미리 알고있는 경우에만 해당됩니다.
Shahar

11
목표 인의 부모를 선택 하지 않았습니다h3 . 이것은 h3의 자손 인을 선택 .some-parent-selector합니다.
Jacob Ford

1

그렇게하기 위해 JavaScript 코드를 고용했습니다. 예를 들어, 배열을 반복 할 때 React에서 다른 클래스를 부모 구성 요소에 추가하면 자식이 포함되어 있음을 나타냅니다.

<div className={`parent ${hasKiddos ? 'has-kiddos' : ''}`}>
    {kiddos.map(kid => <div key={kid.id} />)}
</div>

그리고 간단히 :

.parent {
    color: #000;
}

.parent.has-kiddos {
    color: red;
}

0

"CSS 워킹 그룹이 CSS 작업 그룹이 이전에 부모 선택기에 대한 제안을 거부 한 주요 이유는 브라우저 성능 및 증분 렌더링 문제와 관련이 있기 때문에"CSS 전처리기에는 부모 선택기가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.