Tengo este input
elemento:
<input type="text" class="textfield" value="" id="subject" name="subject">
Luego tengo algunos otros elementos, como otras entradas de texto, áreas de texto, etc.
Cuando el usuario hace clic en eso input
con #subject
, la página debe desplazarse al último elemento de la página con una bonita animación. Debe ser un desplazamiento hacia abajo y no hacia arriba.
El último elemento de la página es un submit
botón con #submit
:
<input type="submit" class="submit" id="submit" name="submit" value="Ok, Done.">
La animación no debe ser demasiado rápida y debe ser fluida.
Estoy ejecutando la última versión de jQuery. Prefiero no instalar ningún complemento, sino usar las funciones predeterminadas de jQuery para lograr esto.
javascript
jquery
scroll
DiegoP.
fuente
fuente
scrollTo
fue deshabilitado para mí debido a un complemento de Chrome, no estoy seguro de cuál.Respuestas:
Suponiendo que tiene un botón con la identificación
button
, intente este ejemplo:Obtuve el código del artículo Desplácese suavemente a un elemento sin un complemento jQuery . Y lo he probado en el siguiente ejemplo.
fuente
.scrollTop(…)
lugar de.animate({scrollTop: …}, …)
.jQuery .scrollTo (): Ver - Demo, API, Fuente
Escribí este plugin liviano para hacer que el desplazamiento de página / elemento sea mucho más fácil. Es flexible donde puede pasar un elemento de destino o un valor especificado. Quizás esto podría ser parte del próximo lanzamiento oficial de jQuery, ¿qué te parece?
Ejemplos de uso:
Opciones:
scrollTarget : un elemento, cadena o número que indica la posición de desplazamiento deseada.
offsetTop : un número que define un espacio adicional por encima del objetivo de desplazamiento.
duración : una cadena o número que determina cuánto tiempo durará la animación.
easing : una cadena que indica qué función de aceleración utilizar para la transición.
complete : una función para llamar una vez que se completa la animación.
fuente
Si no está muy interesado en el efecto de desplazamiento suave y solo está interesado en desplazarse a un elemento en particular, no necesita alguna función jQuery para esto. Javascript tiene su caso cubierto:
https://developer.mozilla.org/en-US/docs/Web/API/element.scrollIntoView
Entonces, todo lo que necesitas hacer es:
$("selector").get(0).scrollIntoView();
.get(0)
se usa porque queremos recuperar el elemento DOM de JavaScript y no el elemento DOM de JQuery.fuente
$(selector)[0]
?document.getElementById('#elementID').scrollIntoView()
. No sirve cargar una biblioteca de ~ 100k solo para seleccionar un elemento y luego convertirlo a JavaScript normal.document.getElementById('elementID').scrollIntoView()
Usando este simple script
Haría en orden que si se encuentra una etiqueta hash en la url, el scrollTo se anima a la ID. Si no se encuentra la etiqueta hash, ignore el script.
fuente
$(window.location.hash)
no funcionará para los hashes que no cumplan con la detección de identificación de expresiones regulares de jQuery. Por ejemplo, hashes que contienen números. También es un poco peligroso; el formato de entrada debe validarse para que no termine seleccionando un elemento diferente.fuente
jQuery(document).ready(function($) { $(document).on( "click", 'a[href^="#"]', function( e ) { e.preventDefault(); var target = this.hash, $target = $(target); $('html, body').stop().animate({ scrollTop: $target.offset().top - 100}, 1000); }); });
La solución de Steve y Peter funciona muy bien.
Pero en algunos casos, es posible que deba convertir el valor a un entero. Curiosamente, el valor devuelto de a
$("...").offset().top
veces está enfloat
.Utilizar:
parseInt($("....").offset().top)
Por ejemplo:
fuente
Una versión compacta de la solución "animada".
Uso básico:
$('#your_element').scrollTo();
fuente
Así es como lo hago.
Funciona en cualquier navegador.
Se puede envolver fácilmente en una función
Aquí hay un ejemplo de trabajo
Docs
fuente
Sé una manera sin jQuery:
Editar: Han pasado dos años y todavía obtengo reputación al azar de esta publicación lmao
fuente
Si solo está manejando el desplazamiento a un elemento de entrada, puede usarlo
focus()
. Por ejemplo, si desea desplazarse a la primera entrada visible:O la primera entrada visible en un contenedor con clase
.error
:¡Gracias a Tricia Ball por señalar esto!
fuente
Con esta solución , no necesita ningún complemento y no se requiere configuración además de colocar el script antes de su
</body>
etiqueta de cierre .En carga, si hay un hash en la dirección, nos desplazamos a él.
Y, cada vez que hace clic en un
a
enlace con unhref
hash#top
, por ejemplo , nos desplazamos a él.fuente
> 1
lugar de0
, solo porque/#
hace que este script se rompareturn false;
al final del evento al hacer clic para evitar que suceda la acción predeterminada, desplazarse inmediatamente al ancla.e.preventDefault();
e.preventDefault()
sin embargo, no actualiza el hash en la url al hacer clic, siempre es una url sin hashEn la mayoría de los casos, sería mejor usar un complemento. Seriamente. Voy a promocionar el mío aquí . Por supuesto que también hay otros. Pero compruebe si realmente evitan los escollos para los que desea un complemento en primer lugar, no todos lo hacen.
He escrito sobre las razones para usar un complemento en otro lugar . En pocas palabras, el revestimiento que sustenta la mayoría de las respuestas aquí
Está mal UX.
La animación no responde a las acciones del usuario. Continúa incluso si el usuario hace clic, toca o intenta desplazarse.
Si el punto de partida de la animación está cerca del elemento objetivo, la animación es dolorosamente lenta.
Si el elemento de destino se coloca cerca de la parte inferior de la página, no se puede desplazar a la parte superior de la ventana. La animación de desplazamiento se detiene abruptamente entonces, a mitad de movimiento.
Para manejar estos problemas (y muchos otros ), puede usar un complemento mío, jQuery.scrollable . La llamada se convierte en
y eso es. Por supuesto, hay más opciones .
Con respecto a la posición de destino,
$target.offset().top
hace el trabajo en la mayoría de los casos. Pero tenga en cuenta que el valor devuelto no tiene en cuenta un borde en elhtml
elemento ( consulte esta demostración ). Si necesita que la posición de destino sea precisa bajo cualquier circunstancia, es mejor usarEso funciona incluso si se establece un borde en el
html
elemento.fuente
Animaciones:
fuente
Si desea desplazarse dentro de un contenedor de desbordamiento (en lugar de
$('html, body')
responder arriba), trabajando también con posicionamiento absoluto, esta es la manera de hacerlo:fuente
Manera fácil de lograr el desplazamiento de la página al ID div de destino
fuente
Este es mi enfoque para abstraer los ID y href, usando un selector de clase genérico
fuente
Complemento jQuery personalizado muy simple y fácil de usar. Simplemente agregue el atributo
scroll=
a su elemento en el que se puede hacer clic y establezca su valor en el selector al que desea desplazarse.De este modo:
<a scroll="#product">Click me</a>
. Se puede usar en cualquier elemento.fuente
fuente
$('html, body').animate(...)
No es para mí en iPhone, Android Chrome Safari Safari.Tuve que apuntar al elemento de contenido raíz de la página.
Esto es lo que terminé con
Todo el contenido del cuerpo conectado con un #content div
fuente
Esta es la respuesta de Atharva de: https://developer.mozilla.org/en-US/docs/Web/API/element.scrollIntoView . Solo quería agregar si su documento está en un marco flotante, puede elegir un elemento en el marco principal para desplazarse a la vista:
fuente
fuente
Primero se desplazará hacia abajo para
#submit
luego restaurar el cursor a la entrada en la que se hizo clic, que imita un desplazamiento hacia abajo y funciona en la mayoría de los navegadores. Tampoco requiere jQuery, ya que puede escribirse en JavaScript puro.¿Puede esta moda de usar la
focus
función imitar la animación de una mejor manera, mediante el encadenamiento defocus
llamadas? No he probado esta teoría, pero se vería así:fuente
Configuré un módulo scroll-element
npm install scroll-element
. Funciona así:Escrito con ayuda de las siguientes publicaciones SO:
offset-top-of-an-element-without-jquery
scrolltop-animation-without-jquery
Aquí está el código:
fuente
Para mostrar el elemento completo (si es posible con el tamaño de ventana actual):
fuente
Escribí una función de propósito general que se desplaza a un objeto jQuery, un selector CSS o un valor numérico.
Ejemplo de uso:
El código de la función:
fuente
Por lo que vale, así es como logré lograr ese comportamiento para un elemento general que puede estar dentro de un DIV con desplazamiento. En nuestro caso, no desplazamos el cuerpo completo, sino solo elementos particulares con desbordamiento: auto; dentro de un diseño más grande.
Crea una entrada falsa de la altura del elemento de destino, y luego lo enfoca, y el navegador se encargará del resto sin importar cuán profundo dentro de la jerarquía de desplazamiento se encuentre. Funciona de maravilla.
fuente
Esto funcionó para mí:
fuente
fuente
UN TRAZADOR DE LÍNEAS
Mostrar fragmento de código
fuente
Respuesta actualizada a partir de 2019:
fuente