Estoy usando ScrollIntoView () para desplazar el elemento resaltado en una lista a la vista. Cuando me desplazo hacia abajo, ScrollIntoView (falso) funciona perfectamente. Pero cuando me desplazo hacia arriba, ScrollIntoView (verdadero) hace que toda la página se mueva un poco, lo que creo que está previsto. ¿Hay alguna manera de evitar que toda la página se mueva cuando se usa ScrollIntoView (verdadero)?
Aquí está la estructura de mi página:
#listOfDivs {
position:fixed;
top:100px;
width: 300px;
height: 300px;
overflow-y: scroll;
}
<div="container">
<div="content">
<div id="listOfDivs">
<div id="item1"> </div>
<div id="item2"> </div>
<div id="itemn"> </div>
</div>
</div>
</div>
listOfDivs proviene de una llamada ajax. Usando safari móvil.
¡Gracias por su ayuda de antemano!
javascript
css
Estoy aquí
fuente
fuente
Respuestas:
Podrías usar en
scrollTop
lugar descrollIntoView()
:jsFiddle: http://jsfiddle.net/LEqjm/
Si hay más de un elemento desplazable por el que desea desplazarse, deberá cambiar el
scrollTop
de cada uno de forma individual, según laoffsetTop
s de los elementos intermedios. Esto debería darle un control detallado para evitar el problema que está teniendo.EDITAR: offsetTop no es necesariamente relativo al elemento padre, es relativo al primer antepasado posicionado. Si el elemento principal no está posicionado (relativo, absoluto o fijo), es posible que deba cambiar la segunda línea a:
fuente
target.parentNode.scrollTop = target.offsetTop - target.parentNode.offsetTop
position: relative
, entonces no debe restar su desplazamiento. Pero tienes razón para la mayoría de los casos.position: relative
en prent div: realmente soluciona el problemaArreglado con:
ver: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
fuente
block : 'nearest'
parámetro.fuente
top: el['offsetTop']
Yo también tuve este problema y pasé muchas horas tratando de solucionarlo. Espero que mi resolución pueda ayudar a algunas personas.
Mi solución terminó siendo:
.scrollIntoView()
a.scrollIntoView({block: 'nearest'})
(gracias a @jfrohn).overflow: -moz-hidden-unscrollable;
en el elemento contenedor que cambia.fuente
Juega con
scrollIntoViewIfNeeded()
... asegúrate de que sea compatible con el navegador.fuente
Agregué una forma de mostrar el comportamiento inadecuado de ScrollIntoView: http://jsfiddle.net/LEqjm/258/ [debería ser un comentario pero no tengo suficiente reputación]
fuente
El complemento jQuery
scrollintoview()
aumenta la usabilidadEn lugar de la implementación de DOM predeterminada, puede usar un complemento que anime el movimiento y no tenga efectos no deseados. Esta es la forma más sencilla de usarlo con valores predeterminados:
De todos modos, diríjase a esta publicación de blog donde puede leer todos los detalles y eventualmente lo llevará al código fuente de GitHub del complemento.
Este complemento busca automáticamente el elemento antepasado desplazable más cercano y lo desplaza para que el elemento seleccionado esté dentro de su puerto de vista visible. Si el elemento ya está en el puerto de visualización, por supuesto, no hace nada.
fuente
Usando la idea de Brilliant, aquí hay una solución que solo se desplaza (verticalmente) si el elemento NO está visible actualmente. La idea es que el cuadro delimitador de la ventana gráfica y el elemento se muestren en el espacio de coordenadas de la ventana del navegador. Compruebe si está visible y, si no, desplácese por la distancia requerida para que el elemento se muestre en la parte superior o inferior de la ventana gráfica.
fuente
Añadiendo más información para
@Jesco
publicar.Element.scrollIntoViewIfNeeded()
non-standard WebKit method
para los navegadores Chrome, Opera, Safari.Si el elemento ya se encuentra dentro del área visible de la ventana del navegador, no se realiza ningún desplazamiento .
Element.scrollIntoView()
El método desplaza el elemento en el que se llama al área visible de la ventana del navegador.Pruebe el siguiente código en el
mozilla.org
scrollIntoView()
enlace. Publicar para identificar el navegadorfuente
en mi contexto, empujaría la barra de herramientas adhesiva fuera de la pantalla, o ingresaría junto a un botón fabuloso con absoluto.
usando el resuelto más cercano.
fuente
Tuve el mismo problema, lo solucioné eliminando el
transform:translateY
CSS que coloqué en elfooter
de la página.fuente