Blog do Adriano Meira - Uma ajudinha para desenvolvedores e web designers. Uma ajudinha para desenvolvedores e web designers.

Navegação desilizante com jQuery – Usando função scrollTop

Olá pessoal recentemente entreguei um trabalho para a Brasil na Web onde o cliente precisava de uma página com todo o conteúdo (one page) e o menu ficasse no topo fixo e ao clicar tivesse uma transição suave ente as sessões do site.

Para isso então usei a função “scrollTop” para que ao clicar no menu o site ande até o ID da área que desejo ser exibida de forma vertical.

Então mãos a obra, primeiro vamos dar uma olhada na marcação de HTML

<!-- Menu de Navegação -->
<div class="topo">
	 <ul class="menu">
    	<li><a href="#home">Home</a></li>
    	<li><a href="#sobre">Sobre</a></li>
    	<li><a href="#contato">Contato</a></li>
    </ul>
</div>

<!-- Conteudos -->
<div class="dados" id="home">
	<h4>Home - seja bem vindo!</h4>
	<p>Conteudo aqui...</p>
</div>
<div class="container dados" id="sobre">
	<h4>Sobre - conheça um pouco mais.</h4>
	<p>Conteudo aqui...</p>
</div>
<div class="container dados" id="contato">
	<h4>Contato - entre em contato conosco.</h4>
	<p>Conteudo aqui...</p>
</div>

Agora para posicionar as coisa cada uma em seu lugar, vamos usar o seguinte CSS

