CSS swap hover effect

Postado por: Pedro Rogério 11 de agosto de 2009

Vocês provavelmente já devem conhecer esse efeito, o de o usuário ao passar o mouse sobre alguma imagem na página, é mostrada a descrição da mesma, com um efeito de “swap”, esse efeito é bem interessante para ser utilizado em sites do tipo e-commerce, e para conseguir esse tipo de efeito não é muito difícil, só vamos ter algum trabalho para adequar o efeito ao Internet Explorer 6, que não interpreta corretamente o efeito :hover.

Para chegar a esse efeito, cada bloco de imagem deverá conter a seguinte marcação HTML:

<a class="show" href="#" title="Livro Ajax com jQuery"><img src="images/livro-ajax-com-jquery.jpg" alt="Livro Ajax com jQuery" /></a>
<div class="hide">
    <a href="#">Livro Ajax com jQuery</a>
    <p>Requisições Ajax com a simplicidade da jQuery</p>
</div>

Como pode ver no código acima, a miniatura da imagem fica dentro de um link com a class=”show” e depois criamos mais uma div que irá conter a descrição da imagem. Elá será revelada somente quando o usuário passar o mouse sob o thumbnail da imagem. Para que você possar manipular melhor os elementos na página, aconselho você a utilizar listas desordenadas para conter essa marcação:

<ul id="work">
    <li>
    	<a class="show" href="#" title="Livro Ajax com jQuery"><img src="images/livro-ajax-com-jquery.jpg" alt="Livro Ajax com jQuery" /></a>
    	<div class="hide">
        	<a href="#">Livro Ajax com jQuery</a>
    		<p>Requisições Ajax com a simplicidade da jQuery</p>
        </div>
    </li>

    <li>
    	<a class="show" href="#" title="Livro Ajax com jQuery"><img src="images/livro-ajax-com-jquery.jpg" alt="Livro Ajax com jQuery" /></a>
    	<div class="hide">
        	<a href="#">Livro Ajax com jQuery</a>
    		<p>Requisições Ajax com a simplicidade da jQuery</p>
        </div>
    </li>

    <li>
    	<a class="show" href="#" title="Livro Ajax com jQuery"><img src="images/livro-ajax-com-jquery.jpg" alt="Livro Ajax com jQuery" /></a>
    	<div class="hide">
        	<a href="#">Livro Ajax com jQuery</a>
    		<p>Requisições Ajax com a simplicidade da jQuery</p>
        </div>
    </li>
</ul>

Com o HTML já definido, vamos partir para o CSS:

#work {
	list-style:none;
	margin:0;
	padding:0;
}
#work li {
	float:left;
	width:235px;
	margin:10px;
	display:inline;
	padding:3px;
	background:#fff;
	border:1px solid #cad789;
	height:154px;
}
#work li a {
	border:none;
}
#work p {
	margin-bottom:0;
}

O código é bem simples, basta definir float para todos os elementos da lista, definir também uma largura e altura para o box. O básico já está pronto, agora vamos criar os efeitos:

#work li .show{
	display:block;
	width:235px;
	height:154px;
}
#work li .hide {
	color:#d4df9d;
	text-align: left;
	height: 0;
	overflow: hidden;
	background-color:#687b00;
}

Como podem ver foram utilizados height:0 e overflow:hidden na class=”hide” para garantir que ela fique invisível ao usuário e somente os elementos com a class=”show” sejam revelados ao usuário com a utilização do seguinte código:

#work li:hover .hide{
	cursor: pointer;
	height: 133px;
	padding:10px;
	width:215px;
}
#work li:hover .show {
	height: 0;
	overflow: hidden;
}

Eu uso a pseudo-classe :hover para definir algumas propriedades para a class .hide toda vez que o usuário passar o mouse sobre os elementos de lista desordenada com o id work. Depois definimos a altura do .hide para 153px e após adicionamos height:0 e overflow:hidden para o elemento .show.

Vejam agora o exemplo em funcionamento, mas ele ainda não funciona no Internet Explorer 6 e anteriores.

Solução para o IE6

Para que esse exemplo funcione corretamente no IE6 teremos que utilizar de JavaScript para que ele interprete o :hover corretamente nos elementos, basta observar o código abaixo:

<!--[if lte IE 7]>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(function() {
	$("#work li").hover(function () {
		$(this).addClass("over");
	},function () {
		$(this).removeClass("over");
});
</script>
<![endif]-->

O Script acima irá adicionar a class=”over” a cada item da lista. É aconselhável você utilizar comentários condicionais para que o código seja somente lido pelo Internet Explorer 6 e anteriores. Não podemos esquecer também de adicionar ao CSS a marcação #work li.over .hide para que ela funcione semelhante a #work li:hover .hide. Basta efetuar a seguinte alteração no CSS:

#work li:hover .hide, #work li.over .hide{
	cursor: pointer;
	height: 133px;
	padding:10px;
	width:215px;
}
#work li:hover .show, #work li.over .show  {
	height: 0;
	overflow: hidden;
}

Vejam agora o exemplo final funcional no Internet Explorer 6. Esse post foi escrito com base no post original de Min Tran.

Isso pode lhe interessar:

Categorias: CSS Tags:

Trackbacks & Pingbacks
Comentários
11 de agosto de 2009
# 1

Pedrinho!

Parabéns pelo post, como sempre mandando super bem, quero saber quando sai o seu livro rs !

Abs

Postado por Celso
11 de agosto de 2009
# 2

n entendi aki, tem um dispplay block e um display inline…assim nao esta anulando o display block? e ja declarando o float left, ja nao foi necessario para os “li” ficarem lado a lado?

#work li {
07. float:left;
08. display:block;
09. width:235px;
10. margin:10px;
11. display:inline;
12. padding:3px;
13. background:#fff;
14. border:1px solid #cad789;
15. height:154px;

Postado por Andre
11 de agosto de 2009
# 3

@Andre,

Ops, aquele display:block ficou sobrando alí, desconsidere o mesmo. Obrigado.

Postado por Pedro Rogério
11 de agosto de 2009
# 4

Nao sei pra que continuar desenvolvendo pra IE6 :P

O lance é fazer que nem o youtube e orkut, contagem regressiva e JAH ERA!

Postado por Micael
13 de agosto de 2009
# 5

Aqui no Chrome ficou estranho, hein!
1º, 2º e 4º item cortando.

Flw.

Postado por Diego Oliveira
14 de agosto de 2009
# 6

@Diego Oliveira,

Já detectei o problema e já corrigi. Obrigado.

Postado por Pedro Rogério
7 de outubro de 2009
# 7

fera gostei muito do efeito
eu to desenvolvendo um site para um amigo e usei…
no firefox funcionou muito bem… mais no i6 não consegui fazer funcionar… :S
vc pode me ajudar… primeiramente eu nao sei se coloco no html ou no css o script, ja coloquei nos dois mais nao da certo… :S
vlws parabens pelo blog muito bacana!

Postado por Jacson Ferraz
Quer comentar?

(Obrigatório)

(Obrigatório)