Screencaster Transmitindo conhecimento


jQuery Smooth Scroll permite que você faça scrolls animados

jQuery Smooth Scroll

Já conhecia há um tempo esta solução para fazer scroll animado em sites. Trata-se de uma solução legal e que funciona bem, no entanto ela tem certas limitações:

1 - Só permite rolagem na vertical, e não na horizontal
2 - Não é muito elegante em termos de código
3 - Não é muito flexível
4 - Só permite que se usem como “alvos” elementos <a> com atributo “name”

Pensando em ter uma solução melhor que resolvesse estes problemas, resolvi criar um plugin para jQuery que permite a utilização de scrolls bonitinhos sem muito esforço e com muita elegância :)

Trata-se do jQuery Smooth Scroll, vocês podem ver uma demonstração dele funcionando aqui. Experimentem clicar nos links do menu ;). Este efeito tem sido utilizado bastante em sites, onde a navegação é em apenas uma página e em vez da pessoa ter que rolar a página para baixo (ou para os lados), os próprios links fazem isso, e de um modo bem agradável.

#COMOFAS?

Crie os elementos para os quais você quer rolar. Digamos que você tenha um site muito comprido na vertical, com um longo texto, e queira dar a opção para o usuário voltar ao topo sem precisar ele mesmo rolar a página, você faz assim:

<div id="topo">(conteudo do topo)</div>

E lá no final do texto, assim:

<a href="#topo">Voltar ao topo ^</a>

Desta forma, clicando no link a página vai rolar ao topo, mesmo sem javascript nenhum, apenas sem o efeito bacana.

E agora? Como faço o efeitinho?

É muito simples, primeiramente baixe a biblioteca jQuery (que imagino que você já deva estar usando, hein?), e após isso baixe o plugin jQuery Smooth Scroll.

Feito isso, não esqueça de incluí-los em seu head:

	<script src="jquery.js" type="text/javascript"></script>
	<script src="jquery.smoothscroll.js" type="text/javascript"></script>

Para que determinado link chame o efeito, você precisa selecioná-lo com o jQuery e chamar a função smoothScroll. Digamos que eu tenha numa página diversos links com hrefs semelhantes ao que mostrei anteriormente, “#nomedoelemento” como href. Eu posso fazer assim:

		$(function(){			
			$("a[href^=#]").smoothScroll(300,20,20,20)
		})

