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;
}

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


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


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>


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;
}

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.


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 .


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}

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.