Як вплинути на інші елементи, коли один елемент завис


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? Було б чудово мати трохи більше інформації про це. Дуже дякую!
Анонім

2
+1 Чудова відповідь @Mike. Що робити, якщо #containerзнаходиться поруч #cube, тобто #containerслід #cube?
PeterKA

4
Що робити, якщо накладений елемент знаходиться всередині контейнера (що ми хочемо, щоб це було зроблено) ??? Наприклад: #cube: hover #container {Деякі ефекти CSS}
Hanzallah Afgan

2
Хороша відповідь !! Що робити, якщо я хочу змінити батьків, коли я наводя дитину. Я думаю, що для цього немає селектора.
Мікель

41

У цьому конкретному прикладі ви можете використовувати:

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

Цей приклад працює лише з часів cubeдитини container. Для складніших сценаріїв вам потрібно буде використовувати різні CSS або використовувати JavaScript.


35

Використання селектора сестер є загальним рішенням для стилізації інших елементів під час наведення курсору на заданий, але він працює лише в тому випадку, якщо інші елементи слідують за даними у DOM . Що ми можемо зробити, коли інші елементи насправді повинні бути перед завислими? Скажімо, ми хочемо реалізувати віджет з оцінки сигнальної смуги на зразок наведеного нижче:

Віджет для оцінки сигнальної смуги

Це дійсно може бути легко зробити з допомогою моделі Flexbox CSS, встановивши flex-directionдля reverse, так що елементи відображаються в порядку , зворотному від одного вони знаходяться в DOM. Знімок екрана, наведений вище, з такого віджета, реалізованого з чистим CSS.

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


Чи можна це відредагувати, щоб виділення не зникало при переміщенні миші з 1 бар на інший? Миготіння трохи відволікає.
Цербр

@Cerbrus: Додано рішення, яке не приховує наведення миші, коли миша знаходиться між брусками. Мінус - ширина брусків вже не дорівнює.
Дан Даскалеску

1
Спробуйте це у своєму першому фрагменті: .rating divвидаліть поле та додайтеborder-right: 4px solid white;
Cerbrus

1
Напрямок гнучкості (не підтримується IE) АБО 1) чорний за замовчуванням 2) все синє на миші над контейнером 3) чорне для наступного побратима на панелі наведення курсора :)
Стефан Матіс

Я зробив цю загадку, яка (принаймні для мене) зробила її трохи більш зрозумілою щодо того, що тут відбувається. jsfiddle.net/maxshuty/cj55y33p/3
maxshuty

8

Велика подяка Майку та Роберту за їх корисні пости!

Якщо у вашому HTML є два елементи, і ви хочете перейти :hoverна один та націлити на зміну стилю, в іншому два елементи повинні бути безпосередньо пов’язані - батьки, діти чи брати і сестри. Це означає, що два елементи або повинні бути один усередині іншого, або обидва повинні міститись в межах одного більшого елемента.

Я хотів відобразити визначення у вікні праворуч браузера, коли мої користувачі читали на моєму веб-сайті та :hoverза допомогою виділених термінів; тому я не хотів, щоб елемент 'визначення' відображався всередині елемента 'текст'.

Я майже відмовився і просто додав JavaScript на свою сторінку, але це майбутнє, бовтайте це! Нам не доведеться миритися із зворотним sass від CSS та HTML, що вказує нам, де ми повинні розмістити наші елементи для досягнення бажаних ефектів! Врешті-решт ми пішли на компроміс.

Хоча фактичні елементи HTML у файлі повинні бути або вкладеними, або міститися в одному елементі, щоб бути дійсними :hoverцілями один для одного, positionатрибут css може використовуватися для відображення будь-якого елемента, де завгодно. Я використовував позицію: фіксований, щоб розмістити ціль моєї :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можуть бути описані незалежно через їх відповідні позиції в унікально #idd-елементах. Чи є причина, щоб не повторити це id #lightв цьому випадку?


Досить довга відповідь на такий короткий момент, але ось jsfiddle цього jsfiddle.net/ubershmekel/bWgq6/1
ubershmekel

1
деякі веб-броунери будуть відлякуватися, коли ви використовуєте одне і те ж IDкілька разів. Просто використовуйте class.
Serj Sagan

6

Тільки це працювало для мене:

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

Де .cubeCssClass #cube.

Тестується в Firefox , Chrome та Edge .


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 , щоб змінити багато властивостей різних елементів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.