Чи є в CSS `pointer-events: hoverOnly` або подібний?


103

Просто пограв із 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


107

Лише наведіть курсор. Це дуже просто. Немає 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
це
beutifull

2
@PriyanshuJain, що, на вашу думку, станеться, якщо користувач натисне кнопку?
Свободен Роб

1
кмітливий 💐 (це все, що мені потрібно сказати)
Дейвіс

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!
Джиммері

це чудово - просто FYI, на жаль, він не працює належним чином, якщо нижній шар містить iframe: jsfiddle.net/ReZ9M/82
Simon_Weaver

1
Як це вирішує питання? OP попросив команди клацання, щоб пройти через спочатку видимий елемент. У вашому рішенні вони цього не роблять, зауважте, як текст "Верхній шар" не можна виділити ...
Тревер Томпсон,

6

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

Однак це залежить від вашого випадку.

На батьківському елементі наведіть курсор. Я зробив це:

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

.parent:hover > .child {
    background-color: black;
}

1

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


0

Чисте рішення CSS для вашого запиту (властивість непрозорості існує лише для того, щоб проілюструвати необхідність переходів):

.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 на цей відповідь .


Елемент просто застряє у стані "зависання", коли я спробував це рішення.
Флімм

0

Просто чистий css , не потребує jquery :

div:hover {pointer-events: none}
div {pointer-events: auto}

Привіт - велике спасибі за це - чи можете ви додати демонстрацію до своєї відповіді (наприклад, фрагмент коду або посилання на це в codepen або jsfiddle?) - і чи знаєте ви, яку сумісність це має? це нова функція CSS3? Якщо це спрацює, я точно дам вам галочку :)
Джиммері

вибачте, я не можу створити демо. Але за моєю логікою, це точно працює у всіх браузерах (я не знаю про ie, тому що у мене немає ie). І, підтримка від css1 :)
Барік Дхармаван

caniuse.com/#feat=pointer-events - не буде працювати в будь-якому IE, крім 11 ... якщо ви створите робочу демонстрацію того, що ви маєте на увазі тут codepen.io, я перевірю це для вас, і якщо це спрацює, я нагородити вас правильною відповіддю - вибачте, я не можу присудити це теоретичному коду - лише робочій демонстрації
Джиммері

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