한 요소를 가리킬 때 다른 요소에 영향을 미치는 방법


459

내가하고 싶은 것은 특정 항목 div을 가리키면 다른 속성에 영향을 미칩니다 div.

예를 들어,에서 이 JSFiddle 데모 , 때를 가져가 위로 #cube가 변경 background-color하지만 내가 원하는 것은 내가 가져가 이상 할 때이다 #container, #cube영향을 받는다.

div {
  outline: 1px solid red;
}
#container {
  width: 200px;
  height: 30px;
}
#cube {
  width: 30px;
  height: 100%;
  background-color: red;
}
#cube:hover {
  width: 30px;
  height: 100%;
  background-color: blue;
}
<div id="container">

  <div id="cube">
  </div>

</div>

답변:


984

큐브가 컨테이너 내부에 직접있는 경우 :

#container:hover > #cube { background-color: yellow; }

컨테이너가 태그를 닫은 후 큐브 옆에 컨테이너가있는 경우 :

#container:hover + #cube { background-color: yellow; }

큐브가 컨테이너 내부에있는 경우 :

#container:hover #cube { background-color: yellow; }

큐브가 컨테이너의 형제 인 경우 :

#container:hover ~ #cube { background-color: yellow; }

107
~'큐브는 DOM의 컨테이너 뒤에 있고 부모를 공유합니다'에 대한 일반적인 형제 결합 자를 잊지 마십시오.
robertc

3
꽤 괜찮은데. 그것에 대한 자세한 정보를 찾을 수있는 소스가 있습니까? 모든 브라우저에서 지원됩니까, CSS3입니까? 그것에 대해 더 많은 정보를 얻는 것이 좋을 것입니다. 정말 고마워!
Anonymous

2
+1 위대한 답변 @Mike. 경우는 무엇 #container옆에 #cube, 즉 #container다음 #cube?
PeterKA

4
호버링 된 요소가 컨테이너 내부에있는 경우 수행 할 작업 예를 들면 다음과 같습니다. #cube : hover #container {일부 CSS 효과}
Hanzallah Afgan

2
좋은 대답 !! 아이를 가리키면 부모를 바꾸려면 어떻게해야합니까? 나는 그것에 대한 선택기가 없다고 생각합니다.
Mikel

41

이 특정 예에서는 다음을 사용할 수 있습니다.

#container:hover #cube {
    background-color: yellow;   
}

이 예제 cube는의 자식 이므로 작동합니다 container. 보다 복잡한 시나리오의 경우 다른 CSS를 사용하거나 JavaScript를 사용해야합니다.


35

형제 선택기를 사용하는 것은 주어진 요소 위로 마우스를 가져갈 때 다른 요소를 스타일링하는 일반적인 솔루션 이지만 다른 요소가 DOM에서 주어진 요소를 따르는 경우에만 작동 합니다 . 다른 요소가 실제로 호버링 된 요소 앞에 있어야하는 경우 어떻게해야합니까? 아래와 같은 신호 막대 등급 위젯을 구현한다고 가정 해보십시오.

신호 막대 등급 위젯

이것은 실제로 설정하여 CSS의 인 flexbox 모델을 사용하여 쉽게 수행 할 수 있습니다 flex-directionreverse요소가 그들이 DOM에있어 것과 반대의 순서로 표시됩니다 그래서. 위 스크린 샷은 순수한 CSS로 구현 된 위젯에서 나온 것입니다.

Flexbox는 최신 브라우저의 95 %에서 잘 지원 됩니다.


마우스를 1 막대에서 다른 막대로 옮길 때 하이라이트가 사라지지 않도록 편집 할 수 있습니까? 깜박임이 약간 산만합니다.
Cerbrus

@Cerbrus : 마우스가 막대 사이에있을 때 호버를 숨기지 않는 솔루션이 추가되었습니다. 단점은 막대의 너비가 더 이상 동일하지 않다는 것입니다.
Dan Dascalescu

1
첫 번째 스 니펫에서 시도해보십시오 : on .rating div, 여백을 제거하고 추가하십시오border-right: 4px solid white;
Cerbrus

1
플렉스 방향 (IE에서는 잘 지원되지 않음) 또는 1) 기본적으로 검은 색 2) 컨테이너 위의 마우스의 모든 파란색 3) 막대 호버에서 다음 형제를위한 검은 색 :)
Stephane Mathis

나는이 바이올린을 만들었습니다. (적어도 나를 위해) 여기에서 무슨 일이 일어나고 있는지에 대해 조금 더 부모가되었습니다. jsfiddle.net/maxshuty/cj55y33p/3
maxshuty

8

유용한 게시물에 대해 Mike와 Robertc에게 감사드립니다.

HTML에 두 개의 요소가 있고 :hover하나 이상의 요소를 변경하고 다른 스타일의 스타일 변경을 목표로하려면 두 요소가 부모, 자녀 또는 형제 자매와 직접 관련되어 있어야합니다. 즉, 두 요소는 다른 요소의 내부에 있어야하거나 동일한 더 큰 요소 내에 포함되어야합니다.

사용자가 내 사이트를 :hover통해 강조 표시된 용어를 읽을 때 브라우저 오른쪽의 상자에 정의를 표시하고 싶었습니다 . 따라서 'text'요소 안에 'definition'요소를 표시하고 싶지 않았습니다.

나는 거의 포기하고 방금 내 페이지에 자바 스크립트를 추가했지만 이것이 미래에 달려 있습니다! CSS와 HTML의 백 삭감을 참아서는 안되며 원하는 효과를 얻기 위해 요소를 어디에 배치해야하는지 알려줍니다! 결국 우리는 타협했습니다.

