2011-07-05 23 views
6

Mi problema es que la barra de desplazamiento vertical de ventanas del navegador que se elimina, por ejemplo, overflow:hidden; hará que la página salte, cuando vuelva a aparecer más tarde. Puedo usar jQuery para eliminar la opción de desplazamiento por parte del visitante, mientras que un script se está ejecutando y desplazar la página hacia un punto específico, y luego hacer que vuelva a aparecer de nuevo después:Cómo hacer un marcador de posición de barra de desplazamiento

www.nebulafilm.dk/index.html?content

¿Puedo hacer un marcador de posición para la barra de desplazamiento, cuando no está presente, por lo que no va a saltar volver?

¿O es posible "desactivarlo" y tenerlo "atenuado"?

No encuentro ninguna solución buscando. He encontrado algo similar aquí: stackoverflow.com donde la barra de desplazamiento siempre está allí. Pero la diferencia es que la barra de desplazamiento debe permanecer desactivada, incluso si la página es más larga que la ventana. Solo debe ser "activado" nuevamente a través de otro script que controlo.

¿Es esto de alguna manera posible?

Gracias.


Actualización:

Tiempo para una actualización de estado.

Tuve algunos problemas con la imagen de fondo de la nube de estrellas, que se configuró en la etiqueta body.
Cuando el script jQuery (de la respuesta de los locos) agrega el relleno a la etiqueta html y, por lo tanto, debe insertar todos los elementos en la página de la izquierda, la imagen de fondo todavía no se comportó correctamente.

Bueno, descubrí que el elemento body no reacciona como cualquier elemento div. No es solo un "bloque" dentro de la etiqueta html como cualquier otro elemento de bloque. Tiene sus propios comportamientos y aparentemente no puede ser engañado de la misma manera. Por lo tanto, la imagen de fondo era imposible de tocar, mientras estaba en body.
Pero me tomó un tiempo para darse cuenta ...

La solución final a esto es así volteando estúpidamente simple que yo estaba a punto de llorar al enterarse, pensando en las interminables (que podría exagerar un poco) horas de investigando el body.
Simplemente envolví todo en un <div id="body"> y le di la imagen de fondo en su lugar. De repente, todo cayó en su lugar.

Desde:

<body> 
... 
</body> 

Y

body {background-image: url(...);} 

Para:

<body> 
<div id="body"> 
... 
</div> 
</body> 

Y:

#body {background-image: url(...);} 

Un d un poco más sabio sobre el body.

No más "saltos". Delicioso.

El efecto ahora se está ejecutando por completo y casi no nota un cambio con la barra de desplazamiento y cada detalle se ajusta. El guión de Cwolve es perfecto y hace el cálculo exacto:

function getScrollBarWidth(){ 
    var div = $('<div><div>' + new Array(100).join('content<br />') + '</div></div>'), 
     div2 = div.find('div'), 
     body = $(document.body); 

    div.css({ overflow : 'hidden', width: 100, height: 100, position : 'absolute', left : -1000, top : -1000 }); 
    body.append(div); 

    var width1 = div2.width(); 
    div.css({ overflow : 'auto' }); 
    var width2 = div2.width(); 

    div.remove(); 

    return width1 - width2; 
} 

El getScrollBarWidth() contendrá exactamente el ancho de la barra de desplazamiento sin importar el navegador, y lo puedo usar para agregar y quitar rellenos como yo quiero:

var sWidth = getScrollBarWidth(); 

    $("body").css({'overflow': 'hidden'}); 
    $("html").css({'padding-right': sWidth}); 

    $('html, body').delay(1000).animate({ 

     scrollTop: $(hash).offset().top - 170 

    }, 2000, 'swing', function(){ 

     $("body").css({'overflow': 'auto'}); 
     $("html").css({'padding-right': 0}); 

    }); 

Muchas gracias. Esta fue una buena idea.

Respuesta

5

¿Qué tal esto:

  • determinar el ancho de la barra de desplazamiento en el navegador actual
  • Establecer un div contenido a padding-right: scrollbar-width
  • Ocultar desplazamiento en el elemento principal

