2010-06-10 12 views
8

Tengo un script que inserta elementos "emergentes" en el DOM. Establece sus propiedades top y left css en relación con las coordenadas del mouse en un evento de clic. Funciona muy bien, excepto que la altura de estos elementos "emergentes" es variable y algunos de ellos se extienden más allá del área visible de la ventana del navegador. Me gustaría evitar esto.¿Cómo forzar a los elementos posicionados a permanecer dentro del área visible del navegador?

alt text

Esto es lo que tengo hasta ahora

<script type="text/javascript"> 
    $(function() { 
     $("area").click(function (e) { 
      e.preventDefault(); 

      var offset = $(this).offset(); 
      var relativeX = e.pageX - offset.left; 
      var relativeY = e.pageY - offset.top; 

      // 'responseText' is the "popup" HTML fragment 
      $.get($(this).attr("href"), function (responseText) { 
       $(responseText).css({ 
        top: relativeY, 
        left: relativeX 
       }).appendTo("#territories"); 

       // Need to be able to determine 
       // viewable area width and height 
       // so that I can check if the "popup" 
       // extends beyond. 

       $(".popup .close").click(function() { 
        $(this).closest(".popup").remove(); 
       }); 
      }); 
     }); 
    }); 
</script> 
+1

Me encanta la foto - ¿cómo te gustaría arreglarlo? Hazlo más corto? Hazlo simplemente usarlo como un borde? Voltear la otra dirección? –

+0

Básicamente solo quiero 'intentar' forzar que todos los bordes de los elementos emergentes estén dentro del área visible. Por ejemplo. Si el borde inferior de una de las ventanas emergentes se extendía más allá del área visible en 50px, me gustaría moverlo -50px hacia la parte superior. – jessegavin

Respuesta

1

me di cuenta de una solución. Agregué el siguiente código en el lugar de mi comentario de 4 líneas en la pregunta original.

var diffY = (popup.offset().top + popup.outerHeight(true)) - $(window).height(); 
if (diffY > 0) { 
    popup.css({ top: relativeY - diffY }); 
} 

var diffX = (popup.offset().left + popup.outerWidth(true)) - $(window).width(); 
if (diffX > 0) { 
    popup.css({ left: relativeX - diffX }); 
} 

@liquidleaf me señaló en la dirección correcta, por lo que 1 y gracias por eso.

7

Usted compararía la ventana de anchura/altura a la de la ventana scrollTop, scrollLeft, etc.

Aquí están algunos métodos para que usted pueda échele un vistazo a:

$(window).width() 
$(window).height() 
$(window).scrollTop() 
$(window).scrollLeft() 
$(window).scrollWidth() 
$(window).scrollHeight() 

Eche un vistazo a la documentación jQuery sobre estos métodos. Dependiendo exactamente del comportamiento que desee, deberá comparar el ancho y la posición de su ventana emergente con el área actualmente visible de la ventana, determinada con las dimensiones de desplazamiento.

http://api.jquery.com/scrollTop/ .. etc

+1

El uso de los métodos de jQuery es probablemente más conveniente que el uso de atributos regulares de Javascript (como pageX, etc.), ya que estos valores varían según el soporte del navegador. – liquidleaf

+0

No hay métodos scrollWidth() o scrollHeight() en jQuery. Por lo tanto, esto no terminó siendo tan útil. Respuesta aceptada eliminada – jessegavin

Cuestiones relacionadas