Eu tenho este input
elemento:
<input type="text" class="textfield" value="" id="subject" name="subject">
Então eu tenho alguns outros elementos, como outras entradas de texto, áreas de texto etc.
Quando o usuário clica em que input
com #subject
, a página deve rolar até o último elemento da página, com uma animação agradável. Deve ser uma rolagem para baixo e não para cima.
O último item da página é um submit
botão com #submit
:
<input type="submit" class="submit" id="submit" name="submit" value="Ok, Done.">
A animação não deve ser muito rápida e deve ser fluida.
Estou executando a versão mais recente do jQuery. Prefiro não instalar nenhum plugin, mas usar os recursos padrão do jQuery para conseguir isso.
javascript
jquery
scroll
DiegoP.
fonte
fonte
scrollTo
foi desativado para mim por causa de um plug-in do Chrome, não sei qual.Respostas:
Supondo que você tenha um botão com o ID
button
, tente este exemplo:Eu obtive o código do artigo Role suavemente até um elemento sem um plugin jQuery . E eu testei no exemplo abaixo.
fonte
.scrollTop(…)
vez de.animate({scrollTop: …}, …)
.jQuery .scrollTo (): Visualizar - Demonstração, API, Origem
Eu escrevi este plugin leve para facilitar a rolagem da página / elemento. É flexível onde você pode passar um elemento de destino ou valor especificado. Talvez isso possa fazer parte do próximo lançamento oficial do jQuery, o que você acha?
Exemplos de uso:
Opções:
scrollTarget : Um elemento, sequência ou número que indica a posição de rolagem desejada.
offsetTop : um número que define espaçamento adicional acima do destino da rolagem.
duration : Uma sequência ou número que determina por quanto tempo a animação será executada.
easing : Uma cadeia que indica qual função de facilitação usar na transição.
complete : uma função para chamar quando a animação estiver concluída.
fonte
Se você não está muito interessado no efeito de rolagem suave e apenas na rolagem para um elemento específico, não precisa de alguma função jQuery para isso. Javascript tem seu caso coberto:
https://developer.mozilla.org/en-US/docs/Web/API/element.scrollIntoView
Então, tudo que você precisa fazer é:
$("selector").get(0).scrollIntoView();
.get(0)
é usado porque queremos recuperar o elemento DOM do JavaScript e não o elemento DOM do JQuery.fonte
$(selector)[0]
?document.getElementById('#elementID').scrollIntoView()
. Não adianta carregar uma biblioteca de ~ 100k apenas para selecionar um elemento e depois convertê-lo para JavaScript comum.document.getElementById('elementID').scrollIntoView()
Usando este script simples
Seria possível classificar que, se uma tag de hash for encontrada no URL, o scrollTo animará para o ID. Se nenhuma tag hash for encontrada, ignore o script.
fonte
$(window.location.hash)
não funcionará para hashes que não atendam à detecção de identificação de regex do jQuery. Por exemplo, hashes que contêm números. Também é um pouco perigoso; o formato da entrada deve ser validado para que você não selecione outro elemento.fonte
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); }); });
A solução de Steve e Peter funciona muito bem.
Mas, em alguns casos, talvez seja necessário converter o valor em um número inteiro. Estranhamente, o valor retornado de
$("...").offset().top
às vezes é infloat
.Usar:
parseInt($("....").offset().top)
Por exemplo:
fonte
Uma versão compacta da solução "animar".
Uso básico:
$('#your_element').scrollTo();
fonte
É assim que eu faço.
Funciona em qualquer navegador.
Pode ser facilmente envolvido em uma função
Aqui está um exemplo de trabalho
Documentos
fonte
Eu sei uma maneira sem jQuery:
Edit: Já faz dois anos e eu ainda estou aleatoriamente recebendo reputação deste post lmao
fonte
Se você estiver manipulando apenas a rolagem para um elemento de entrada, poderá usar
focus()
. Por exemplo, se você deseja rolar para a primeira entrada visível:Ou a primeira entrada visível em um contêiner com classe
.error
:Agradecemos a Tricia Ball por apontar isso!
fonte
Com esta solução, você não precisa de nenhum plug-in e não é necessária nenhuma configuração além de colocar o script antes da
</body>
tag de fechamento .No carregamento, se houver um hash no endereço, rolamos para ele.
E - sempre que você clica em um
a
link com umhref
hash#top
, por exemplo , rolamos para ele.fonte
> 1
em vez de0
, simplesmente porque/#
faz com que esse script para quebrarreturn false;
no final do evento ao clicar para impedir que a ação padrão - rolando imediatamente para a âncora - aconteça.e.preventDefault();
e.preventDefault()
no entanto, não atualiza o hash no URL ao clicar, é sempre um URL sem hash #Na maioria dos casos, seria melhor usar um plugin. A sério. Vou divulgar o meu aqui . Claro que existem outros também. Mas verifique se eles realmente evitam as armadilhas para as quais você deseja um plug-in - nem todos eles.
Eu escrevi sobre as razões para usar um plugin em outro lugar . Em poucas palavras, o liner subjacente à maioria das respostas aqui
é ruim UX.
A animação não responde às ações do usuário. Ele continua mesmo se o usuário clicar, tocar ou tentar rolar.
Se o ponto inicial da animação estiver próximo ao elemento de destino, a animação será dolorosamente lenta.
Se o elemento de destino for colocado próximo à parte inferior da página, ele não poderá ser rolado para o topo da janela. A animação de rolagem para abruptamente, em movimento intermediário.
Para lidar com esses problemas (e vários outros ), você pode usar um plugin meu, jQuery.scrollable . A chamada então se torna
e é isso. Claro, existem mais opções .
No que diz respeito à posição alvo,
$target.offset().top
faz o trabalho na maioria dos casos. Mas lembre-se de que o valor retornado não leva em consideração uma borda nohtml
elemento ( consulte esta demonstração ). Se você precisar que a posição alvo seja precisa em qualquer circunstância, é melhor usarIsso funciona mesmo se uma borda no
html
elemento estiver definida.fonte
Animações:
fonte
Se você deseja rolar dentro de um contêiner excedente (em vez de
$('html, body')
respondido acima), trabalhando também com posicionamento absoluto, esta é a maneira de fazer:fonte
Maneira fácil de obter a rolagem da página para segmentar o ID da div
fonte
Esta é minha abordagem abstraindo os IDs e hrefs, usando um seletor de classe genérico
fonte
Muito simples e fácil de usar plugin jQuery personalizado. Basta adicionar o atributo
scroll=
ao seu elemento clicável e defina seu valor para o seletor para o qual você deseja rolar.Assim:
<a scroll="#product">Click me</a>
. Pode ser usado em qualquer elemento.fonte
fonte
$('html, body').animate(...)
não para mim no iphone, navegador android safari chrome.Eu tive que direcionar o elemento de conteúdo raiz da página.
Aqui está o que eu acabei com
Todo o conteúdo do corpo conectado com uma div #content
fonte
Esta é a resposta da Atharva em: https://developer.mozilla.org/en-US/docs/Web/API/element.scrollIntoView . Só queria adicionar se o documento estiver em um iframe, você pode escolher um elemento no quadro pai para rolar para exibição:
fonte
fonte
Isso rolará primeiro para baixo até
#submit
seguida, restaure o cursor para a entrada que foi clicada, que imita uma rolagem para baixo e funciona na maioria dos navegadores. Também não requer jQuery, pois pode ser escrito em JavaScript puro.Essa maneira de usar a
focus
função pode imitar a animação de uma maneira melhor, através defocus
chamadas em cadeia . Eu não testei essa teoria, mas seria algo parecido com isto:fonte
Eu configurei um elemento de rolagem do módulo
npm install scroll-element
. Funciona assim:Escrito com ajuda das seguintes postagens do SO:
deslocamento-topo-de-um-elemento-sem-jquery
scrolltop-animação-sem-jquery
Aqui está o código:
fonte
Para mostrar o elemento completo (se possível com o tamanho atual da janela):
fonte
Eu escrevi uma função de uso geral que rola para um objeto jQuery, um seletor de CSS ou um valor numérico.
Exemplo de uso:
O código da função:
fonte
Pelo que vale, é assim que eu consegui obter esse comportamento para um elemento geral que pode estar dentro de um DIV com rolagem. No nosso caso, não rolamos o corpo inteiro, mas apenas elementos específicos com estouro: auto; dentro de um layout maior.
Ele cria uma entrada falsa da altura do elemento de destino e, em seguida, coloca um foco nele, e o navegador cuidará do resto, não importa o quão profundo você esteja na hierarquia de rolagem. Funciona como um encanto.
fonte
Isso funcionou para mim:
fonte
fonte
ONELINER
Mostrar snippet de código
fonte
Resposta atualizada a partir de 2019:
fonte