Esta função funciona bem. Rola o corpo para o deslocamento de um contêiner desejado
function scrolear(destino){
var stop = $(destino).offset().top;
var delay = 1000;
$('body').animate({scrollTop: stop}, delay);
return false;
}
Mas não no Firefox. Por quê?
-EDITAR-
Para lidar com o double trigger na resposta aceita, sugiro interromper o elemento antes da animação:
$('body,html').stop(true,true).animate({scrollTop: stop}, delay);
Respostas:
O Firefox coloca o estouro no
html
nível, a menos que tenha um estilo específico para se comportar de maneira diferente.Para que ele funcione no Firefox, use
Exemplo de trabalho
A solução CSS seria definir os seguintes estilos:
Eu diria que a solução JS seria menos invasiva.
Atualizar
Muita discussão abaixo se concentra no fato de que a animação
scrollTop
de dois elementos faria com que o retorno de chamada fosse invocado duas vezes. Os recursos de detecção de navegador foram sugeridos e subseqüentemente preteridos, e alguns são sem dúvida bastante rebuscados.Se o retorno de chamada for idempotente e não exigir muito poder de computação, acioná-lo duas vezes pode ser um problema não completo. Se várias chamadas do retorno de chamada forem realmente um problema e se você quiser evitar a detecção de recursos, pode ser mais direto garantir que o retorno de chamada seja executado apenas uma vez a partir do retorno de chamada:
fonte
$(jQuery.browser.webkit ? "body": "html").animate(...);
$(jQuery.browser.mozilla ? "html" : "body").animate(...);
. Seria ótimo não usar o sniffing de navegação, mas a detecção de recursos.jQuery.browser
é obsoleto e faltando a versão mais recente jQuerywindow.scroll
não anima. Você poderia, naturalmente, rolar suas próprias coisas com intervalos escrollBy
. Se você deseja adicionar um alívio a isso, de repente você tem muito código para escrever, para um aspecto menor do seu produto.A detecção de recursos e a animação em um único objeto suportado seriam boas, mas não há uma solução de uma linha. Enquanto isso, aqui está uma maneira de usar uma promessa de fazer um único retorno de chamada por execução.
ATUALIZAÇÃO: veja como você pode usar a detecção de recursos. Esse pedaço de código precisa ser avaliado antes da sua chamada de animação:
Agora use o var que acabamos de definir como o seletor da animação de rolagem de página e use a sintaxe regular:
fonte
html
e às vezes retornarbody
. Aqui está o meu código depois de declarar a funçãovar scrollTopElement; setTimeout( function() { scrollTopElement = getScrollTopElement(); console.log(scrollTopElement); }, 1000);
Obrigado por isso, porém, resolveu o meu problema.html
vez debody
como deveria. Isso ocorre apenas se você rolar a página e recarregar, caso contrário, ele funciona.Passei anos tentando descobrir por que meu código não funcionaria -
O problema estava no meu css -
Eu o configurei para
auto
(em vez disso, fiquei preocupado com o motivo de ter sido definido100%
). Isso consertou para mim.fonte
Você pode evitar o problema usando um plug-in - mais especificamente, meu plug-in :)
Sério, mesmo que o problema básico tenha sido resolvido há muito tempo (navegadores diferentes usam elementos diferentes para rolar a janela), existem alguns problemas não triviais abaixo da linha que podem atrapalhar você:
body
ehtml
tem seus problemas ,Eu sou obviamente tendencioso, mas o jQuery.scrollable é realmente uma boa opção para resolver esses problemas. (Na verdade, eu não conheço nenhum outro plugin que lide com todos eles.)
Além disso, você pode calcular a posição de destino - aquela para a qual você rola - de maneira à prova de balas com a
getScrollTargetPosition()
função nesta essência .Tudo o que deixaria você com
fonte
Cuidado com isso. Eu tive o mesmo problema, nem o Firefox nem o Explorer rolando com
Então eu usei como David disse
Ótimo funcionou, mas novo problema, já que existem dois elementos, corpo e html, a função é executada duas vezes, ou seja, o X roda duas vezes.
tentei apenas com 'html' e o Firefox e o Explorer funcionam, mas agora o Chrome não suporta isso.
Corpo necessário para o Chrome e html para Firefox e Explorer. É um bug do jQuery? não sei.
Apenas tome cuidado com sua função, pois ela será executada duas vezes.
fonte
Eu recomendaria não confiar
body
nemhtml
como uma solução mais portátil. Basta adicionar uma div no corpo que tenha o objetivo de conter os elementos rolados e estilizá-lo para ativar a rolagem em tamanho real:(supondo que
display:block;
etop:0;left:0;
sejam os padrões que correspondem ao seu objetivo) e use$('#my-scroll')
para suas animações.fonte
Este é o negócio real. Funciona perfeitamente no Chrome e Firefox. É até triste que alguns ignorantes me votem. Esse código literalmente funciona perfeitamente como em todos os navegadores. Você só precisa adicionar um link e colocar o ID do elemento que deseja rolar no href e ele funciona sem especificar nada. Código reutilizável e confiável puro.
fonte
Encontrei o mesmo problema recentemente e resolvi-o fazendo o seguinte:
E você !!! funciona em todos os navegadores.
caso o posicionamento não esteja correto, você pode subtrair um valor do offset () .top fazendo isso
fonte
Para mim, o problema era que o Firefox saltou automaticamente para a âncora com o atributo name igual ao nome do hash que eu coloquei na URL. Mesmo que eu coloque .preventDefault () para evitar isso. Então, após alterar os atributos de nome, o Firefox não pulou automaticamente para as âncoras, mas executou a animação corretamente.
@ Toni Desculpe se isso não era compreensível. O problema é que mudei os hashes no URL como www.someurl.com/#hashname. Então eu tive, por exemplo, uma âncora como
<a name="hashname" ...></a>
a qual o jQuery deveria rolar automaticamente. Mas não foi porque pulou direto para a âncora com o atributo de nome correspondente no Firefox sem nenhuma animação de rolagem. Depois que alterei o atributo name para algo diferente do nome do hash, por exemploname="hashname-anchor"
, a rolagem funcionou.fonte
Para mim, estava evitando anexar o ID no ponto da animação:
Evitando:
Preparando o ID antecipadamente e fazendo isso:
Corrigido no FF. (As adições de CSS não fizeram diferença para mim)
fonte
Espero que isso funcione.
fonte