.topo{
    position:fixed;
    left:0;
    top:30px;
    width:100%;
    heigth:30px;
}
    .topo .container{background:#63AB3F;}

ul.menu{
    margin:0;
    padding:5px;
    list-style:none;
}
    ul.menu li{float:left;}
    ul.menu a{
        display:block;
        padding:8px 15px;
        font-size:15px;
	color:#FFF;
    }
    ul.menu a:hover{
        background:#FFF;
	color:#333;
	text-decoration:none;
   }

.dados{
    padding-top:100px;
    height:600px;
}

E para criar o efeito de deslizar ao clicar no menu, vamos chamar a biblioteca jQuery e a biblioteca ease que complementa o jQuery nas animações que ela realizar, note que vamos usar uma função, assim podemos rea-utilizar nosso trecho de código em qualquer parte do nosso site.

Funções ficam fora da chamada inicial do jQuery e podem ser guardadas em arquivos separados, o que recomendo para futuras manutenções, mas neste exemplo colocaremos no mesmo arquivo.

<script type="text/javascript">
	//Inicia o jQuery
    $(function(){
    	//chama a função de scroll
    	navegation($('ul.menu a'),0);
	});

    //função para o scroll do menu
    function navegation(elemento,desconto){
        elemento.bind('click',function(event){
            var $anchor = $(this);
            var calculo = $($anchor.attr('href')).offset().top;
            if(desconto){
                var goto = calculo-desconto;
            }else{
                var goto = calculo;
            }

            $('html, body').stop().animate({
                scrollTop: goto
            }, 900,'easeInOutExpo');

            event.preventDefault();
	});				
    }
</script>

Em uma função podemos passar parâmetros, nesta estamos passando dois parâmetros. Um é o elemento que vai ser clicado, no caso do menu com a âncora de onde vai e outro é o valor de desconto. Ele serve para dar uma diferença para o estado final da rolagem, caso não faça isso no CSS. Neste exemplo estamos trabalhando com o desconto se não tiverem coloque no segundo parâmetro.

Agora vamos fazer uma variação para colocar na horizontal, para isso vamos mudar a função “.offset().top;” para “.offset().left;” e mudar o CSS para que o conteúdo tenha uma largura maior. Veja como fica o código da função ajustada:

//função para o menu deslizante
function navegation(elemento,desconto){
    elemento.bind('click',function(event){
    var $anchor = $(this);
    var calculo = $($anchor.attr('href')).offset().left;
    if(desconto){
        var goto = calculo-desconto;
    }else{
        var goto = calculo;
    }		
    $('html, body').stop().animate({
        scrollLeft: goto
    }, 900,'easeInOutExpo');	
        event.preventDefault();
    });				
}

Agora vamos no HTML e colocar uma div em voltar de todos os elementos e uma largura que soma os três conteúdos, no nosso exemplo é 4500px pois cada conteúdo tem 1500px e ficará assim o HTML

<!-- Menu de Navegação -->
<div class="topo">
	 <ul class="menu">
    	<li><a href="#home">Home</a></li>
    	<li><a href="#sobre">Sobre</a></li>
    	<li><a href="#contato">Contato</a></li>
    </ul>
</div>

<!-- Conteudos -->
<div class="cont-dados">
    <div class="dados" id="home">
        <h4>Home - seja bem vindo!</h4>
        <p>Conteudo aqui...</p>
    </div>
    <div class="container dados" id="sobre">
        <h4>Sobre - conheça um pouco mais.</h4>
        <p>Conteudo aqui...</p>
    </div>
    <div class="container dados" id="contato">
        <h4>Contato - entre em contato conosco.</h4>
        <p>Conteudo aqui...</p>
    </div>
</div>

E no CSS ficará assim

.cont-dados{
    width:4500px;
}
.dados{
    padding-top:100px;
    height:100%;
    width:1500px;
    float:left;
}

Bom é por isso ai pessoal, qualquer dúvida deixem comentários ai e compartilhem, até mais!

 




Adriano Meira é o criador do blog, trabalha desde 2012 como Webdesigner e hoje formado em design gráfico trabalho para a Brasil na Web e como free-lancer nas áreas de Design para Web (Webdesigner), Design Gráfico, Impressos e criação de marcas.

Comente este artigo você também!

Comentários (30)

  • Léo Projarte disse:

    Olá, parabéns pela sua ajuda, além de útil, e bem esplanada. Mas…. sou um tanto leiga em códigos. Estou com um tema” Customizr” wordpress ( http://www.themesandco.com/ )não sei onde colocar os códigos para ganhar este efeito de topo fixo, é no arquivo style .css, ou outro arquivo? Se puder me dar esta força fico grata. Leonice

  • Adriano Meira disse:

    Olá Léo, bom dando uma rápida olhada no seu template e acho que pode ser resolvido só com css, faça o seguinte no final do arquivo de estilo principal acrescente o seguinte código:

    .tc-header{
    position:fixed;
    top:0;
    left:0
    }
    #main-wrapper{
    margin-top:0;
    padding-top:150px;
    }

    Isso fará com que o topo do site fique fixo sempre e que o conteúdo do site fique por baixo com um padding-top dele. Veja ai se funciona, qualquer coisa comente ai! 😉

  • Léo Projarte disse:

    Bom diaaa Adriano Meira….. muitooooo obrigada! Você me ajudou muito. Obrigada mais uma vez por dividir seus conhecimentos…. Deus te abençoe. Saúde e paz!!! Léo.

  • Robson Moulin disse:

    Bacana gostei do tutorial, vou tentar aqui!
    Obrigado pela contribuição.

    abs

  • Guilherme Laureano disse:

    Cara, na boa, muuuito obrigado! Baixei o site. coloquei no Sublime e agora sei fazer certinho, no código do site que eu to fazendo eu vou colocar um agradecimento!

  • evandro disse:

    poderia me ensinar colocar a mensagem que o usuario veio do google !, ja tenho o codigo de verificação ! por favor

  • Nossa!! Adriano, primeira vez, depois de muito tempo, que vejo um tutorial bom, claro, de graça e que funcione comigo, rs.

    Parabéns! Sua dica foi REALMENTE muito útil!

    Sucesso!! 😀

  • Adriano Meira disse:

    Olá Gabrielle, por nada em breve vou arrumar o blog, assim que tiver um tempo obrigado pela visita ate mais!

  • Eduardo disse:

    Adriano, você é demais! Não tens ideia do quanto eu procurei esse tutorial com deslizante horizontal. Você é o cara! Eu te amo!!! #nohomo

  • andre disse:

    Gostaria de um ajuda, para fazer o detalhe da foto(abertura) das imagens quando se clicka se abre um detalhe da foto na mesma pagina, entretanto e dao um scroll e alinha ao top. .

    http://www.beyonce.com/#

    como fazer isso?

    Obrigado.

  • Adriano Meira disse:

    Olá André, cara não entendi bem o que você deseja e algo como este plugin: http://www.jacklmoore.com/colorbox/example1/
    Se for recomendo usar sim este plugin do jQuery ele é bem simples de usar e bem funcional!

    Até mai!

  • Natanael disse:

    Boa tarde Adriano só um duvida quando e usado o scrollTop nao tem como colocar mudar o fundo ?

  • Adriano Meira disse:

    Olá Natanael

    Bom a função .animate do jQuery possibilita fazer chamadas de callback, ou seja, após completo a animação você pode criar novas funções ou ações no seu documento. Veja neste link http://api.jquery.com/animate/#basic-usage que temos um “function()” depois do tempo de animação, aqui dentro você pode fazer um “if” e mudar a cor ou classe de um elemento.

  • Natanael disse:

    Valeu Adriano me ajudo bastante.

    Agora não sei oque houve mas não consigo colocar um background eu to utilizando uma estrutura igual a esta que você coloco no artigo pra ficar mais fácil…

  • Adriano Ribeiro da Costa disse:

    Olá meu xará!

    Muito obrigado pela ajuda! Com toda a sinceridade, é muito legal encontrar pessoas que compartilham conhecimentos, que assim como eu, sabemos da dificuldade para dominar tantas linguagens de programação necessárias para que nossos usuários tenham suas vidas facilitadas com o uso de nossos projetos.

    Um abraço,

    Adriano

  • André disse:

    Adriano Boa tarde,

    Gostei do post, de verdade mas queria saber como faço para ao dar um scroll no mouse e chegar até determinado conteúdo na pagina o menu fique com cor, para mostrar que aquele conteudo se refere aquela parte do menu?

    Não sei se ficou claro minha pergunta, mas gostaria da sua ajuda!

    Grande Abraaço e vamo q vamo!

  • Narciso disse:

    Oi Adriano, sou um cabeçudo que tenta fazer as coisas sem saber e por isso
    fica no google procurando dicas de como resolver problemas, as vezes simples,
    as vezes difíceis, mas que se tornam impossíveis pela capacidade limitada e a
    falta de entendimento que me é testado, quando tento resolve-los. Por isso estou aqui de joelhos pedindo que você me ajude!! Eu estou tentando fazer esse site, em cima de um template baixado no tio Google, só que estou tendo um problema quanto ao Scroll Back to top, eu já vi em vários sites que o logo, a seta, não aparece, ele funciona, porém a seta no site fica ilegível, fica aparecendo um retângulo com palavras, mas não o desenho, vc acha que com suas ótimas dicas e a minha precariedade podemos resolver, Obrigado mil vezes!!

  • Adriano Meira disse:

    Olá André

    Tem como sim, você pode fazer o seguinte, primeiro vamos criar uma classe de CSS que se chama “.atual” que tem as mesmas propriedades do “:hover” do menu, assim nas primeiras instruções da função vamos zerar qualquer css “.atual” da Ul com links e depois acrescentar no elemento esta classe, por exemplo:

    //função para o menu deslizante
    function navegation(elemento,desconto){
    elemento.bind('click',function(event){
    var $anchor = $(this);
    var calculo = $($anchor.attr('href')).offset().top;
    // remove e acrescenta a classe atual do link
    elemento.parent().parent().find('.atual').removeClass('atual');
    $anchor.addClass('atual');

    Note que acrescentei duas instruções, onde a primeira eu volto dois níveis do click, procuro pela classe e a removo e na segunda eu acrescento a classe na hora do click, confira no exemplo: http://www.adrianomeira.com/blog/downloads/navegacao-deslizante/vertical.php

  • Adriano Meira disse:

    Olá Narciso

    talvez seja a biblioteca de ícones ou fontes que não esteja instanciada, me passe uma URL do seu projeto para avaliar melhor 😉

  • Narciso disse:

    Oi Adriano, em primeiro lugar, Muito Obrigado por dividir o seu tempo raro com cabeças duras como nós!! Eu fiz o que vc falou e “Plim”, acho que esse o barulho,
    deu certo!! Muito Obrigado e se precisar de algo que possa ajudar, fique a vontade!!
    Valeu e Bons Ventos!!

  • Adriano Meira disse:

    Opa por nada Narciso 🙂

  • Muito obrigado pelo código, só possuo uma dúvida, no meu site o scroll está sendo muito rápido, a partir do momento que eu clico ele já vai direto para a Div, n fz aquele efeito de deslize.
    pelo que eu pude perceber esse efeito e feito através do jquery.easing.min.js correto ?
    Muito obrigado

  • Adriano Meira disse:

    Olá Bruno, não o jquery.easing é usado para efeito, voc~e pode controlar a velocidade da animação através do segundo parâmetro, na função “animte”, informamos para onde vai, qual velocidade e qual animação (com easing ou expressão numérica).

  • mauricio disse:

    olá excelente artigo, gostaria de saber como faço para quando eu deslizar para meio da pagina com mouse ou melhor quando eu tiver passando pelo menu sobre ele troca alto matico do menu home para sobre e conforme eu deso mais ele muda para contato alto matico.

  • Adriano Meira disse:

    Olá Maurício

    Bom se entendi bem, para seu caso existe um plugin chamado ScrollSpy que muda seus elementos cruzando informações de posição do scrol e elementos selecionados, veja mais neste link https://github.com/sxalexander/jquery-scrollspy no Bootstrap 2 e 3 já existia este tipo de programação confira em http://getbootstrap.com/javascript/#scrollspy

    Até mais!

  • charles ono disse:

    Bom dia caro Adriano parabéns pela postagem!

  • Gustavo disse:

    Olá Adriano,
    Estou com um problema, pois deixo o topo fixo e a rolagem com ancora mas as div do conteúdo estão ficando com parte para trás do topo, saberia me dizer por que?

  • Adriano Meira disse:

    Olá Gustavo, provavelmente o valor do “desconto” está menor, tente mudar para mais o valor desta variável.

  • everson disse:

    muito bom me ajudou e muito em um novo projeto meu, parabéns pelo belo tutorial

  • Rodrigo disse:

    Adriano, agradeceria muito se você me ajudasse num erro que estou enfrentando.
    O mesmo menu da página inicial, é utilizado nas páginas secundárias, logo, quando abro uma postagem do blog, os links #home #contact etc não funcionam. Se eu crio o menu com index.php/#home dai a página é carregada novamente e não desliza… tem com resolver?

Publicidade e outros

Marcadores de Página Magnético

 

Leia e Liberte pelo BookCrossing.com ...