113 votes

Superposition transparente noire au survol d'une image avec seulement CSS ?

J'essaie d'ajouter une superposition noire transparente à une image lorsque la souris passe au-dessus de l'image, uniquement avec CSS. Cela est-il possible ? J'ai essayé ceci :

http://jsfiddle.net/Zf5am/565/

Mais je n'arrive pas à faire apparaître le div.

<div class="image">
    <img src="http://www.newyorker.com/online/blogs/photobooth/NASAEarth-01.jpg" alt="" />
    <div class="overlay" />
</div> 

.image {
  position: relative;
  border: 1px solid black;
  width: 200px;
  height: 200px;
}
.image img {
  max-width: 100%;
  max-height: 100%;
}
.overlay {
  position: absolute;
  top: 0;
  left: 0;
  display: none;
  background-color: red;
  z-index: 200;
}
.overlay:hover {
  display: block;
}

236voto

Josh Crozier Points 30040

Je suggère d'utiliser un pseudo-élément à la place de l'élément de recouvrement. En effet, les pseudo-éléments ne peuvent pas être ajoutés aux éléments fermés. img vous devrez toujours envelopper l'élément img élément, cependant.

EXEMPLE CONCRET ICI -- EXEMPLE AVEC TEXTE

<div class="image">
    <img src="http://i.stack.imgur.com/Sjsbh.jpg" alt="" />
</div>

Comme pour le CSS, définissez dimensions optionnelles sur le .image et le positionner de manière relative. Si vous souhaitez obtenir une image réactive, il suffit d'omettre les dimensions et cela fonctionnera toujours. (exemple) . Il convient simplement de noter que les dimensions doivent se trouver sur l'élément parent, et non sur l'élément d'origine. img l'élément lui-même, voir .

.image {
    position: relative;
    width: 400px;
    height: 400px;
}

Donnez à l'enfant img un élément d'une largeur de 100% du parent et ajoutez vertical-align:top pour corriger les problèmes d'alignement de la ligne de base par défaut.

.image img {
    width: 100%;
    vertical-align: top;
}

Comme pour le pseudo-élément, définissez une valeur de contenu et positionnez-le de manière absolue par rapport à l'élément .image élément. Une largeur/hauteur de 100% veillera à ce que cela fonctionne avec des img dimensions. Si vous voulez faire une transition de l'élément, définissez une opacité de 0 et ajoutez les propriétés/valeurs de transition.

.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;
}

Utilisez une opacité de 1 lors du survol du pseudo-élément afin de faciliter la transition :

.image:hover:after {
    opacity: 1;
}

RÉSULTAT FINAL ICI


Si vous voulez ajouter du texte au survol :

Pour l'approche la plus simple, il suffit d'ajouter le texte comme élément du pseudo-élément. content valeur :

EXEMPLE ICI

.image:after {
    content: 'Here is some text..';
    color: #fff;

    /* Other styling.. */
}

Ce devrait fonctionnent dans la plupart des cas ; toutefois, si vous avez plusieurs img vous ne souhaitez peut-être pas que le même texte apparaisse au survol. Vous pourriez donc définir le texte dans un data-* et donc avoir un texte unique pour chaque img élément.

EXEMPLE ICI

.image:after {
    content: attr(data-content);
    color: #fff;
}

Avec un content valeur de attr(data-content) le pseudo-élément ajoute le texte de l'élément .image de l'élément data-content attribut :

<div data-content="Text added on hover" class="image">
    <img src="http://i.stack.imgur.com/Sjsbh.jpg" alt="" />
</div>

Vous pouvez ajouter un peu de style et faire quelque chose comme ça :

EXEMPLE ICI

Dans l'exemple ci-dessus, le :after sert de superposition noire, tandis que le pseudo-élément :before Le pseudo-élément est la légende/le texte. Comme les éléments sont indépendants les uns des autres, vous pouvez utiliser un style distinct pour un positionnement plus optimal.

.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;
}

58voto

Hashem Qolami Points 22990

Filtre CSS3

Bien que cette fonctionnalité ne soit implémentée que dans webkit, et qu'elle ne dispose pas de compatibilité des navigateurs mais ça vaut le coup de jeter un coup d'oeil :

.image img {
    max-width: 100%;
    max-height: 100%;
    -webkit-transition: .2s all;
}

.image img:hover {
    -webkit-filter: brightness(50%);
}

Démonstration de JSFiddle

Références

Sujets similaires sur le SO

12voto

david Points 5559

Tu étais proche. Ça va marcher :

.image { position: relative; border: 1px solid black; width: 200px; height: 200px; }
.image img { max-width: 100%; max-height: 100%; }
.overlay { position: absolute; top: 0; left: 0; right:0; bottom:0; display: none; background-color: rgba(0,0,0,0.5); }
.image:hover .overlay { display: block; }

Vous deviez mettre le :hover sur l'image, et faire le .overlay couvrir l'ensemble de l'image en ajoutant right:0; y bottom:0 .

jsfiddle : http://jsfiddle.net/Zf5am/569/

7voto

andi Points 5604

Voici un bon moyen d'utiliser :after sur la division image, au lieu de la division de recouvrement supplémentaire : http://jsfiddle.net/Zf5am/576/

<div class="image">
    <img src="http://www.newyorker.com/online/blogs/photobooth/NASAEarth-01.jpg" alt="" />
</div>

.image {position:relative; border:1px solid black; width:200px; height:200px;}
.image img {max-width:100%; max-height:100%;}
.image:hover:after {content:""; position:absolute; top:0; left:0; bottom:0; right:0; background-color: rgba(0,0,0,0.3);}

2voto

Andrew Clody Points 1171

.overlay n'avait pas de hauteur ou de largeur et pas de contenu, et vous ne pouvez pas survoler display:none .

A la place, j'ai donné à la division la même taille et la même position que .image et les changements RGBA en cas de survol.

http://jsfiddle.net/Zf5am/566/

.image { position: absolute; border: 1px solid black; width: 200px; height: 200px; z-index:1;}
.image img { max-width: 100%; max-height: 100%; }
.overlay { position: absolute; top: 0; left: 0; background:rgba(255,0,0,0); z-index: 200; width:200px; height:200px; }
.overlay:hover { background:rgba(255,0,0,.7); }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X