Solo quería compartir algo contigo.
Me costó un poco con ng-mouseenter
y ng-mouseleave
eventos.
El caso de estudio:
Creé un menú de navegación flotante que se alterna cuando el cursor está sobre un icono.
Este menú estaba en la parte superior de cada página.
- Para manejar mostrar / ocultar en el menú, alterno una clase.
ng-class="{down: vm.isHover}"
- Para alternar vm.isHover , uso los eventos ng mouse.
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Por ahora, todo estaba bien y funcionó como se esperaba.
La solución es limpia y simple.
El problema entrante:
En una vista específica, tengo una lista de elementos.
Agregué un panel de acción cuando el cursor está sobre un elemento de la lista.
Usé el mismo código que el anterior para manejar el comportamiento.
El problema:
Descubrí que cuando mi cursor está en el menú de navegación flotante y también en la parte superior de un elemento, hay un conflicto entre ellos.
El panel de acción apareció y la navegación flotante fue ocultar.
La cuestión es que incluso si el cursor está sobre el menú de navegación flotante, se activa el elemento de lista ng-mouseenter.
No tiene sentido para mí, porque esperaría una interrupción automática de los eventos de propagación del mouse.
Debo decir que me sentí decepcionado y dedico algo de tiempo a descubrir ese problema.
Primeros pensamientos:
Traté de usar estos:
$event.stopPropagation()
$event.stopImmediatePropagation()
Combiné muchos eventos de puntero ng (mousemove, mouveover, ...) pero ninguno me ayudó.
Solución CSS:
Encontré la solución con una propiedad css simple que uso cada vez más:
pointer-events: none;
Básicamente, lo uso así (en los elementos de mi lista):
ng-style="{'pointer-events': vm.isHover ? 'none' : ''}"
Con este complicado, los eventos ng-mouse ya no se activarán y mi menú de navegación flotante ya no se cerrará cuando el cursor esté sobre él y sobre un elemento de la lista.
Para llegar más lejos:
Como es de esperar, esta solución funciona pero no me gusta.
No controlamos nuestros eventos y es malo.
Además, debe tener acceso al vm.isHover
alcance para lograrlo y puede que no sea posible o posible, pero sucio de alguna manera u otra.
Podría hacer un violín si alguien quiere mirar.
Sin embargo, no tengo otra solución ...
Es una larga historia y no puedo darte una papa, así que perdóname amigo.
De todos modos, pointer-events: none
es la vida, así que recuérdalo.