Desta forma, todos os links cujo href iniciar com um sustenido (a href=”#…”) irão disparar o efeito. O plugin se encarrega automaticamente de detectar a posição do elemento com aquele ID e de fazer todo o resto, você só precisa chamar a função. Note que ela pode receber 4 parâmetros (os 4 são opcionais, você pode chamar ela sem nenhum se quiser). São eles:

- Duração do efeito: O tempo que o efeito irá demorar, em milisegundos (o padrão é 500)
- Velocidade do efeito: A velocidade média em que a página irá rolar (o padrão é 10). Note que a velocidade varia por causa do easing, em vez do efeito ocorrer de forma linear, ele forma uma curva na sua velocidade (no começo vai devagar, acelerando aos poucos, e quando está chegando no destino vai ficando mais devagar até parar).
- Margem esquerda: Isto serve para dar um espaço extra na lateral esquerda, desta forma o elemento de destino não fica “grudado” no canto da tela (o padrão é zero)
- Margem superior: O mesmo que o anterior, só que para o topo do elemento (o padrão é zero)

Então é isso, espero que tenham gostado do plugin e que utilizem-no para dar um charme a mais nos seus sites

Para finalizar, confira 3 sites que utilizam scroll animado e navegação horizontal:

- deanoakley.com/
- inside.nile.ru/
- www.johanndizon.com/

Até mais!

Este post foi útil? Então clica aí, vai :D


19 pessoas comentaram

  1. [...] Screencaster » jQuery Smooth Scroll permite que você faça scrolls animados (tags: plugin jquery plugins scroll) [...]

  2. KATIERO says:

    Legal esta opção! Estou usando no meu site algo parecido mas com smooth scroll na vertical.

  3. Muito legal esse efeito mesmo.

    Mas uma pergunta?

    Cadê as vídeo aulas de Ruby On Rails? Pelo amo de Deus!!! Está fazendo muita falta!

    Se possível fazer uma vídeo aula por dia. HOAIUHsoiAHoiSHaoishaoishaoisHOIShsoihasoiHASOi
    Zuera!

  4. carlos says:

    Amigo, por favor, nao sei oq esta acontecendo, tenho uma pagina na horizontal com 4 topicos, home,fotos, pacotes,contato, nao consigo de forma alguma divir ela em div, ela so rola para a home, e as demais nao funciona, onde estou errando, vc pode me ajudar? abraço

  5. Rafael says:

    Onde baixar esse pluguin.?

  6. Alex says:

    Ja tentei outros scripts com esta funcionalidade mas este aparentemente funciona-me melhor..
    o problema é que keria ao carregar a pagina ela fosse automaticamente para determinado link.
    em outros scripts similares consigo enfiando no kualker coisa como $(”#scrollToHere”) . Mas neste nao consigo achar maneira.
    Alguem pode ajudar por favor?

  7. Gabriel says:

    Existe a possibilidade de quando clicar no link ele centralizar em vez de deixar alinhado no topo a esquerda ?

    Estou tentando fuçar nisso mas estão complicado pensar na lógico sem entender o funcionamento e manjando pouco de JS
    já que depende da resolução do usuario.

    Alguém tem uma luz ?

    Obrigado!

  8. Gabriel says:

    Só para constar que achei uma solução caso alguém mais precise.

    Basta pegar a área “útil” do navegador com JS e fazer o posicionamento com o CSS e redirecionar o tamanho da div com esse valor.

    Tútorial para pegar o valor -> http://isbyte.com/?p=63

    O código para pegar os valores e jogar na div é esse:

    function muda(){
    //Gabriel Ferrari
    //http://www.gflink.com
    //Desenvolvimento Web
    //29-10-2009
    alert(’Width: ‘ + getWidth().toString());
    alert(’Height: ‘ + getHeight().toString());

    larg = getWidth().toString();
    altu = getHeight().toString();

    function getWidth()
    {
    // Thiago Marotta Couto
    // thiago@isbyte.com
    // http://isbyte.com/
    // December, 06 - 2008
    return window.innerWidth ? window.innerWidth : /* For non-IE */
    document.documentElement ? document.documentElement.clientWidth : /* IE 6+ (Standards Compilant Mode) */
    document.body ? document.body.clientWidth : /* IE 4 Compatible */
    window.screen.width; /* Others (It is not browser window size, but screen size) */
    }

    function getHeight()
    {
    // Thiago Marotta Couto
    // thiago@isbyte.com
    // http://isbyte.com/
    // December, 06 - 2008
    return window.innerHeight ? window.innerHeight : /* For non-IE */
    document.documentElement ? document.documentElement.clientHeight : /* IE 6+ (Standards Compilant Mode) */
    document.body ? document.body.clientHeight : /* IE 4 Compatible */
    window.screen.height; /* Others (It is not browser window size, but screen size) */
    }
    //Gabriel Ferrari
    //http://www.gflink.com
    //Desenvolvimento Web
    //29-10-2009

    document.getElementById(’sua_div’).style.width = larg + ‘px’;
    document.getElementById(’sua_div’).style.height = altu + ‘px’;

    }

  9. Ricardo Jr says:

    olá, queria que ao invés de mandar para o topo, ou andar lateralmente, ele ia direto pro rodapé, automatico.

    tipo eu to no home, ao eu clico pra ir em contato, mais o meu topo é mto grande, pode ser que o usuario nao perceba que foi carregada a pagina, pois nao aparece no monitor dele, ele precisa rodar o scrool do mouse. Pra melhorar isso que queria jogar automaticamente para o fim da pagina, ou pro meio msm..

    poderia me ajudar??
    desde já agradeço


    Ricardo Jr.

    • inside says:

      Olá Ricardo, o que você quer fazer é bem simples. Basta colocar um ID no elemento para o qual você quer rolar, se for um form, ficaria tipo assim:
      <form id="contato">
      E no seu link você coloca:
      <a href="#contato">Texto do link</a>
      Desta forma, quando a pessoa clicar no link irá para o elemento com o ID “contato”.

  10. Vinícius says:

    Muito bom, simples e eficiente.

  11. User says:

    Olá, tenho uma dúvida.

    “você precisa selecioná-lo com o jQuery e chamar a função smoothScroll” Como faço isso?”

  12. Manero cara ótima dica, Estava procurando a um tempo, e nao conseguie.
    Parabéns

  13. ANDERSON says:

    Como eu monto isso no dreamweaver???? valeu pela ajuda

  14. paulo says:

    Oi vcs por um acaso sabem se funciona com joomla?

Agora é a sua vez: