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!

Eu consigo produzir conteúdo gratuito para o blog graças à ajuda do pessoal que compra as aulas pagas. Se você puder, compre uma das aulas pro e ajude a manter este blog no ar.


26 pessoas comentaram

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

  2. KATIERO disse:

    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 disse:

    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 disse:

    Onde baixar esse pluguin.?

  6. Alex disse:

    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 disse:

    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 disse:

    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
    // [email protected]
    // 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
    // [email protected]
    // 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 disse:

    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 disse:

      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 disse:

    Muito bom, simples e eficiente.

  11. User disse:

    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 disse:

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

  14. paulo disse:

    Oi vcs por um acaso sabem se funciona com joomla?

  15. Tutorial City disse:

    Vou deixar uma sugestão pra uma possível próxima versão desse plugin:

    que tal permitir a passagem de parâmetros através de um objeto? + – assim:
    .smothScroll({
    duration:500,
    speed: 20,
    marginLeft: 20,
    marginRight: 20
    });

    Abraços

  16. Olá.
    Caiu muito bem este tutorial para meus futuros projetos.

    Mas o que eu realmente quero aqui, é perguntar se alguém percebeu diferenças nos efeitos em cada navegador.

    Testei no IE, Firefox e Chrome, por acaso o crhome deu problemas ao invés do ie.
    1º – os scripts só funcionaram sem deformar as imagens estando dentro de um iframe, antes disso cada vez que eu “pulava” para a próxima div ele repetia muitas vezes apenas uma parte do logo.
    2º – o chrome não reproduz os efeitos na mesma velocidade dos demais navegadores, sempre passa mais rápido e os únicos campos que fazem diferença para este navegador são as margens (aqui: $(function(){ $(“a[href^=#]“).smoothScroll(300,20,20,20)}) ). Ainda estou tentando resolver isto, se não resolver em breve, vou testar outro script. Aceito sugestões com muito prazer :]

    ps. se quiser dar uma olhada: danielaemauricio.com/sites/index2.html

  17. Seu nome disse:

    Cara, ótimo script. Gostaria de saber se existe alguma maneira de informar a posição em pixels ao invés da id. Pois estou usando div’s com posições absolutas, e atributos no css como “left”. Aí o plugin não consegue detectar corretamente aonde o conteudo da div realmente começa depois da margem ‘left’.

    Grande abraço!

  18. Dan disse:

    os parametros de velocidade e duração não funcionam pra mim, nnão importa o valor que eu coloque sempre fica na mesma velocidade

    já tentei inclusive colocar valores altissimos e baixíssimos para ver se noto diferença, mas não há

    tb tentei mudar diretamente no arquivo jquery.smoothscrooll.js os valores undefined e mesmo assim não noto diferença

  19. Cara… Parabéns… Muito bom o seu tutorial… To vendo sobre jquery e não sei como não fui atraz disso antes… eu estava fazendo tudo na mão… mas não tem vantagem alguma… o mercado pede algo mais rápido.. jquery é a solução…

    valeu… :)

Agora é a sua vez: