2011-01-25 9 views
5

Tengo un calendario, y cuando el usuario se desplaza sobre una celda, aparece un cuadro de información grande con detalles para esa fecha. Tengo problemas para hacer desaparecer el cuadro de información cuando el usuario se va.Implementación de un cuadro de información contextual

Básicamente lo quiero para que cuando el cursor del mouse se salga de la celda de calendario que está oculta en el cuadro de información, desaparecerá. Pero estoy teniendo problemas con esto porque mouseenter y mouseleave se arruinan al tener el cuadro de información como el elemento superior.

Así que traté de evitar esto usando divs "placeholders" que son transparentes, tienen la misma forma y ubicación que la celda del calendario debajo de ellos, y tienen un índice z de 1000 para que estén encima del cuadro de información. A continuación, aplico los eventos mouseenter y mouseleave a estos divs.

Sin embargo, hay dos problemas con esto. Uno, ahora he arruinado mi HTML semánticamente. Los divs no tienen otro propósito que sortear lo que parece ser una limitación. Y en segundo lugar, estropean mi selección de jQuery UI (la he aplicado a las celdas del calendario; un clic ya no selecciona una celda).

¿Hay una manera limpia de manejar la visualización de un cuadro de información? No habrá interacción del usuario con el cuadro de información, solo se mostrará información.

EDITAR: Aquí hay un código:

<li> 
    <div class="day-content"> 
    </div> 
    <div class="day-content-placeholder"> 
    </div> 
</li> 

y CSS

li 
    { position: absolute; width: 15%; height: 20%; top: ... left: ... } 
.day-content 
    { position: absolute; width: 100%; height: 100%; } 
.day-content-placeholder 
    { position: absolute; width: 100%; height: 100%; z-index: 1000; } 
.popup 
    { position: absolute; width: 300%; height: 300%; left: -150%; top: -150%; z-index: 500; } 

y Javascript

var popup; 
$('.week-content-placeholder') 
    .mouseenter(function() 
     { 
     popup = $('<div class="popup">'+a_lot_of_text+'</div>').insertAfter(this); 
     }) 
    .mouseleave(function() 
     { 
     popup.remove(); 
     }); 

Ese no es el código exacto, pero se entiende la idea. Esto funciona bien, pero como he dicho, dado que .week-content-placeholder está por encima de .week-content, la capacidad de selección con jQuery UI no funciona correctamente en .week-content.

+0

Puede ser útil saber cuál es el html de su calendario * es * para responder esta pregunta. –

+0

Bueno, no es una pregunta muy específica del calendario. Es solo un div que tiene un evento de mouseenter que agrega otro div al lado. Este div tiene un gran ancho y alto, pero ahora oscurece el div debajo de él, bloqueando su evento mouseleave. – Nick

+1

Nick, ¿Por qué no usa CSS "posición" para colocar su cuadro de información en la pantalla de modo que no obstruya completamente la celda del calendario? – Neil

Respuesta

2

Se podría modificar su solución con los divs transparentes "marcador de posición" de la siguiente manera:

tienen el "marcador de posición" buceo por debajo de la "célula calendario", usando {zIndex: -1}.

Cuando ingresa una celda de calendario, muestra el div grande de "contenido" y establece {zIndex: 1000} en el divisor de "marcador de posición" para ponerlo en la parte superior.

Tenga un evento "mouseout" en el marcador de posición div que ocultará el div "content" y establezca {zIndex: -1} para la celda "marcador de posición".

En lugar de crear las celdas de "marcador de posición" en el HTML, puede crear una en el javascript y moverla a la posición de cada celda "calendario" mientras la "mouseIn". También podría duplicar cualquier evento de "clic" en la "celda de calendario" en este también.

Avísame si esto funciona.

+0

¡Gracias, eso funciona genial! Tengo una pregunta sin embargo. A veces, cuando muevo el mouse rápidamente a lo largo del calendario, no se registra el evento mouseout para la div marcador de posición y quedan múltiples cuadros de información en la pantalla. Tengo que volver atrás y pasar el mouse sobre él, y luego volver a mouseout para que desaparezca. Pero respondiste mi pregunta, gracias. – Nick

+0

Tal vez intente poner primero el "marcador de posición" y "fadeIn" el contenido durante un período de 1 segundo para darle un poco más de tiempo para registrar el evento. Prefiero fadeIn de todos modos para cosas como esta; es menos discordante en el ojo. – Neil

+0

Lo siento, me doy cuenta de que mi último comentario fue el opuesto de lo que me pediste. Intente mantener el "marcador de posición" en {zIndex: 1000} y duplicar el evento de "clic" de la celda del calendario. – Neil

1

Aquí hay 15 plugins diferentes que le permiten hacer esto con jQuery:

http://www.webdesignbooth.com/15-jquery-plugins-to-create-an-user-friendly-tooltip/

+0

Gracias. He buscado este tipo de complementos, pero ninguno de ellos se ajusta exactamente a lo que trato de hacer, que es cubrir completamente el elemento sobre el que está el cursor, mientras sigue respondiendo al evento mouseleave para ese artículo. A menos que me lo haya perdido, no creo que uno de esos 15 funcione así (compensan la información sobre herramientas). – Nick

1

usted podría seguir mousemouse y utilizar el ancho offsetLeft + y la altura offsetTop + de su disparador vuelo estacionario contra el evento .pageX y event.pageY para comparar.

+0

¡Esto es más de lo que estoy buscando! ¿Cómo exactamente puedo rastrear el movimiento del mouse? – Nick

0

Si hace que esto funcione como describió un pequeño movimiento del mouse que permanece dentro de la celda del calendario (que ni siquiera es visible) deja la ventana emergente en su lugar, pero un movimiento ligeramente mayor que sale de la celda hace que la ventana desaparezca.

El usuario solo ve el movimiento dentro de la ventana emergente — pequeño movimiento dentro de la ventana emergente lo deja en su lugar; un gran movimiento lo hace desaparecer.

Sugiero activar la desaparición de la ventana emergente al salir de la ventana emergente en sí. Cualquier movimiento que permanezca dentro del panel de "punta" lo deja arriba. Creo que (1) esto es una mejor usabilidad y (2) evita todo el problema con el manejo oculto de evento de celdas de calendario.

Puede hacerlo agregando un controlador .mouseleave() al div cuando lo crea.

+0

Su primer párrafo describe exactamente lo que estoy tratando de hacer, y de hecho lo implementé originalmente exactamente como lo describió.Sin embargo, la "información sobre herramientas" ocupa tanto espacio que cubre casi por completo las celdas de calendario junto a la que está sobrevolando, lo que significa que si un usuario desea ver la información sobre herramientas para la siguiente celda, tiene que ir al borde mismo de ella (y a veces está completamente cubierto). – Nick

2

El truco aquí es hacer que el cuadro de información a un niño de la célula:

<div id='box'> 
    Normal content 
    <div id='inner'> 
     This big box obscures everything in the cell! 
    </div> 
</div> 

La caja interior se oculta hasta que se produzca el vuelo estacionario. Observe cómo con CSS podemos hacer que el cuadro sea más grande que la celda en sí con márgenes negativos.

#box 
{ 
    width:100px; 
    height:100px; 
    margin:100px; 
    border:solid 2px darkblue; 
    position:relative; 
} 
#box #inner 
{ 
    display:none; 
    position:absolute; 
    background-color:#eeee00; 
    top:-10px; 
    left:-10px; 
    width:120px; 
    height:120px; 
} 

Y puede utilizar la libración jQuery normal porque el vuelo estacionario tapas de las cajas de la caja y que es hijo:

$('#box').hover(function(){ 
    $('#inner').show(); 
},function(){ 
    $('#inner').hide(); 
}); 

Aquí está funcionando:

http://jsfiddle.net/RbqCT/

Puede crear la info box dinámicamente como lo hace en su código.

+0

Técnica muy buena, y mantiene la información "interna" asociada semánticamente dentro de la caja a la que se aplica. Sin embargo, cuando probé el violín, no oculté '#inner 'cuando mi mouse dejó los confines del rectángulo' # box' - no se ocultó hasta que desaparecí de '# inner' - lo cual deja el mismo problema que mi sugerencia. –

+0

¡Gracias por todo el trabajo! Pero no es así Encaja bastante con lo que estoy intentando hacer, que es hacer que #inner desaparezca cuando se mueve el mouse fuera de #box. Con su ejemplo, tengo que mover el mouse fuera de #inner para que ocurra la función de desplazamiento (lo que significa que si #inner es 500x500, entonces tengo que mover el mouse muy lejos para que ocurra el desplazamiento). Me gusta la forma semánticamente correcta en que esto se hace, por lo que responde una parte de mi pregunta. – Nick

Cuestiones relacionadas