파일의 실제 HTML 요소가 서로 중첩되거나 단일 요소에 포함되어 있어야 유효한 :hover대상 position이되지만 css 속성을 사용하여 원하는 위치에 요소를 표시 할 수 있습니다. position : fixed를 사용 :hover하여 HTML 문서의 위치에 관계없이 사용자의 화면에 원하는 위치에 작업 대상을 배치했습니다 .

HTML :

<div id="explainBox" class="explainBox"> /*Common parent*/

  <a class="defP" id="light" href="http://en.wikipedia.or/wiki/Light">Light                            /*highlighted term in text*/
  </a> is as ubiquitous as it is mysterious. /*plain text*/

  <div id="definitions"> /*Container for :hover-displayed definitions*/
    <p class="def" id="light"> /*example definition entry*/ Light:
      <br/>Short Answer: The type of energy you see
    </p>
  </div>

</div>

CSS :

/*read: "when user hovers over #light somewhere inside #explainBox
    set display to inline-block for #light directly inside of #definitions.*/

#explainBox #light:hover~#definitions>#light {
  display: inline-block;
}

.def {
  display: none;
}

#definitions {
  background-color: black;
  position: fixed;
  /*position attribute*/
  top: 5em;
  /*position attribute*/
  right: 2em;
  /*position attribute*/
  width: 20em;
  height: 30em;
  border: 1px solid orange;
  border-radius: 12px;
  padding: 10px;
}

이 예제에서 :hover요소 의 명령 대상은 또는 안에 #explainBox있어야합니다 . #definitions에 할당 된 위치 속성 은 기술적으로 HTML 문서 내에서 원하지 않는 위치에 있더라도 원하는 위치 (외부 )에 표시되도록합니다.#explainBox#explainBox#explainBox

#id두 개 이상의 HTML 요소에 동일한 형식을 사용하는 것은 잘못된 형식으로 간주됩니다 . 그러나,이 경우, #light고유 한 #id요소 에서의 각각의 위치로 인해 인스턴스가 독립적으로 기술 될 수있다 . id #light이 경우 반복하지 않는 이유가 있습니까?


그러한 짧은 요점에 대한 긴 대답이지만 여기 jsfiddle이 있습니다. jsfiddle.net/ubershmekel/bWgq6/1
ubershmekel

1
동일한 브라우저를 ID여러 번 사용하면 일부 브라우저가 놀라게됩니다 . 를 사용하십시오 class.
Serj Sagan

6

이것 만이 나를 위해 일했습니다 :

#container:hover .cube { background-color: yellow; }

.cubeCssClass는 어디에 있습니까 #cube?

Firefox , ChromeEdge 에서 테스트되었습니다 .


4

다음은 특정 선택기를 고려하지 않고 :hover주 요소 의 상태 만 사용하여 다른 요소에 영향을 줄 수있는 또 다른 아이디어입니다 .

이를 위해 사용자 지정 속성 (CSS 변수)을 사용합니다. 우리가 사양 에서 읽을 수 있듯이 :

사용자 정의 속성은 일반 속성 이므로 모든 요소에서 선언 할 수 있으며 일반 상속계단식 규칙으로 해결 됩니다 ...

기본 요소 내에서 사용자 정의 특성을 정의하고이를 사용하여 하위 요소의 스타일을 지정하는 것이 목적이며 이러한 특성이 상속되므로 마우스를 가져 가면 기본 요소 내에서 변경해야합니다.

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

#container {
  width: 200px;
  height: 30px;
  border: 1px solid var(--c);
  --c:red;
}
#container:hover {
  --c:blue;
}
#container > div {
  width: 30px;
  height: 100%;
  background-color: var(--c);
}
<div id="container">
  <div>
  </div>
</div>

호버와 결합 된 특정 선택기를 사용하는 것보다 이것이 더 나은 이유는 무엇입니까?

이 방법을 고려하기에 좋은 이유는 2 가지 이상 있습니다.

  1. 동일한 스타일을 공유하는 많은 중첩 요소가있는 경우 복잡한 선택기가 호버링 할 때 모든 요소를 ​​타겟팅하지 않아도됩니다. 사용자 지정 속성을 사용하면 부모 요소를 가리키면 값이 변경됩니다.
  2. 사용자 정의 특성을 사용하여 특성 값과 그 일부 값을 바꿀 수 있습니다. 예를 들어 우리는 색에 대한 사용자 정의 속성을 정의하고 우리가 내에서 사용 border, linear-gradient, background-color, box-shadow등이 호버에 모두에게 이러한 속성을 다시 설정하라는 우리를 방지 할 수 있습니다.

보다 복잡한 예는 다음과 같습니다.

.container {
  --c:red;
  width:400px;
  display:flex;
  border:1px solid var(--c);
  justify-content:space-between;
  padding:5px;
  background:linear-gradient(var(--c),var(--c)) 0 50%/100% 3px no-repeat;
}
.box {
  width:30%;
  background:var(--c);
  box-shadow:0px 0px 5px var(--c);
  position:relative;
}
.box:before {
  content:"A";
  display:block;
  width:15px;
  margin:0 auto;
  height:100%;
  color:var(--c);
  background:#fff;
}

/*Hover*/
.container:hover {
  --c:blue;
}
<div class="container">
<div class="box"></div>
<div class="box"></div>
</div>

위에서 볼 수 있듯이 다른 요소의 많은 속성을 변경하려면 CSS 선언이 하나만 필요 합니다.

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