Eu sugiro usar um pseudoelemento no lugar do elemento de sobreposição. Como os pseudoelementos não podem ser adicionados a imgelementos incluídos , você ainda precisaria envolver o imgelemento.
EXEMPLO AO VIVO AQUI - EXEMPLO COM TEXTO
<div class="image">
<img src="http://i.stack.imgur.com/Sjsbh.jpg" alt="" />
</div>
Quanto ao CSS, defina dimensões opcionais no .imageelemento e posicione-o relativamente. Se você está visando uma imagem responsiva, apenas omita as dimensões e ainda funcionará (exemplo) . É apenas importante notar que as dimensões devem estar no elemento pai em oposição ao imgpróprio elemento, ver .
.image {
position: relative;
width: 400px;
height: 400px;
}
Dê ao imgelemento filho uma largura 100%igual a do pai e adicione vertical-align:toppara corrigir os problemas de alinhamento da linha de base padrão.
.image img {
width: 100%;
vertical-align: top;
}
Quanto ao pseudoelemento, defina um valor de conteúdo e posicione-o absolutamente em relação ao .imageelemento. Uma largura / altura de 100%garantirá que funcione com imgdimensões variadas . Se você deseja fazer a transição do elemento, defina uma opacidade de 0e adicione as propriedades / valores de transição.
.image:after {
content: '\A';
position: absolute;
width: 100%; height:100%;
top:0; left:0;
background:rgba(0,0,0,0.6);
opacity: 0;
transition: all 1s;
-webkit-transition: all 1s;
}
Use uma opacidade de 1ao passar o mouse sobre o pseudoelemento para facilitar a transição:
.image:hover:after {
opacity: 1;
}
RESULTADO FINAL AQUI
Se você deseja adicionar texto ao passar o mouse:
Para uma abordagem mais simples, basta adicionar o texto como o contentvalor do pseudoelemento :
EXEMPLO AQUI
.image:after {
content: 'Here is some text..';
color: #fff;
/* Other styling.. */
}
Isso deve funcionar na maioria dos casos; no entanto, se você tiver mais de um imgelemento, pode não querer que o mesmo texto apareça ao passar o mouse. Você poderia, portanto, definir o texto em um data-*atributo e, portanto, ter um texto exclusivo para cada imgelemento.
EXEMPLO AQUI
.image:after {
content: attr(data-content);
color: #fff;
}
Com um contentvalor de attr(data-content), o pseudoelemento adiciona o texto .imagedo data-contentatributo do elemento :
<div data-content="Text added on hover" class="image">
<img src="http://i.stack.imgur.com/Sjsbh.jpg" alt="" />
</div>
Você pode adicionar algum estilo e fazer algo assim:
EXEMPLO AQUI
No exemplo acima, o :afterpseudo elemento serve como a sobreposição preta, enquanto o :beforepseudo elemento é a legenda / texto. Como os elementos são independentes uns dos outros, você pode usar estilos separados para um posicionamento mais otimizado.
.image:after, .image:before {
position: absolute;
opacity: 0;
transition: all 0.5s;
-webkit-transition: all 0.5s;
}
.image:after {
content: '\A';
width: 100%; height:100%;
top: 0; left:0;
background:rgba(0,0,0,0.6);
}
.image:before {
content: attr(data-content);
width: 100%;
color: #fff;
z-index: 1;
bottom: 0;
padding: 4px 10px;
text-align: center;
background: #f00;
box-sizing: border-box;
-moz-box-sizing:border-box;
}
.image:hover:after, .image:hover:before {
opacity: 1;
}