Efeito accordion na horizontal com JQuery & CSS3
Tags accordion, css, css3, html, jquery
Categorias: css, html, jquery, tutoriais
Dando início a uma série de dicas / tutoriais que irei postar nesse blog, segue uma dica valiosa para quem precisa exibir imagens em um curto espaço, ou apenas para deixar a exibição delas mais atraente, trazendo um efeito elegante e moderno.
A idéia é criar um accordion horizontal que se abre ao passar com o mouse por cima das imagens. Utilizaremos JQuery & CSS3.
Veja aqui uma demonstração do proposto.
HTML:
No arquivo HTML teremos uma lista. Dentro de cada elemento da lista, adicionamos um cabeçalho que desaparecerá quando estivermos com o mouse por cima deste elemento. Segue abaixo o código HTM para um elemento. Repita esta operação para todos os seus itens.
<ul id="accordion" class="accordion">
<li class="bg1">
<div class="heading">Cabeçalho</div>
<div class="description">
<h2>Cabeçalho</h2>
Algum texto aqui
veja mais
</div>
</li>
</ul>
Os outros elementos da lista devem possuir as classes diferentes (ex. bg2, bg3, etc).
CSS
No arquivo CSS, adicione as linhas abaixo:
ul.accordion{
list-style:none;
position:absolute;
right:80px;
top:0px;
font-family: Cambria, serif;
font-size: 16px;
font-style: italic;
line-height: 1.5em;
}
ul.accordion li{
float:right;
width:115px;
height:480px;
display:block;
border-right:2px solid #fff;
border-bottom:2px solid #fff;
background-color:#fff;
background-repeat:no-repeat;
background-position:center center;
position:relative;
overflow:hidden;
cursor:pointer;
-moz-box-shadow:1px 3px 15px #555;
-webkit-box-shadow:1px 3px 15px #555;
box-shadow:1px 3px 15px #555;
}
ul.accordion li.bg1{
background-image:url(../images/1.jpg);
}
ul.accordion li.bg2{
background-image:url(../images/2.jpg);
}
ul.accordion li.bg3{
background-image:url(../images/3.jpg);
}
ul.accordion li.bg4{
background-image:url(../images/4.jpg);
}
ul.accordion li.bleft{
border-left:2px solid #fff;
}
ul.accordion li .heading{
background-color:#fff;
padding:10px;
margin-top:60px;
opacity:0.9;
text-transform:uppercase;
font-style:normal;
font-weight:bold;
letter-spacing:1px;
font-size:14px;
color:#444;
text-align:center;
text-shadow:-1px -1px 1px #ccc;
}
ul.accordion li .description{
position:absolute;
width:480px;
height:175px;
bottom:0px;
left:0px;
display:none;
}
ul.accordion li .description h2{
text-transform:uppercase;
font-style:normal;
font-weight:bold;
letter-spacing:1px;
font-size:45px;
color:#444;
text-align:left;
margin:0px 0px 15px 20px;
text-shadow:-1px -1px 1px #ccc;
}
ul.accordion li .description p{
line-height:14px;
margin:10px 22px;
font-family: "Trebuchet MS", sans-serif;
font-size: 12px;
font-style: italic;
font-weight: normal;
text-transform: none;
letter-spacing: normal;
line-height: 1.6em;
}
ul.accordion li .description a{
position:absolute;
bottom:5px;
left:20px;
text-transform:uppercase;
font-style:normal;
font-size:11px;
text-decoration:none;
color:#888;
}
ul.accordion li .description a:hover{
color:#333;
text-decoration:underline;
}
/** Gradiente para colocar a descrição em cima **/
ul.accordion li .bgDescription{
background:transparent url(../images/bgDescription.png) repeat-x top left;
height:340px;
position:absolute;
bottom:0px;
left:0px;
width:100%;
display:none;
}
Note que a propriedade text-shadow não irá funcionar no Internet Explorer.
O caminho para as imagens aqui irão variar de acordo com a localização das imagens que você irá utilizar.
A largura inicial para cada item será de 115px. Depois na parte do Javascript iremos fazer com que esta largura seja alterada.
A imagem gradiente que está sendo utilizada é um gradiente que parte da cor branca para o transparente. Isto traz um efeito visual legal.
Vamos agora para a parte que irá fazer com que as coisas funcionem: O javascript…
Javascript
Primeiramente iremos precisar incluir o framework JQuery. Você poderá incluir através do Google APIS, como segue:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
Agora criaremos uma função para que quando o mouse estiver sobre a imagem (li) faça o efeito de slide para exibir o conteúdo completo da mesma.
<script type="text/javascript">
$(function() {
$('#accordion > li').hover(
function () {
var $this = $(this);
$this.stop().animate({'width':'480px'},500);
$('.heading',$this).stop(true,true).fadeOut();
$('.bgDescription',$this).stop(true,true).slideDown(500);
$('.description',$this).stop(true,true).fadeIn();
},
function () {
var $this = $(this);
$this.stop().animate({'width':'115px'},1000);
$('.heading',$this).stop(true,true).fadeIn();
$('.description',$this).stop(true,true).fadeOut(500);
$('.bgDescription',$this).stop(true,true).slideUp(700);
}
);
});
</script>
Espero que este tutorial tenha sido útil para você. Caso tenha alguma sugestão, adicione um comentário a este post.
Até a próxima dica!
Tweetar

