Tengo una página donde una barra de desplazamiento que contiene filas de tabla con divs en ellas se genera dinámicamente desde la base de datos. Cada fila de la tabla actúa como un enlace, algo así como lo vería en una lista de reproducción de YouTube junto al reproductor de video.
Cuando un usuario visita la página, se supone que la opción en la que se encuentra debe ir a la parte superior del div de desplazamiento. Esta funcionalidad está funcionando. El problema es que va demasiado lejos. Como si la opción en la que están es de aproximadamente 10 píxeles demasiado alta. Entonces, se visita la página, la URL se usa para identificar qué opción se seleccionó y luego se desplaza esa opción a la parte superior del div de desplazamiento. Nota: Esta no es la barra de desplazamiento de la ventana, es un div con una barra de desplazamiento.
Estoy usando este código para que mueva la opción seleccionada a la parte superior del div:
var pathArray = window.location.pathname.split( '/' );
var el = document.getElementById(pathArray[5]);
el.scrollIntoView(true);
Lo mueve a la parte superior del div pero unos 10 píxeles demasiado hacia arriba. ¿Alguien sabe cómo solucionarlo?
fuente
scrollIntoView
es preocupante.Respuestas:
Si es de aproximadamente 10px, entonces supongo que simplemente podría ajustar manualmente el
div
desplazamiento de desplazamiento del contenedor de esa manera:fuente
scrollIntoView
?scrollIntoView
función DOM simple no genera animación. ¿Estás hablando del complemento jQuery scrollIntoView?el.scrollIntoView({ behavior: 'smooth' });
. ¡Sin embargo, el soporte no es excelente!Desplácese suavemente a una posición adecuada
Obtenga las
y
coordenadas y el uso correctoswindow.scrollTo({top: y, behavior: 'smooth'})
fuente
jQuery('#el').offset().top
y luego usarwindow.scrollTo
scroll={el => { const yCoordinate = el.getBoundingClientRect().top + window.pageYOffset; const yOffset = -80; window.scrollTo({ top: yCoordinate + yOffset, behavior: 'smooth' }); }}
donde el desplazamiento es de 10 a 15 píxeles más que el tamaño de su encabezado solo para un mejor espaciadoPuedes hacerlo en dos pasos:
fuente
scrollIntoView()
no ha terminado de desplazarse antes descrollBy()
ejecutarse, el último desplazamiento cancelará el primero. Al menos en Chrome 71.scrollIntoView({adjustment:y})
, creo que debería ser posible con un código personalizado al finalPosicionar el ancla por método absoluto
Otra forma de hacer esto es ubicar sus anclajes exactamente donde desea en la página en lugar de depender del desplazamiento por desplazamiento. Creo que permite un mejor control para cada elemento (por ejemplo, si desea un desplazamiento diferente para ciertos elementos), y también puede ser más resistente a los cambios / diferencias de la API del navegador.
Ahora el desplazamiento se especifica como -100px en relación con el elemento. Cree una función para crear este ancla para la reutilización de código, o si está utilizando un marco JS moderno como React, haga esto creando un componente que represente su ancla, y pase el nombre del ancla y la alineación para cada elemento, que puede o puede no ser el mismo.
Entonces solo usa:
Para un desplazamiento suave con un desplazamiento de 100 px.
fuente
Resolví este problema usando,
Esto hace que el elemento aparezca en el
center
desplazamiento posterior, por lo que no tengo que calcularyOffset
.Espero eso ayude...
fuente
scrollTo
enelement
sino enwindow
Esto me funciona en Chrome (con un desplazamiento suave y sin cortes de tiempo)
Simplemente mueve el elemento, inicia el desplazamiento y luego lo mueve hacia atrás.
No hay "estallido" visible si el elemento ya está en la pantalla.
fuente
Sobre la base de una respuesta anterior, estoy haciendo esto en un proyecto Angular5.
Empezó con:
Pero esto dio algunos problemas y necesitaba establecer el tiempo de espera para scrollBy () de esta manera:
Y funciona perfectamente en MSIE11 y Chrome 68+. No he probado en FF. 500 ms fue el retraso más corto que me atrevería a aventurar. Bajar a veces fallaba porque el suave desplazamiento aún no se había completado. Realice los ajustes necesarios para su propio proyecto.
+1 a Fred727 para obtener esta solución simple pero efectiva.
fuente
Suponiendo que desea desplazarse a los divs que están todos en el mismo nivel en DOM y tienen el nombre de clase "scroll-with-offset", entonces este CSS resolverá el problema:
El desplazamiento desde la parte superior de la página es de 100 píxeles. Solo funcionará según lo previsto con block: 'start':
Lo que está sucediendo es que el punto superior de los divs está en la ubicación normal pero su contenido interno comienza 100px por debajo de la ubicación normal. Para eso está padding-top: 100px. margin-bottom: -100px es para compensar el margen adicional del div inferior. Para completar la solución, agregue también este CSS para compensar los márgenes / rellenos para los divs más altos e inferiores:
fuente
Esta solución pertenece a @ Arseniy-II , acabo de simplificarla en una función.
Uso (puede abrir la consola aquí mismo en StackOverflow y probarla):
fuente
También puedes usar las
element.scrollIntoView()
opcionesque admite la mayoría de los navegadores
fuente
Tengo esto y funciona de maravilla para mí:
Espero eso ayude.
fuente
Otra solución es usar "offsetTop", así:
fuente
Entonces, tal vez esto sea un poco torpe, pero hasta ahora todo va bien. Estoy trabajando en angular 9.
expediente
.ts
expediente
.html
Ajuste el desplazamiento con margen y parte superior de relleno.
¡Saludos!
fuente
Encontré una solución alternativa. Digamos que desea desplazarse a un div, Element here, por ejemplo, y desea tener un espaciado de 20px por encima. Establezca la referencia en un div creado encima de él:
<div ref={yourRef} style={{position: 'relative', bottom: 20}}/> <Element />
Si lo hace, creará este espaciado que desee.
Si tiene un encabezado, cree un div vacío también detrás del encabezado y asígnele una altura igual a la altura del encabezado y haga referencia a él.
fuente
Mi idea principal es crear un tempDiv encima de la vista a la que queremos desplazarnos. Funciona bien sin retrasos en mi proyecto.
Ejemplo usando
Espero que ayude
fuente
Basado en la respuesta de Arseniy-II: tuve el caso de uso en el que la entidad de desplazamiento no era la ventana en sí, sino una plantilla interna (en este caso, un div). En este escenario, necesitamos establecer un ID para el contenedor de desplazamiento y obtenerlo a través de
getElementById
para usar su función de desplazamiento:¡Dejándolo aquí en caso de que alguien enfrente una situación similar!
fuente
Aquí están mis 2 centavos.
También tuve el problema del scrollIntoView desplazándose un poco más allá del elemento, así que creé un script (javascript nativo) que antepone un elemento al destino, lo coloqué un poco en la parte superior con css y me desplacé hasta ese. Después de desplazarme, elimino los elementos creados nuevamente.
HTML:
Archivo Javascript:
CSS:
¡Espero que esto ayude a alguien!
fuente
Agrego estos consejos de CSS para aquellos que no resolvieron este problema con las soluciones anteriores:
fuente
UPD: He creado un paquete npm que funciona mejor que la siguiente solución y es más fácil de usar.
Mi función smoothScroll
Tomé la maravillosa solución de Steve Banton y escribí una función que la hace más conveniente de usar. Sería más fácil de usar
window.scroll()
o inclusowindow.scrollBy()
, como lo intenté antes, pero estos dos tienen algunos problemas:Aqui esta el codigo
Simplemente cópielo y límpielo con él como quiera.
Para crear un elemento de enlace, simplemente agregue el siguiente atributo de datos:
También puede establecer otro atributo como complemento
Representa la
block
opción de lascrollIntoView()
función. De forma predeterminada, esstart
. Leer más sobre MDN .Finalmente
Ajuste la función smoothScroll a sus necesidades.
Por ejemplo, si tiene algún encabezado fijo (o lo llamo con la palabra
masthead
), puede hacer algo como esto:Si no tiene tal caso, simplemente bórrelo, por qué no :-D.
fuente
Para un elemento en una fila de la tabla, use JQuery para obtener la fila encima de la que desea y simplemente desplácese hasta esa fila.
Supongamos que tengo varias filas en una tabla, algunas de las cuales deberían ser revisadas por un administrador. Cada fila que requiere revisión tiene una flecha hacia arriba y hacia abajo para llevarlo al elemento anterior o siguiente para su revisión.
Aquí hay un ejemplo completo que debería ejecutarse si crea un nuevo documento HTML en el bloc de notas y lo guarda. Hay un código adicional para detectar la parte superior e inferior de nuestros artículos para su revisión, de modo que no arrojemos ningún error.
fuente
Solución simple para desplazar un elemento específico hacia abajo
fuente