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!
Tweet |
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.
Bacana gostei do tutorial, vou tentar aqui!
Obrigado pela contribuição.
abs
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!
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, você é demais! Não tens ideia do quanto eu procurei esse tutorial com deslizante horizontal. Você é o cara! Eu te amo!!! #nohomo
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. .
como fazer isso?
Obrigado.
Boa tarde Adriano só um duvida quando e usado o scrollTop nao tem como colocar mudar o fundo ?
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…
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
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!
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!!
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!!
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
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.
Bom dia caro Adriano parabéns pela postagem!
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?
muito bom me ajudou e muito em um novo projeto meu, parabéns pelo belo tutorial
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?
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