Есть ли в CSS указатель-события: hoverOnly или аналогичный?

104

Просто играл со pointer-eventsсвойством в CSS.

У меня есть объект, divкоторый я хочу быть невидимым для всех событий мыши, кроме :hover.

Таким образом, все команды щелчка переходят divк следующей под ним, но div может сообщить, находится ли указатель мыши над ним или нет.

Кто-нибудь может сказать мне, можно ли это сделать?

HTML:

<div class="layer" style="z-index:20; pointer-events:none;">Top layer</div>
<div class="layer" style="z-index:10;">Bottom layer</div>

CSS:

.layer {
    position:absolute;
    top:0px;
    left:0px;
    height:400px;
    width:400px;
}
Джиммери
источник
2
Просто примечание, pointer-eventsне очень хорошо поддерживается в IE .
Vucko
2
звучит так, будто вам нужен javascript
Пит
Согласен с Питом, я знаю, что это специально запрашивает css, но была та же проблема, и самым простым решением для меня было просто заставить ребенка инициировать щелчок по родительскому объекту с помощью javascript stackoverflow.com/questions/35872534/…
Джерри Ша

Ответы:

12

Я не думаю, что можно достичь своих целей только с помощью CSS. Однако, как отмечали другие участники, это достаточно просто сделать в JQuery. Вот как я это сделал:

HTML

<div
  id="toplayer"
  class="layer"
  style="
    z-index: 20;
    pointer-events: none;
    background-color: white;
    display: none;
  "
>
  Top layer
</div>
<div id="bottomlayer" class="layer" style="z-index: 10">Bottom layer</div>

CSS (без изменений)

.layer {
    position:absolute;
    top:0px;
    left:0px;
    height:400px;
    width:400px;
}

JQuery

$(document).ready(function(){
    $("#bottomlayer").hover(
        function() {
            $("#toplayer").css("display", "block");
        },
        function() {
            $("#toplayer").css("display", "none");
        }
    );
});

Вот JSFiddle: http://www.jsfiddle.net/ReZ9M

Ксанко
источник
108

Только наведение. Это очень просто. Нет JS ... Также запретить действие по умолчанию для ссылки.

a:hover {
	color: red;
}
a:active {
	pointer-events: none;
}
<a href="www.google.com">Link here</a>

Изменить: поддерживается в IE 11 и выше http://caniuse.com/#search=pointer-events

Свободен Роб
источник
23
это «работает», однако не позволяет перейти к элементу ниже (по крайней мере, когда этот элемент является видео YouTube) - это, вероятно, единственная причина, по которой кому-то может понадобиться такое поведение в первую очередь
Simon_Weaver
1
Разве для этого не требуется щелкнуть элемент, чтобы отключить дальнейшие события указателя?
Mindwin
3
это
прекрасно
2
@PriyanshuJain, что, по вашему мнению, произойдет, если пользователь нажмет на кнопку?
Свободен Роб
1
умный 💐 (это все, что мне нужно сказать)
Davious
24

«Воровство» ответа Xanco, но без этого уродливого jQuery.

Фрагмент : Обратите внимание, что DIV расположены в обратном порядке

.layer {
  position: absolute;
  top: 0px;
  left: 0px;
  height: 400px;
  width: 400px;
}

#bottomlayer {
  z-index: 10
}

#toplayer {
  z-index: 20;
  pointer-events: none;
  background-color: white;
  display: none
}

#bottomlayer:hover~#toplayer {
  display: block
}
<div id="bottomlayer" class="layer">Bottom layer</div>
<div id="toplayer" class="layer">Top layer</div>

Ниет Темный Абсол
источник
2
извините, я все равно использую уродливый jquery. но проголосуйте за решение только для CSS!
Джиммери
это здорово - просто к вашему сведению, к сожалению, он не работает должным образом, если нижний слой содержит iframe: jsfiddle.net/ReZ9M/82
Simon_Weaver
1
Как это разрешить вопрос? OP запросил команды щелчка, чтобы пройти через изначально видимый элемент. В вашем решении они этого не делают, обратите внимание, что текст «Верхний слой» не может быть выделен ...
Тревер Томпсон,
6

Вы также можете обнаружить наведение курсора на другой элемент и применить стили к его дочернему элементу или использовать другие селекторы CSS, такие как смежные дочерние элементы и т. Д.

Однако это зависит от вашего случая.

При наведении курсора на родительский элемент. Я сделал это:

.child {
    pointer-events: none;
    background-color: white;
}

.parent:hover > .child {
    background-color: black;
}
Maciejmatu
источник
1

Я использую :hoverпсевдо-элемент равного размера родителя / контейнер для имитации парить над моей наложенной DIV, а затем установить наложения pointer-eventsна noneпройти через щелчки к элементам ниже.

Джереми Сабат
источник
0

Решение на чистом CSS для вашего запроса (свойство opacity используется только для иллюстрации необходимости переходов):

.hoverOnly:hover {
    pointer-events: none;
    opacity: 0.1;
    transition-delay: 0s;
}
.hoverOnly {
    transition: ,5s all;
    opacity: 0.75;
    transition-delay: 2s;
}

Что оно делает:

Когда мышь входит в поле, она запускает :hoverсостояние. Однако в этом состоянии события указателя отключены.

Но если вы не установите таймеры переходов, div отменит состояние зависания при перемещении мыши; состояние наведения будет мерцать, пока мышь перемещается внутри элемента. Вы можете понять это, используя приведенный выше код со свойствами непрозрачности.

Установка задержки перехода из состояния зависания исправляет это. 2sЗначение может быть изменено в соответствии с вашими потребностями.

Кредиты на настройки переходов: patad на этот ответ .

Mindwin
источник
Когда я попробовал это решение, элемент просто застревает в состоянии «зависания».
Flimm,
0

Просто чистый css , jquery не нужен :

div:hover {pointer-events: none}
div {pointer-events: auto}
Барик Дхармаван
источник
Привет - большое спасибо за это - можете ли вы добавить демонстрацию к своему ответу (например, фрагмент кода или ссылку на него в codepen или jsfiddle?) - и знаете ли вы, какая у этого совместимость? это новая функция CSS3? Если это сработает, я обязательно
поставлю
извините, я не могу создать демо. Но, по моей логике, он определенно работает во всех браузерах (я не знаю, например, потому что у меня нет IE). И это поддержка css1 :)
Барик Дхармаван
caniuse.com/#feat=pointer-events - не будет работать ни в одном IE, кроме 11 ... если вы создадите рабочую демонстрацию того, что вы имеете в виду здесь codepen.io, я протестирую его для вас, и если он сработает, я наградить вас правильным ответом - извините, я не могу
приписать
@brillout можешь добавить фрагмент? Bcz это работа для меня
Барик Дхармаван