Esta función funciona bien. Desplaza el cuerpo al desplazamiento del contenedor deseado
function scrolear(destino){
var stop = $(destino).offset().top;
var delay = 1000;
$('body').animate({scrollTop: stop}, delay);
return false;
}
Pero no en Firefox. ¿Por qué?
-EDITAR-
Para manejar el desencadenante doble en la respuesta aceptada, sugiero detener el elemento antes de la animación:
$('body,html').stop(true,true).animate({scrollTop: stop}, delay);
Respuestas:
Firefox coloca el desbordamiento en el
html
nivel, a menos que esté específicamente diseñado para comportarse de manera diferente.Para que funcione en Firefox, use
Ejemplo de trabajo
La solución CSS sería establecer los siguientes estilos:
Supongo que la solución JS sería menos invasiva.
Actualizar
Gran parte de la discusión a continuación se centra en el hecho de que la animación
scrollTop
de dos elementos provocaría que la devolución de llamada se invoque dos veces. Las características de detección del navegador han sido sugeridas y posteriormente desaprobadas, y algunas son posiblemente exageradas.Si la devolución de llamada es idempotente y no requiere mucha potencia informática, dispararla dos veces puede ser un completo problema. Si las invocaciones múltiples de la devolución de llamada son realmente un problema, y si desea evitar la detección de características, podría ser más sencillo exigir que la devolución de llamada solo se ejecute una vez desde dentro de la devolución de llamada:
fuente
$(jQuery.browser.webkit ? "body": "html").animate(...);
$(jQuery.browser.mozilla ? "html" : "body").animate(...);
. Sería genial no utilizar el rastreo de exploración, sino la detección de funciones. Sin embargojQuery.browser
está en desuso y falta en la última versión de jQuerywindow.scroll
no anima. Por supuesto, podrías rodar lo tuyo con intervalos yscrollBy
. Si desea agregar más facilidades a eso, de repente tiene que escribir mucho código para un aspecto bastante menor de su producto.La detección de características y la animación en un solo objeto compatible sería bueno, pero no hay una solución de una línea. Mientras tanto, aquí hay una manera de usar una promesa de hacer una única devolución de llamada por ejecución.
ACTUALIZACIÓN: así es como podría usar la detección de funciones en su lugar. Este fragmento de código debe evaluarse antes de su llamada de animación:
Ahora use la var que acabamos de definir como el selector para la animación de desplazamiento de página, y use la sintaxis regular:
fuente
html
y otras veces regresarbody
. Aquí está mi código después de declarar la función.var scrollTopElement; setTimeout( function() { scrollTopElement = getScrollTopElement(); console.log(scrollTopElement); }, 1000);
Gracias por esto, ha resuelto mi problema.html
lugar debody
como se supone. Esto es solo si te desplazas por la página web y vuelves a cargar, de lo contrario funciona.Pasé años tratando de averiguar por qué mi código no funcionaría.
El problema estaba en mi css -
Lo configuré en su
auto
lugar (y me quedé preocupándome por qué se configuró100%
en primer lugar). Eso me lo arregló.fuente
Es posible que desee evitar el problema utilizando un complemento, más específicamente, mi complemento :)
En serio, a pesar de que el problema básico se ha abordado desde hace mucho tiempo (diferentes navegadores usan diferentes elementos para el desplazamiento de la ventana), hay bastantes problemas no triviales en la línea que pueden hacer que te tropieces:
body
yhtml
tiene sus problemas ,Obviamente soy parcial, pero jQuery.scrollable es en realidad una buena opción para abordar estos problemas. (De hecho, no conozco ningún otro complemento que los maneje a todos).
Además, puede calcular la posición de destino, a la que se desplaza, de forma a prueba de balas con la
getScrollTargetPosition()
función en esta esencia .Todo lo cual te dejaría con
fuente
Cuidado con esto. Tuve el mismo problema, ni Firefox ni Explorer se desplazaban con
Así que usé como dijo David
Estuvo genial, pero nuevo problema, ya que hay dos elementos, cuerpo y html, la función se ejecuta dos veces, es decir, do X se ejecuta dos veces.
intentado solo con 'html', y Firefox y Explorer funcionan, pero ahora Chrome no lo admite.
Tan necesario cuerpo para Chrome, y html para Firefox y Explorer. ¿Es un error jQuery? no lo se
Solo tenga cuidado con su función, ya que se ejecutará dos veces.
fuente
Recomendaría no confiar
body
nihtml
como una solución más portátil. Simplemente agregue un div en el cuerpo que tenga como objetivo contener los elementos desplazados y darle un estilo que permita el desplazamiento a tamaño completo:(suponiendo que
display:block;
ytop:0;left:0;
son valores predeterminados que se adapte a su objetivo), a continuación, utilizar$('#my-scroll')
para sus animaciones.fuente
Este es el verdadero negocio. Funciona en Chrome y Firefox sin problemas. Incluso es triste que algunos ignorantes me rechacen. Este código literalmente funciona perfectamente como está en todos los navegadores. Solo necesita agregar un enlace y poner la identificación del elemento que desea desplazar en href y funciona sin especificar nada. Código puro reutilizable y confiable.
fuente
Encontré el mismo problema recientemente y lo resolví haciendo esto:
Y youpi !!! Funciona en todos los navegadores.
en caso de que el posicionamiento no sea correcto, puede restar un valor del offset () .top haciendo esto
fuente
Para mí, el problema era que Firefox saltó automáticamente al ancla con el atributo de nombre igual que el nombre hash que puse en la URL. Aunque puse .preventDefault () para evitar eso. Entonces, después de cambiar los atributos del nombre, Firefox no saltó automáticamente a los anclajes, sino que realizó la animación correctamente.
@Toni Lo siento si esto no fue comprensible. La cosa es que cambié los hashes en la URL como www.someurl.com/#hashname. Luego tuve, por ejemplo, un ancla como
<a name="hashname" ...></a>
a la que jQuery debería desplazarse automáticamente. Pero no lo hizo porque saltó directamente al ancla con el atributo de nombre correspondiente en Firefox sin ninguna animación de desplazamiento. Una vez que cambié el atributo de nombre a algo diferente del nombre hash, por ejemploname="hashname-anchor"
, el desplazamiento funcionó.fuente
Para mí, fue evitar agregar la ID en el punto de animación:
Evitar
Preparando la identificación de antemano y haciendo esto en su lugar:
Solucionado en FF. (Las adiciones de CSS no hicieron una diferencia para mí)
fuente
Espero que esto funcione.
fuente