y después de la animación :

  • Quitar padding-right en el contenido
  • espectáculo de desplazamiento a los padres

hice una demostración: http://jsfiddle.net/cwolves/ezLfU/1/

+0

Sí, esa es una solución, si no es posible la manipulación directa de la barra de desplazamiento. Pero dependerá del navegador y es un trabajo laborioso. – Steeven

+0

¿Cómo es laborioso? Le di una demostración que calcula el ancho de la barra de desplazamiento :) La implementación real requiere que agregue la función que hice y un enorme 3 líneas de código, que también están en la demostración (simplemente cambie los selectores). –

+0

Bueno, tendrá que encontrar el ancho exacto de la barra de desplazamiento para cada tipo de navegador e implementar algún tipo de comprobación del navegador. Y aún así no será una solución segura. Pero es una parte del camino, y una posible solución, así que gracias por la respuesta. – Steeven

-1

Mostrar una barra de desplazamiento deshabilitada es tan simple como desbordamiento de configuración: desplazamiento;

vertical sólo sería overflow-y:scroll

+0

No, no, esto no dará una barra de desplazamiento deshabilitada cuando la página es más larga que la pantalla. Luego comienza a "funcionar" y estoy tratando de prevenirlo. Tiene que ser desactivado o eliminado y reemplazado con un marcador de posición. – Steeven

+0

Ah no, no creo que sea posible con javascript, necesitarás un complemento de navegador para manipular los elementos del navegador. Pensé que solo querías que tu página no "saltara" cuando la barra de desplazamiento estaba presente. Una cosa que puede hacer es diseñar su barra de desplazamiento para que coincida con su página, pero desafortunadamente solo funciona en IE (Ejemplo: http://www.steve-terada.com) – AlienWebguy

1

Yo miraba a su sitio y el pensamiento de un enfoque alternativo. Si está ocultando la barra de desplazamiento con desbordamiento: oculto, también puede volver a implementar el desplazamiento.

Adjuntar eventos a la página arriba/abajo/Inicio/Fin/flecha arriba/flecha abajo, la rueda del ratón hacia arriba/rueda del ratón hacia abajo, y luego hacer

$(window).scrollTop($(window).scrollTop() + 15) 

El código anterior es obviamente malo y sólo una ejemplo, pero posiblemente algo que le guste probar.

+0

Bien, esta es una solución que funcionará en todos los navegadores. Aunque es bastante intrincado en lugar de simplemente encanecer la barra de desplazamiento. Pero eso parece no ser posible de todos modos. – Steeven

+1

Derecha. Por lo general, el navegador no te permitirá jugar demasiado con la barra de desplazamiento. Está buscando hacer algo intrincado con su sitio, por lo que probablemente obtendrá una solución más intrincada que elegante. – Jordan

1

¿Qué tal hacer que su contenido de unos pocos píxeles menos ancha que el contenedor y alternar el atributo overflow-y ?

Las barras de desplazamiento pueden tener diferentes anchuras en diferentes navegadores/sistemas operativos. Si no va a calcular el ancho de la barra de desplazamiento, lo mejor es que se amplíe lo suficiente para que funcione en todos los navegadores.

Example

+1

Eso requiere saber exactamente qué tan ancho es el contenedor y observar el evento 'resize' de la ventana y actualizar el cambio. Además, su diferencia '20px' no es segura ya que las barras de desplazamiento pueden ser más anchas que eso. –

+0

Bueno, esto es interesante! Pero ¿no tendré un problema cuando trate de establecer un ancho de 20 px menos que la ventana? En el sitio, no estoy estableciendo ningún ancho específico para los cuadros de elemento de página, sino solo anchos variables para alinearlos en el centro. Entonces todavía saltan, como yo lo veo? – Steeven

+0

@cwolves cierto, depende de la complejidad que esté dispuesto a poner en su página. Siempre es una compensación. Pensé que su solución estaba sobrediseñada, así que puse una alternativa con una pequeña compensación en la funcionalidad pero una ganancia en el rendimiento. – Jan

Cuestiones relacionadas