Desplazamiento con javascript y div con propiedad ‘position: sticky’
Tengo una aplicación de React que básicamente es un contenedor con 2 columnas. La columna izquierda es una lista y la columna derecha es un div con posición fija (en realidad es un mapa con pines. Debe mantenerse fijo en la pantalla). Cada elemento de la lista es un enlace en la columna derecha. Cuando el usuario hace clic en el título, la pantalla debe desplazarse para mostrar el elemento actual de la lista en la columna izquierda.
El problema es que cuando la pantalla se desplaza hacia un elemento al final de la lista, la columna derecha también se desplaza y no se mantiene fija.
Me gustaría mantener la columna derecha siempre fija cuando el usuario haga clic en algún título, independientemente de la posición del elemento en la lista de la columna izquierda.
¿Alguna idea de cómo solucionarlo?
davy.ai
Solución para mantener la columna derecha fija en una aplicación de React
Problema
El problema con la aplicación de React actual es que cuando la pantalla se desplaza hacia un elemento al final de la lista, la columna derecha también se desplaza y no se mantiene fija.
Solución
Para solucionar este problema, debemos realizar algunos cambios en el código de la aplicación. Aquí están los pasos:
Debemos pasar una propiedad al componente pegajoso para identificar el elemento activo actual.
El componente pegajoso debe utilizar la propiedad pasada y actualizar su posición basándose en el elemento activo.
Debemos envolver la lista con un elemento contenedor y agregar un evento
onScroll
al mismo.Cuando el usuario hace clic en el título de un elemento de la lista, debemos desplazar el contenedor hasta la posición adecuada.
Cuando el contenedor se desplaza, debemos actualizar el elemento activo en el componente pegajoso basándonos en la posición de desplazamiento del contenedor.
Aquí tienes un código de ejemplo que implementa los cambios mencionados:
En el código anterior, hemos creado un nuevo componente llamado
StickyMap
que recibe la propiedadactiveItem
. Este componente es responsable de renderizar el mapa con los pines y actualizar su posición en base al elemento activo.La función
handleItemClick
es responsable de desplazar el contenedor de la lista hasta la posición adecuada. Encuentra la posición del elemento utilizandoitem.offsetTop
y llama al métodoscrollTo
en el contenedor de la lista.La función
handleListScroll
es responsable de actualizar el elemento activo en el componente pegajoso. Encuentra todos los elementos de la lista utilizandodocument.getElementsByClassName
y recorrelos para encontrar el elemento activo basándose en la posición de desplazamiento del contenedor.Finalmente, hemos agregado un evento
onScroll
al contenedor de la lista para llamar a la funciónhandleListScroll
cada vez que el contenedor se desplace.Conclusión
Siguiendo los pasos anteriores y realizando los cambios necesarios en el código de la aplicación, podemos mantener la columna derecha siempre fija cuando el usuario hace clic en algún título, independientemente de la posición del elemento en la lista de la columna izquierda.