2012-09-03 32 views
18

Estoy usando el cuadro de diálogo de Jquery para abrir una ventana de cuadro emergente en la parte superior de la página. Cuando abro el cuadro de diálogo, quiero que se deshabilite el desplazamiento general de la página. para hacerlo, estoy haciendo:js/css: desactivar la barra de desplazamiento, pero mantener la posición de desplazamiento

$('body').css({overflow:'hidden'}); 

cuando se abre el cuadro de diálogo, y:

$('body').css({overflow:'auto'}); 

cuando se cierra el diálogo.

Esto funciona, pero cuando se quita la barra de desplazamiento, el contenido en la parte posterior se mueve hacia la derecha y el resultado no es bueno.

me trataron otro método, mediante la creación de una clase css "noscroll", tales como:

body.noscroll 
{ 
    position: fixed; 
    overflow-y: scroll; 
    width: 100%; 
} 

entonces, en lugar de la anterior código JS, estoy añadiendo y quitando esta clase para el cuerpo de diálogo abierto cerrado.

Ahora esto funciona para la barra de desplazamiento y el contenido en la parte posterior no se mueve hacia la derecha, pero con este método el contenido en la parte posterior vuelve a la parte superior.

Así que, básicamente, el método 1 hace que el contenido se mueva hacia la derecha, y method2 hace que el contenido vuelva a la parte superior.

¿Alguien sabe una solución para esto? no hay desplazamiento para el contenido en la parte posterior cuando se abre el cuadro de diálogo, y no hay movimiento al deshabilitar el desplazamiento ...?

+1

¿Ha considerado implementar una superposición div 100% posicionada de forma absoluta detrás del diálogo para bloquear todas las interacciones con la página? – dSquared

+0

¡Bien pensado, lo intentaré y publicaré mis resultados! – Piero

+0

¿Encontró la solución para esta pregunta? ¿me pueden ayudar? gracias! lo siento, hablo inglés no bien. –

Respuesta

11

He hecho un ejemplo bastante simple de mi solución.

http://jsfiddle.net/6eyJm/1/

Su emergente debe estar en una caja

<div id="shadow"> 
<div id="popup"> 
    <a id='close' href="#">Close</a> 
</div> 

a continuación, poner los CSS en la raíz de div

#shadow{ 
    display: none; 
    position: fixed; 
    top:0; 
    bottom: 0; 
    width: 100%; 
    height:100%; 
    background-color: rgba(0,0,0,0.6); 
} 

La posición fija es muy importante ya que no quiere ver el borde blanco, tomará el ancho completo de la ventana y no el cuerpo.

Luego está el pequeño truco JS

$('#open').click(function(e){ 
    e.preventDefault() 
    $('body').width($('body').width()); 
    $('body').css('overflow', 'hidden'); 
    $('#shadow').css('display', 'block'); 
}) 
$('#close').click(function(e){ 
    e.preventDefault() 
    $('body, #shadow').removeAttr('style') 
}) 

El objetivo aquí es tomar la anchura del cuerpo antes de quitar la barra de desplazamiento. Tu contenido no se moverá

Espero que ayude!

Lo siento por mi inglés, no por mi idioma nativo.

+0

¡gracias! pero cuando está cerca, el desplazamiento está oculto. –

+0

Hice un pequeño error tipográfico, no debería ser $ ('body #shadow'). RemoveAttr pero $ ('body, #shadow'). RemoveAttr (falta coma). –

+0

cuando pongo el botón de abrir en el medio de la lista, luego hago clic, el desplazamiento de página está desactivado pero vuelve a la parte superior. –

9

Recordar el desplazamiento debe mantener a raya a su ventana emergente;

JSfiddle

HTML

<div id="popupholder"> 
    <button id="close">Close me</button> 
</div> 


asd <br />asd <br />asd <br />asd <br />asd <br /> 
<button class="open">Popup</button> 
<br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd<br /> 
<button class="open">Popup</button> 
<br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br /> 
<button class="open">Popup</button> 
<br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd<br /> 
<button class="open">Popup</button> 
<br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br /> 

CSS

html, body { 
    margin: 0px; 
} 

#popupholder { 
    width: 100%; 
    height: 100%; 
    position: absolute; 
    display: box; 
    display: -webkit-box; 
    display: -moz-box; 
    background-color: rgba(0,0,0,0.75); 
    display: none; 
} 

#close { 
    display: block; 
    height: 20px; 
    margin: 75px auto 0px auto; 
} 

JavaScript

$(document).ready(function() { 
    $('.open').click(function() { 
     // Block scrolling 
     $('body').css('overflow', 'hidden'); 

     // Show popup 
     var offset = window.pageYOffset; 
     //console.log(offset); 
     $('#popupholder').css({ 
      'display': 'block', 
      'top': offset + 'px' 
     }); 
    }); 

    $('#close').click(function() { 
     // Enable scrolling 
     $('body').css('overflow', 'auto'); 

     // Hide popup 
     $('#popupholder').css('display', 'none'); 
    }); 
}); 

Por razones de seguridad, podría agregar un muy alto z-index a su #popupholder, pero eso no es realmente relevante para la pregunta.

+0

Gracias por tomarse el tiempo para escribir el código, pero quiero desactivar la barra de desplazamiento, no ocultarlo como Facebook emergente. –

+0

Puede agregar 'overflow: hidden;' al '# popupholder' también. De lo contrario, puede buscar variantes similares de ':: - webkit-scrollbar {display: none; } 'estilo. Accederá a * Shadow DOM * y ocultará la barra de desplazamiento por completo. –

+0

todavía no funciona. –

1

se puede calcular la diferencia entre el ancho del cuerpo, antes y después del desbordamiento oculta, y aplicarlo como padding-derecha al cuerpo

var bodyStartW = $("body").width(); 
$("body").css("overflow-y" , "hidden"); 
var bodyEndW = $("body").width(); 
var bodyMarginL = bodyEndW - bodyStartW; 
$("body").css("padding-right" , bodyMarginL); 

En Safari que tenían el mismo truco para el "html" etiqueta, y margen-derecha en lugar de relleno-derecha

Cuestiones relacionadas