Tengo un par de hipervínculos en mi página. Preguntas frecuentes que los usuarios leerán cuando visiten mi sección de ayuda.
Utilizando enlaces de anclaje, puedo hacer que la página se desplace hacia el ancla y guiar a los usuarios allí.
¿Hay alguna manera de hacer que ese desplazamiento sea suave?
Pero tenga en cuenta que está usando una biblioteca JavaScript personalizada. ¿Quizás jQuery ofrece algo como esto horneado?
Respuestas:
Actualización de abril de 2018: ahora hay una forma nativa de hacer esto :
Actualmente, esto solo se admite en los navegadores más avanzados.
Para soporte de navegador más antiguo, puede usar esta técnica jQuery:
Y aquí está el violín: http://jsfiddle.net/9SDLw/
Si su elemento de destino no tiene una ID, y se está vinculando a él por él
name
, use esto:Para aumentar el rendimiento, debe almacenar en caché ese
$('html, body')
selector, para que no se ejecute cada vez que se hace clic en un ancla:Si desea que se actualice la URL, hágalo dentro de la
animate
devolución de llamada:fuente
scrollTop: $(this.hash).offset().top
lugar descrollTop: $(this.href).offset().top
?scrollTop: $(href).offset().top - 72
html, body
objeto aquí es innecesario, ejecutar un selector una vez por clic no es realmente mucho.La sintaxis correcta es:
Simplificando : SECO
Explicación de
href*=\\#
:*
significa que coincide con lo que contiene#
char. Por lo tanto, solo coinciden con las anclas . Para más información sobre el significado de esto, vea aquí\\
es porque#
es un selector especial de caracteres en CSS, así que tenemos que escapar de él.fuente
$('a')
a$('a[href*=#]')
para servir solo URL de anclaje<a href="javascript:$('#test').css('background-color', '#000')">Test</a>
. Debería usar$('a[href^=#]')
para hacer coincidir todas las URL que comienzan con un carácter hash.a[href^=\\#]
La nueva actualidad en CSS3. Esto es mucho más fácil que todos los métodos enumerados en esta página y no requiere Javascript. Simplemente ingrese el siguiente código en su CSS y de repente los enlaces apuntan a ubicaciones dentro de su propia página que tendrán una animación de desplazamiento suave.
Después de eso, cualquier enlace que apunte hacia un div se deslizará suavemente hacia esas secciones.
Editar: Para aquellos confundidos acerca de lo anterior, una etiqueta. Básicamente es un enlace en el que se puede hacer clic. Luego puede tener otra etiqueta div en algún lugar de su página web como
A este respecto, se podrá hacer clic en el enlace e irá a la sección # que sea, en este caso es nuestra sección div a la que llamamos.
Por cierto, pasé horas tratando de hacer que esto funcione. Encontré la solución en alguna sección de comentarios oscuros. Tenía errores y no funcionaría en algunas etiquetas. No funcionó en el cuerpo. Finalmente funcionó cuando lo puse en html {} en el archivo CSS.
fuente
esto funcionó perfecto para mí
fuente
Me sorprende que nadie haya publicado una solución nativa que también se encargue de actualizar el hash de ubicación del navegador para que coincida. Aquí está:
Ver tutorial: http://www.javascriptkit.com/javatutors/scrolling-html-bookmark-javascript.shtml
Para los sitios con encabezados fijos,
scroll-padding-top
se puede usar CSS para proporcionar un desplazamiento.fuente
Solo CSS
Todo lo que necesitas es agregar solo esto. Ahora su comportamiento de desplazamiento de enlaces internos será suave como un flujo de flujo.
Nota : Todos los navegadores más recientes (
Opera
,Chrome
,Firefox
etc.) compatible con esta función.para una comprensión detallada, lea este artículo
fuente
Te sugiero que hagas este código genérico:
Puedes ver un muy buen artículo aquí: jquery-effet-smooth-scroll-defilement-fluide
fuente
Oficial: http://css-tricks.com/snippets/jquery/smooth-scrolling/
fuente
Aquí ya hay muchas buenas respuestas, sin embargo, a todas les falta el hecho de que las anclas vacías deben ser excluidas . De lo contrario, esos scripts generan errores de JavaScript tan pronto como se hace clic en un ancla vacía.
En mi opinión, la respuesta correcta es la siguiente:
fuente
Usando JQuery:
fuente
Hay soporte nativo para el desplazamiento suave en los desplazamientos de identificación hash.
Puede echar un vistazo: https://www.w3schools.com/howto/howto_css_smooth_scroll.asp#section2
fuente
La respuesta dada funciona pero deshabilita los enlaces salientes. Debajo de una versión con una bonificación adicional de salida (swing) y respeta los enlaces salientes.
fuente
stop()
Sin embargo, 1 para la migaja de url no funciona como se esperaba: el botón Atrás no regresa, esto es porque cuando la miga se establece en la url después de que se completa la animación. Es mejor sin una miga en la url, por ejemplo, así es como funciona airbnb.HTML
o con URL completa absoluta
jQuery
fuente
Los navegadores modernos son un poco más rápidos en estos días. Un setInterval podría funcionar. Esta función funciona bien en Chrome y Firefox en estos días. (Un poco lento en safari, no se molestó con IE)
fuente
Hay una manera css de hacerlo usando el comportamiento de desplazamiento. Agregue la siguiente propiedad.
Y eso es todo. No se requiere JS.
PD: compruebe la compatibilidad del navegador.
fuente
Agregando esto:
está de alguna manera anulando el desplazamiento vertical
en Firefox e IE, pero no en Chrome. Básicamente, la página se desplaza suavemente hasta el punto en el que debería detenerse según el desplazamiento, pero luego salta hacia donde iría la página sin el desplazamiento.
Agrega el hash al final de la url, pero presionar hacia atrás no lo lleva de regreso a la parte superior, solo elimina el hash de la url y deja la ventana de visualización donde se encuentra.
Aquí está el js completo que estoy usando:
fuente
Esta solución también funcionará para las siguientes URL, sin romper los enlaces de anclaje a diferentes páginas.
etc.
Todavía no he probado esto en todos los navegadores.
fuente
Esto facilitará que jQuery pueda discernir su hash objetivo y saber cuándo y dónde detenerse.
fuente
fuente
Código probado y verificado
fuente
Hice esto para los anclajes href "/ xxxxx # asdf" y "#asdf"
fuente
Aquí está la solución que implementé para múltiples enlaces y anclajes, para un desplazamiento suave:
http://www.adriantomic.se/development/jquery-localscroll-tutorial/ si tiene sus enlaces de navegación configurados en un div de navegación y declarados con esta estructura:
y sus destinos de etiqueta de anclaje correspondientes de la siguiente manera:
Luego simplemente cargue esto en el encabezado del documento:
Gracias a @Adriantomic
fuente
Si tiene un botón simple en la página para desplazarse hacia abajo hasta un div y desea que el botón Atrás salte al inicio , simplemente agregue este código:
Esto podría extenderse para saltar también a diferentes divs, leyendo el valor hash y desplazándose como responde Joseph Silbers.
fuente
Nunca olvide que la función offset () está dando la posición de su elemento para documentar. Entonces, cuando necesite desplazar su elemento en relación con su elemento primario, debe usar esto;
El punto clave es obtener scrollTop de scroll-div y agregarlo a scrollTop. Si no lo haces, la función position () siempre te da diferentes valores de posición.
fuente
Se puede utilizar
window.scroll()
conbehavior: smooth
ytop
fijado a la parte superior de desplazamiento de la etiqueta de anclaje que asegura que la etiqueta de anclaje estará en la parte superior de la ventana.Manifestación:
Mostrar fragmento de código
Simplemente puede establecer la propiedad CSS
scroll-behavior
ensmooth
(que es compatible con la mayoría de los navegadores modernos) que evita la necesidad de Javascript.Mostrar fragmento de código
fuente
Gracias por compartir, Joseph Silber. Aquí su solución 2018 como ES6 con un cambio menor para mantener el comportamiento estándar (desplazarse hacia arriba):
fuente
Requiere jquery y anima a anclar la etiqueta con el nombre especificado en lugar de id, mientras agrega el hash a la URL del navegador. También corrige un error en la mayoría de las respuestas con jquery donde el signo # no tiene como prefijo una barra invertida de escape. El botón de retroceso, desafortunadamente, no regresa correctamente a los enlaces hash anteriores ...
fuente