Я создаю промежуток, который будет отображаться при зависании, но я хотел бы, чтобы он отображался при наведении курсора на каждую часть div [duplicate]

Это работало для меня на узле ASP.NET MVC3, где я оставил структуру для настройки ненавязчивой проверки и т. д., если это полезно кому угодно:

$("form").data("validator").settings.ignore = "";
317
задан TylerH 24 March 2016 в 21:39
поделиться

5 ответов

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

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

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

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

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

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

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

#container:hover ~ #cube { background-color: yellow; }
681
ответ дан rockfeeler 15 August 2018 в 22:37
поделиться
  • 1
    Не забывайте, что общий компилятор sibling ~ для 'cube находится где-то после контейнера в DOM и разделяет родительский элемент' – robertc 21 December 2010 в 19:50
  • 2
    Это круто. Есть ли какой-то источник, где я могу найти больше информации об этом? Поддерживается ли он всеми браузерами, это CSS3? Было бы здорово получить дополнительную информацию об этом. Спасибо! – Anonymous 19 October 2011 в 11:35
  • 3
    Дополнительная информация о CSS-селекторах: w3schools.com/cssref/css_selectors.asp – Mike 19 October 2011 в 14:04
  • 4
    +1 Отличный ответ @Mike. Что, если #container находится рядом с #cube, т. Е. #container следует #cube? – PeterKA 2 October 2014 в 05:58
  • 5
    Что делать, если наведенный элемент находится внутри контейнера (который мы хотим выполнить) ??? Например: #cube: hover #container {Некоторые эффекты CSS} – Hanzallah Afgan 3 March 2015 в 16:19

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

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

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>

22
ответ дан Dan Dascalescu 15 August 2018 в 22:37
поделиться
  • 1
    Может ли это быть отредактировано, чтобы подсветка не исчезла при перемещении мыши от 1 до другого? Мигание немного отвлекает. – Cerbrus 9 September 2015 в 06:23
  • 2
    @Cerbrus: добавлено решение, которое не скрывает зависание, когда мышь находится между столбцами. Недостатком является то, что ширина баров больше не равна. – Dan Dascalescu 9 September 2015 в 09:22
  • 3
    Попробуйте это в своем первом фрагменте: на .rating div, удалите поле и добавьте border-right: 4px solid white; – Cerbrus 9 September 2015 в 09:47
  • 4
    Гибкое направление (не поддерживается для IE) ИЛИ 1) черный по умолчанию 2) все синие на мыши над контейнером 3) черные для следующего брата на паре: – Stephane Mathis 16 October 2015 в 10:30
  • 5
    Я сделал эту скрипку, которая (по крайней мере для меня) сделала ее немного более похожей на то, что происходило здесь. jsfiddle.net/maxshuty/cj55y33p/3 – maxshuty 15 June 2017 в 12:27

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

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

Где .cube - CssClass для #cube.

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

6
ответ дан Igor Ivancha 15 August 2018 в 22:37
поделиться
  • 1
    Довольно длинный ответ для такой короткой точки, но вот ее смысл jsfiddle.net/ubershmekel/bWgq6/1 – ubershmekel 4 January 2014 в 03:15
  • 2
    некоторые браузеры будут волноваться, когда вы будете использовать один и тот же ID несколько раз. Просто используйте class. – Serj Sagan 21 July 2016 в 17:51

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

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

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

34
ответ дан KyleMit 15 August 2018 в 22:37
поделиться
  • 1
    О, хорошо! спасибо за разъяснение, я не заметил! thxs !!! – Trufa 21 December 2010 в 19:34
  • 2
    Как показано выше, это неверно. Вы все еще можете использовать CSS для воздействия на другие элементы, которые не являются дочерними. – Zoyt 31 December 2014 в 23:54

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

Почему это может быть лучше, чем использование специального селектора в сочетании с hover?

Я могу предоставить по крайней мере 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 для изменения многих свойств различных элементов.

0
ответ дан Temani Afif 15 August 2018 в 22:37
поделиться