Suggerirei di utilizzare uno pseudo elemento al posto dell'elemento di sovrapposizione. Poiché non è possibile aggiungere pseudo elementi su imgelementi racchiusi , è comunque necessario avvolgere l' imgelemento.
ESEMPIO IN DIRETTA QUI - ESEMPIO CON TESTO
<div class="image">
<img src="http://i.stack.imgur.com/Sjsbh.jpg" alt="" />
</div>
Per quanto riguarda il CSS, impostare dimensioni opzionali sul .imageelemento, e relativamente posizionarlo. Se stai mirando a un'immagine reattiva, ometti le dimensioni e questo funzionerà comunque (esempio) . Vale solo la pena notare che le dimensioni devono essere sull'elemento genitore anziché imgsull'elemento stesso, vedi .
.image {
position: relative;
width: 400px;
height: 400px;
}
Assegna imgall'elemento figlio una larghezza pari a quella 100%del genitore e aggiungi vertical-align:topper correggere i problemi di allineamento della linea di base predefinita.
.image img {
width: 100%;
vertical-align: top;
}
Per quanto riguarda lo pseudo elemento, impostare un valore di contenuto e posizionarlo in modo assoluto rispetto .imageall'elemento. Una larghezza / altezza di 100%garantirà che funzioni con imgdimensioni variabili . Se si desidera eseguire la transizione dell'elemento, impostare un'opacità 0e aggiungere le proprietà / valori di transizione.
.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;
}
Utilizzare un'opacità di 1quando si passa con il mouse sopra lo pseudo elemento per facilitare la transizione:
.image:hover:after {
opacity: 1;
}
RISULTATO FINALE QUI
Se desideri aggiungere del testo al passaggio del mouse:
Per l'approccio più semplice, aggiungi semplicemente il testo come valore dello pseudo elemento content:
ESEMPIO QUI
.image:after {
content: 'Here is some text..';
color: #fff;
/* Other styling.. */
}
Che dovrebbe funzionare nella maggior parte dei casi; tuttavia, se hai più di un imgelemento, potresti non volere che lo stesso testo appaia al passaggio del mouse. È quindi possibile impostare il testo in un data-*attributo e quindi avere un testo univoco per ogni imgelemento.
ESEMPIO QUI
.image:after {
content: attr(data-content);
color: #fff;
}
Con un contentvalore di attr(data-content), lo pseudo elemento aggiunge il testo dall'attributo .imagedell'elemento data-content:
<div data-content="Text added on hover" class="image">
<img src="http://i.stack.imgur.com/Sjsbh.jpg" alt="" />
</div>
Puoi aggiungere un po 'di stile e fare qualcosa del genere:
ESEMPIO QUI
Nell'esempio precedente, lo :afterpseudo elemento funge da sovrapposizione nera, mentre lo :beforepseudo elemento è la didascalia / testo. Poiché gli elementi sono indipendenti l'uno dall'altro, è possibile utilizzare stili separati per un posizionamento più ottimale.
.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;
}