Existe um `ponteiro-events: hoverOnly` ou similar em CSS?

100

Acabei de brincar com pointer-eventspropriedade em CSS.

Eu tenho um divque quero ficar invisível para todos os eventos do mouse, exceto para :hover.

Assim, todos os comandos de clique passam pelo divpara o abaixo dele, mas o div pode relatar se o mouse está acima dele ou não.

Alguém pode me dizer se isso pode ser feito?

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;
}
Jimmery
fonte
2
Apenas uma nota, pointer-eventsnão é bem suportado no IE .
Vucko
2
parece que você precisa de javascript
Pete
Concordo com Pete, sei que isso é especificamente pedir css, mas tive o mesmo problema e a solução mais fácil para mim foi apenas fazer a criança iniciar um clique para o pai com javascript stackoverflow.com/questions/35872534/…
Jerry Sha

Respostas:

12

Não acho que seja possível atingir seus objetivos apenas em CSS. No entanto, como outros colaboradores mencionaram, é bastante fácil de fazer em JQuery. Veja como eu fiz:

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 (inalterado)

.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");
        }
    );
});

Aqui está o JSFiddle: http://www.jsfiddle.net/ReZ9M

Xanco
fonte
106

Passe o mouse apenas. Isso é muito fácil. Sem JS ... Impedir ação padrão do link também.

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

Editar: compatível com IE 11 e superior http://caniuse.com/#search=pointer-events

Свободен Роб
fonte
23
isso 'funciona' - no entanto, não permite clicar em um elemento abaixo (pelo menos não quando esse elemento é um vídeo do YouTube) - que é provavelmente a única razão pela qual alguém precisaria desse comportamento em primeiro lugar
Simon_Weaver
1
isso não requer um clique no elemento para desativar outros eventos de ponteiro?
Mindwin
3
isso é lindo
user2860957
2
@PriyanshuJain o que você acha que acontecerá se o usuário clicar no botão?
Свободен Роб
1
inteligente 💐 (é tudo o que preciso dizer)
Davious,
24

"Roubar" a resposta de Xanco, mas sem aquela jQuery feia, feia.

Snippet : Observe que os DIVs estão na ordem inversa

.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>

Niet the Dark Absol
fonte
2
desculpe, estou usando o jquery feio de qualquer maneira. mas tenha um voto positivo para uma solução apenas CSS!
Jimmery
isso é ótimo - apenas para sua informação, infelizmente não funciona corretamente se a camada inferior contiver um iframe: jsfiddle.net/ReZ9M/82
Simon_Weaver
1
Como isso resolve a questão? O OP pediu comandos de clique para percorrer o elemento inicialmente visível. Em sua solução eles não, observe como o texto "Camada superior" não pode ser destacado ...
Trever Thompson
6

Você também pode detectar a passagem do mouse sobre um elemento diferente e aplicar estilos a seu filho, ou usar outros seletores css como filhos adjacentes, etc.

Depende do seu caso.

No elemento pai, passe o mouse. Eu fiz isso:

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

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

I utilizar a :hoverpseudo-elemento de um pai / recipiente de igual tamanho para simular um pairar sobre o meu sobreposição div, em seguida, definir a sobreposição pointer-eventspara nonepassar através de cliques para elementos abaixo.

Jeremy Sabath
fonte
0

Solução CSS puro para sua solicitação (a propriedade opacity existe apenas para ilustrar a necessidade das transições):

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

O que faz:

Quando o mouse entra na caixa, ele aciona o :hover estado. No entanto, nesse estado, os eventos de ponteiro são desabilitados.

Mas se você não definir os temporizadores de transição, o div cancelará o estado de foco quando o mouse se mover; o estado de foco irá piscar enquanto o mouse está se movendo dentro do elemento. Você pode perceber isso usando o código acima com as propriedades de opacidade.

Definir um atraso para a transição fora do estado de foco corrige isso. O 2svalor pode ser ajustado para atender às suas necessidades.

Créditos para transições ajustar: patad sobre esta resposta .

Mindwin
fonte
O elemento simplesmente fica preso no estado "pairar" quando tentei essa solução.
Flimm em
0

Apenas css puro , não precisa de jquery :

div:hover {pointer-events: none}
div {pointer-events: auto}
Bariq Dharmawan
fonte
Olá - muito obrigado por isso - você pode adicionar uma demonstração à sua resposta (como um trecho de código ou um link para isso no codepen ou jsfiddle?) - e você sabe que tipo de compatibilidade isso tem? é um novo recurso CSS3? Se funcionar, com certeza vou te dar uma
chance
desculpe, não posso criar uma demonstração. Mas na minha lógica, definitivamente funciona em todos os navegadores (não sei sobre o ie, porque não tenho o ie). E, suporte de css1 :)
Bariq Dharmawan
caniuse.com/#feat=pointer-events - não funcionará em nenhum IE, exceto 11 ... se você criar uma demonstração funcional do que quer dizer aqui codepen.io , testarei para você e, se funcionar, irei conceder-lhe a resposta correta - desculpe, não posso atribuir isso ao código teórico - apenas uma demonstração funcional
Jimmery
@brillout você pode adicionar um trecho? Bcz é trabalho para mim
Bariq Dharmawan