Estou usando ScrollIntoView () para rolar o item destacado em uma lista para exibição. Quando eu rolar para baixo, ScrollIntoView (false) funciona perfeitamente. Mas quando eu rolar para cima, ScrollIntoView (true) está fazendo com que a página inteira se mova um pouco, o que eu acho que é o intuito. Existe uma maneira de evitar que a página inteira se mova ao usar ScrollIntoView (true)?
Aqui está a estrutura da minha 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 está vindo de uma chamada ajax. Usando o safari móvel.
Obrigado pela sua ajuda antecipadamente!
javascript
css
estou aqui
fonte
fonte
Respostas:
Você pode usar em
scrollTop
vez descrollIntoView()
:jsFiddle: http://jsfiddle.net/LEqjm/
Se houver mais de um elemento rolável que você deseja rolar, você precisará alterar o
scrollTop
de cada um individualmente, com base nosoffsetTop
s dos elementos intermediários. Isso deve dar a você o controle refinado para evitar o problema que está tendo.EDIT: offsetTop não é necessariamente relativo ao elemento pai - é relativo ao primeiro ancestral posicionado. Se o elemento pai não estiver posicionado (relativo, absoluto ou fixo), você pode precisar alterar a segunda linha para:
fonte
target.parentNode.scrollTop = target.offsetTop - target.parentNode.offsetTop
position: relative
, então você não deve subtrair seu deslocamento. Mas você está certo para a maioria dos casos.position: relative
on prent div: ele realmente resolveu o problemaCorrigido com:
consulte: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
fonte
block : 'nearest'
parâmetro.fonte
top: el['offsetTop']
Eu também tive esse problema e passei muitas horas tentando resolvê-lo. Espero que minha resolução ainda possa ajudar algumas pessoas.
Minha correção acabou sendo:
.scrollIntoView()
para.scrollIntoView({block: 'nearest'})
(graças a @jfrohn).overflow: -moz-hidden-unscrollable;
no elemento do contêiner que muda.fonte
Brinque com
scrollIntoViewIfNeeded()
... certifique-se de que é compatível com o navegador.fonte
Eu adicionei uma maneira de exibir o comportamento importante do ScrollIntoView - http://jsfiddle.net/LEqjm/258/ [deve ser um comentário, mas não tenho reputação suficiente]
fonte
O plugin jQuery
scrollintoview()
aumenta a usabilidadeEm vez da implementação DOM padrão, você pode usar um plugin que anima o movimento e não tem efeitos indesejados. Esta é a maneira mais simples de usá-lo com padrões:
De qualquer forma, dirija-se a esta postagem do blog onde você pode ler todos os detalhes e, eventualmente, levará você ao código-fonte do GitHub do plugin.
Este plugin procura automaticamente o elemento ancestral rolável mais próximo e o rola de forma que o elemento selecionado esteja dentro de sua porta de visualização visível. Se o elemento já estiver na porta de visualização, ele não fará nada, é claro.
fonte
Usando a ideia de Brilliant, aqui está uma solução que somente rola (verticalmente) se o elemento NÃO estiver visível no momento. A ideia é obter a caixa delimitadora da janela de visualização e o elemento a ser exibido no espaço de coordenadas da janela do navegador. Verifique se ele está visível e, se não estiver, role pela distância necessária para que o elemento seja mostrado na parte superior ou inferior da janela de visualização.
fonte
Adicionando mais informações para
@Jesco
postar.Element.scrollIntoViewIfNeeded()
non-standard WebKit method
para navegadores Chrome, Opera, Safari.Se o elemento já estiver na área visível da janela do navegador, nenhuma rolagem ocorrerá .
Element.scrollIntoView()
método rola o elemento no qual é chamado para a área visível da janela do navegador.Experimente o código abaixo no
mozilla.org
scrollIntoView()
link. Postagem para identificar o navegadorfonte
no meu contexto, ele empurraria a barra de ferramentas aderente para fora da tela ou entraria próximo a um botão de fab com absoluto.
usando o mais próximo resolvido.
fonte
Tive o mesmo problema, resolvi removendo o
transform:translateY
CSS que coloquei nafooter
página.fonte