Как влиять на другие элементы, когда висит div

Я думаю, что это очень простой вопрос, но я не уверен, как это можно сделать.

Что я хочу сделать, это когда определенный div зависает, это повлияет на свойства другого div.

Например, в этот простой пример, когда вы наведите указатель мыши на #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>

Ответ 1

Если куб находится непосредственно внутри контейнера:

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

Если куб рядом с (после закрытия контейнера), контейнер:

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

Если куб находится где-то внутри контейнера:

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

Если куб является дочерним элементом контейнера:

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

Ответ 2

В этом конкретном примере вы можете использовать:

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

Это работает только с cube является дочерним элементом container. Для более сложных сценариев вам нужно будет использовать javascript.

Ответ 3

Использование селектора sibling - это общее решение для стилизации других элементов при наведении курсора на заданный, , но работает только в том случае, если другие элементы следуют за данным в DOM. Что мы можем сделать, когда другие элементы должны быть на самом деле до зависания? Предположим, что мы хотим реализовать виджет оценки уровня сигнала, как показано ниже:

Виджет рейтинга сигнальных баров

Это можно легко сделать с помощью модели CSS flexbox, установив flex-direction на reverse, чтобы элементы отображаются в противоположном порядке от того, который находится в DOM. Снимок экрана выше из такого виджета, реализованного с помощью чистого CSS.

Flexbox очень хорошо поддерживается на 95% современных браузеров.

.rating {
  display: flex;
  flex-direction: row-reverse;
  width: 9rem;
}
.rating div {
  flex: 1;
  align-self: flex-end;
  background-color: black;
  border: 0.1rem solid white;
}
.rating div:hover {
  background-color: lightblue;
}
.rating div[data-rating="1"] {
  height: 5rem;
}
.rating div[data-rating="2"] {
  height: 4rem;
}
.rating div[data-rating="3"] {
  height: 3rem;
}
.rating div[data-rating="4"] {
  height: 2rem;
}
.rating div[data-rating="5"] {
  height: 1rem;
}
.rating div:hover ~ div {
  background-color: lightblue;
}
<div class="rating">
  <div data-rating="1"></div>
  <div data-rating="2"></div>
  <div data-rating="3"></div>
  <div data-rating="4"></div>
  <div data-rating="5"></div>
</div>

Ответ 4

Большое спасибо Майку и Роберту за их полезные посты!

Если у вас есть два элемента в вашем HTML, и вы хотите :hover по одному и нацелиться на изменение стиля, в другом должны быть непосредственно связаны два элемента - родители, дети или братья и сестры. Это означает, что оба элемента либо должны быть внутри одного или оба должны содержаться в одном и том же более крупном элементе.

Я хотел отображать определения в окне справа от браузера, когда мои пользователи просматривали мой сайт и :hover по выделенным терминам; поэтому я не хотел, чтобы элемент 'definition' отображался внутри элемента 'text'.

Я чуть не сдался и просто добавил javascript на свою страницу, но это будущее. Нам не нужно мириться с CSS и HTML, рассказывая нам, где мы должны размещать наши элементы для достижения желаемых эффектов! В итоге мы скомпрометировали.

В то время как фактические элементы HTML в файле должны быть либо вложенными, либо содержащимися в одном элементе, чтобы быть допустимыми :hover мишенями друг к другу, атрибут css position может использоваться для отображения любого элемента, где когда-либо вы хотите. Я использовал позицию: исправлено, чтобы разместить цель моего действия :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 должна быть либо #explainBox, либо также внутри #explainBox. Атрибуты позиции, назначенные #definitions, заставляют его отображаться в нужном месте (вне #explainBox), даже если он технически находится в нежелательной позиции в документе HTML.

Я понимаю, что считается неправильной формой использовать те же #id для более чем одного элемента HTML; однако в этом случае случаи #light могут быть описаны независимо из-за их соответствующих положений в элементах #id 'd. Есть ли причина не повторять id #light в этом случае?

Ответ 5

Только это сработало для меня:

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

Где .cube - это CssClass #cube.

Протестировано в Firefox, Chrome и Edge.

Ответ 6

Вот еще одна идея, которая позволяет вам влиять на другие элементы, не принимая во внимание какой-либо конкретный селектор и используя только состояние :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>