» PHP - Gerando QR Code com Google Charts API
» Tradução de textos utilizando a API do Google
» Tutoriais de menus com JQuery & CSS







Douglas, em 06/09/2010 @ 15:01
queria saber se você sabe a função para ativar os menus somente com o clique ( e não ao passar o mouse ) e quando clicar em outro menu ou clicar novamente no mesmo, voltar ao normal (reduzido)….Obrigado
Bruno Wiltemburg, em 08/09/2010 @ 14:47
Ola Douglas,
Para ativar o efeito no clique do mouse e fechar os demais que estejam abertos, deve fazer assim:
Marcelo Diniz, em 27/10/2010 @ 14:26
Olá, parabéns, vou pela tuto e gostaria de saber o seguinte, se é possivel um deles, o primeiro por exemplo já vir aberto e quando passar o mouse por cima de um outro não crescer mais aquele pouquinho, manter a largura?
Obrigado
eduardo, em 22/11/2010 @ 15:29
Bruno, excelente tuto, simples direto e objetivo. Como ficaria o seu exemplo para o menu ficar de forma vertical ?
obrigado
eduardo
Edwin, em 16/02/2011 @ 10:22
Muito bom o script…
Parabéns.
Clarisse Machado Soares, em 25/03/2011 @ 18:56
Bruno,
Adorei o tutorial!
Quero usar este accordion , mas que ele abra 1 das abas ao carregar as páginas tem como?
E muito obrigado por auxiliar o pessoal e a mim com esse maravilhoso tutorial.
Rogério, em 03/05/2011 @ 20:10
Muito bom seu tutorial… ta me ajudando a entender jquery.
Como faria para desativar o click na div que já esta aberta?
Abs
Cayo Medeiros (yogodoshi), em 09/06/2011 @ 16:23
Excelente tutorial cara, parabens!
Rafael Trabasso, em 21/07/2011 @ 16:44
Parabéns, o efeito é bem legal e o código bem limpo.
Gostei do visual do blog também.
Diego, em 24/08/2011 @ 08:43
Olá Bruno,
Por favor kra. Você é o unico que pode me salvar.
Gostei muito do seu tutorial desse menu e resolvi colocar num site que estou fazendo. Aí resolvi colocar pra ser ativado num click.
Como eu faço pra junto desse click ativar uma página?
Fico no aguardo, obrigado
Bruno Wiltemburg, em 24/08/2011 @ 09:22
Ola Diego,
Para que ele siga um link, pode-se fazer o seguinte:
Adicione o link correto dentro de uma tag <a>. Por ex:
<a href="http://brunoew.com.br/blog">Veja mais</a>Esta tag deve estar dentro da tag <li>Depois adicione um handler para o click no accordion:
// Esta função deve estar junto com as demais funções javascript (sendo executada após o carregamento da página).$('#accordion > li').click(function(){
var link = $(this).find("a").attr("href");
window.location = link;
return false;
});
Diego, em 24/08/2011 @ 11:22
Ótimo Bruno.
Só que não te especifiquei, erro meu, desculpa.
Eu já troquei pra click então quando eu coloco essa função que vc passou agora ele nem chega a dar o slide. Ja vai pro link direto da aba.
Tem como abrir o slide e depois que clicar em cima dele aberto ir pra página?
Bruno Wiltemburg, em 24/08/2011 @ 12:04
Sim Diego, é possível…
Faça o seguinte, nesta mesma função que lhe passei (pelo handler de click do slide):
Diego, em 24/08/2011 @ 12:18
Ficou assim:
Não percebi mudança. Está correto o script?
$(function() {
$(‘#menu > li’).click( //Agora o listener fica no click do elemento
function () {
$this = $(“.ativo”); //Aqui relaciona à variavel $this o elemento que está ativo (se houver) e fecha quem estava ativo
$this.stop().animate({‘width’:’140px’},600);
$(‘.heading’,$this).stop(true,true).fadeIn();
$(‘.description’,$this).stop(true,true).fadeOut(500);
$(‘.bgDescription’,$this).stop(true,true).slideUp(700);
//Anima a abertura do slider
var $this = $(this);
$this.stop().animate({‘width’:’697px’},800);
$(this).addClass(“ativo”); //Adiciona a classe ativo para marcar qual elemento está aberto
$(‘.heading’,$this).stop(true,true).fadeOut();
$(‘.bgDescription’,$this).stop(true,true).slideDown(700);
$(‘.description’,$this).stop(true,true).fadeIn();
});
$(‘#menu > li’).click(
function(){
var link = $(this).find(“a”).attr(“href”);
$(“.linkAtivo”).removeClass(“linkAtivo”);
if($(this).hasClass(“linkAtivo”))
window.location = link;
else
$(this).addClass(“linkAtivo”);
return false;
});
})
Bruno Wiltemburg, em 24/08/2011 @ 14:15
Ola Diego,
Segue o código completo para tal finalidade:
Diego, em 25/08/2011 @ 00:33
Aeeeeeee… Show de bola Bruno.
Parabéns velho. É difícil ver hoje alguém assim disposto a ajudar, ainda mais com vontade de que todos aprendam MESMO. Continue sempre assim, vc tem um novo fã. Sucesso!
Bruno Wiltemburg, em 25/08/2011 @ 08:22
Obrigado Diego!
Daniel Malakias, em 29/08/2011 @ 11:55
Olá Bruno. O meu problema é o seguinte. Estou trabalhando com um slideshow, que tem a seguinte montagem:
[code]
function slideSwitch() {
var $active = $('#slideshow IMG.active');
if ( $active.length == 0 ) $active = $('#slideshow IMG:last');
var $next = $active.next().length ? $active.next()
: $('#slideshow IMG:first');
$active.addClass('last-active');
$next.css({opacity: 0.0})
.addClass('active')
.animate({opacity: 1.0}, 1000, function() {
$active.removeClass('active last-active');
});
}
[/code]
Para chamar as paginas, eu estou usando ajax, para não dar refresh na pagina inteira, então no link eu chamo esta função
[code]
if(dateText2 == "transzella"){
$('#reload').fadeOut(500);
$('#reload').load("interna_transzella.php");
$('#reload').fadeIn(500);
setInterval("slideSwitch()",5000);
}
[/code]
Da primeira vez o slideshow funciona perfeitamente, porém, a partir do segundo click, começa a dar erro, e as imagens ficam “encavaladas”.
Como posso tentar resolver este problema??
Giovanna, em 31/08/2011 @ 10:56
Oi Bruno no seu tutorial (http://www.brunoew.com.br/blog/efeito-accordion-na-horizontal-com-jquery-css3/#more-16) vc colocou as imagens de fundo atraves de background do css,
mais se eu fosse fazer uma aplicação com o banco de dados exibindo todos as imagens
nao iria ter como definir no css mais imagens.
se eu colocar as imagens na div
COLOCAR A IMG
Seria o mesmo efeito ?
pq no php quando vc da o loop nao teria como add as imagens no css fazendo esse jeito
de
[code]
ul.accordion li.bg1{ background-image:url(../images/1.jpg);}
ul.accordion li.bg2{ background-image:url(../images/2.jpg);}
ul.accordion li.bg3{ background-image:url(../images/3.jpg);}
ul.accordion li.bg4{background-image:url(../images/4.jpg);}
[/code]
so iria ter as imagens padrao no css ou não?
Aguardo a resposta
Cezar Luiz, em 04/09/2011 @ 02:11
Oi, qual a diferença de usar .stop() ou .stop(true, true) ?
Bruno Wiltemburg, em 04/09/2011 @ 09:45
Ola Cezar.
Este método .stop recebe dois parâmetros opcionais, que são eles:
clearQueue: Um booleano que indica se deseja remover a animação na fila também. O padrão é false .
jumpToEnd Um booleano que indica se ao completar a animação atual imediatamente. O padrão é false .
Se o parâmetro clearQueue é fornecido com um valor true , então o resto das animações na fila são removidos e nunca executados.
Se o parâmetro jumpToEnd é fornecida com um valor de true , a animação atual pára, mas é dado ao elemento seus valores-alvo para cada propriedade CSS.
Fonte: http://api.jquery.com/stop
Rodrigo Peretta, em 15/10/2011 @ 19:26
Olá, Eu implementei o seu código em um site que estou desenvolvendo, porem não funcionou o gradiente quando algum se abre, e outra dúvida é possivel carregar o site com um aberto já ?
Obrigado
Rodrigo Peretta, em 29/10/2011 @ 01:33
Olá Bruno, tudo bem ?
Parabens pelo tutorial muito bom.
Eu gostaria de tirar uma dúvida, como faço pra quando carregar a pagina a primeira aba venha aberta ?
Obrigado desde Já
Bruno Wiltemburg, em 01/11/2011 @ 09:07
Olá Rodrigo,
Para deixar a primeira aba aberta no carregamento da página, basta criar uma função, por exemplo, que faça a animação inicial. Ex:
function ativaPrimeira() {
var $this = $("#accordion>li:last");
$this.stop().animate({'width':'480px'},500);
$('.heading',$this).stop(true,true).fadeOut();
$('.bgDescription',$this).stop(true,true).slideDown(500);
$('.description',$this).stop(true,true).fadeIn();
}
E depois que o documento for totalmente carregado “$(function(){});“, chamar esta função:
ativaPrimeira();
Abraços
Rodrigo Peretta, em 01/11/2011 @ 23:42
Olá Bruno tudo bem ?
Implementei sua resolução para carregar a pagina e vir com a primeira aba aberta, funcionou, porem gerou outro problema. Quando clico em outro por exemplo na segunda aba, ela não fecha a primeira, abre a segunda e mantem a primeira aberta.
Segue exemplo do meu Código:
$(document).ready(function ativaPrimeira() {
var $this = $(“#accordion>li:first”);
$this.stop().animate({‘width’:’480px’},0);
$(‘.heading’,$this).stop(true,true).fadeOut();
$(‘.bgDescription’,$this).stop(true,true).slideDown(0);
$(‘.description’,$this).stop(true,true).fadeIn();
});
_____________________________________________
$(‘#accordion > li’).click(
function () {
$this = $(“.ativo”);
$this.stop().animate({‘width’:’115px’},500);
$(‘.heading’,$this).stop(true,true).fadeIn();
$(‘.description’,$this).stop(true,true).fadeOut(500);
$(‘.bgDescription’,$this).stop(true,true).slideUp(700);
var $this = $(this);
$this.stop().animate({‘width’:’480px’},500);
$(this).addClass(“ativo”);
$(‘.heading’,$this).stop(true,true).fadeOut();
$(‘.bgDescription’,$this).stop(true,true).slideDown(500);
$(‘.description’,$this).stop(true,true).fadeIn();
});
_________________________________________________
Gostaria de saber uma possivel resolução
Obrigado
Jão Ricardo, em 03/12/2011 @ 13:08
Excelente artigo amigo!
Por favor, no caso de usar apenas 1 div,,, como seria o click abrir e o click fechar ?
no caso usarei como menu
Bruno Wiltemburg, em 05/12/2011 @ 19:31
Desculpe João Ricardo, mas não entendi sua dúvida, poderia ser mais específico? Envie parte de seu código para demonstrar.
Sílvia Gomes, em 20/12/2011 @ 14:13
Boa tarde, será que me podia ajudar, eu queria saber se é possível colocar um link directamente na imagem, ou seja quando a imagem abre dar para clicar e seguir para um endereço. Agradecia muito a sua ajuda.
Obrigada,
Aguardo resposta.
Ademilson, em 24/01/2012 @ 15:33
Olá Bruno,
gostei do tutorial, parabens, mas também tenho uma dúvida, quando esta na transição de um menu para outro, um desce criando um menu embaixo, como modifica isto, para não ter está transição?
Bruno Wiltemburg, em 24/01/2012 @ 15:39
Ola Ademilson,
Adiciona a propriedade do CSS overflow: hidden para a div que engloba tudo.
Abraços