Czarna przezroczysta nakładka po najechaniu na obraz z tylko CSS?


101

Próbuję dodać przezroczystą czarną nakładkę do obrazu za każdym razem, gdy kursor myszy znajduje się nad obrazem za pomocą tylko CSS. czy to możliwe? Próbowałem tego:

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

Ale nie mogę wyświetlić 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;
}

czy chciałeś umieścić: najedź na element div obrazu, a nie element div nakładki?
andi

1
Tylko uwaga: dlaczego nakładasz tak wysoki indeks Z na nakładkę? Indeksy Z nie są globalne; nie ma potrzeby „hakowania” wysokiej lub niskiej wartości, aby działały.
Jimmy Breck-McKye,

1
To właśnie pomogło mi w rozwiązaniu tego problemu: jsfiddle.net/4Dfpm Nie jest wymagana nakładka div. Obraz staje się mniej przezroczysty po najechaniu kursorem, poniższy element div powinien mieć czarne tło, voila.
Kai Noack

Odpowiedzi:


211

Sugerowałbym użycie pseudoelementu zamiast elementu overlay. Ponieważ pseudoelementy nie mogą być dodawane do zamkniętych imgelementów, nadal trzeba by je opakować img.

PRZYKŁAD NA ŻYWO TUTAJ - PRZYKŁAD Z TEKSTEM

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

Jeśli chodzi o CSS, ustaw opcjonalne wymiary na .imageelemencie i ustaw go względnie. Jeśli chcesz uzyskać responsywny obraz, po prostu pomiń wymiary, a to nadal będzie działać (przykład) . Warto tylko zauważyć, że wymiary muszą znajdować się na elemencie nadrzędnym, a nie na samym imgelemencie, patrz .

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

Nadaj imgelementowi podrzędnemu szerokość elementu 100%nadrzędnego i dodaj, vertical-align:topaby naprawić domyślne problemy z wyrównaniem linii bazowej.

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

Jeśli chodzi o pseudoelement, ustaw wartość zawartości i bezwzględnie umieść ją względem .imageelementu. Szerokość / wysokość 100%zapewni, że będzie to działać przy różnych imgwymiarach. Jeśli chcesz przenieść element, ustaw krycie 0i dodaj właściwości / wartości przejścia.

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

Użyj krycia lub 1po najechaniu kursorem na pseudoelement, aby ułatwić przejście:

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

WYNIK KONIEC TUTAJ


Jeśli chcesz dodać tekst po najechaniu:

Najprostszym podejściem jest dodanie tekstu jako wartości pseudoelementu content:

PRZYKŁAD TUTAJ

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

    /* Other styling.. */
}

To powinno działać w większości przypadków; jeśli jednak masz więcej niż jeden imgelement, możesz nie chcieć, aby ten sam tekst pojawiał się po najechaniu myszą. Możesz zatem ustawić tekst w adata-* atrybucie i mieć unikalny tekst dla każdego imgelementu.

PRZYKŁAD TUTAJ

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

Z contentwartości attr(data-content), element pseudo dodaje tekst z .imageelementu data-contentatrybutu:

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

Możesz dodać stylizację i zrobić coś takiego:

PRZYKŁAD TUTAJ

W powyższym przykładzie :afterpseudoelement służy jako czarna nakładka, podczas gdy :beforepseudoelement to podpis / tekst. Ponieważ elementy są od siebie niezależne, możesz użyć oddzielnych stylizacji, aby uzyskać bardziej optymalne ustawienie.

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

1
Dzięki Josh. Najbardziej podoba mi się ta wersja. Co byś zrobił, gdybyś chciał wyświetlić jakiś biały tekst na przezroczystej czerni? Czy dodałbyś kolejny div i osobno zastosowałbyś do niego krycie?
RobVious

Tak, właściwie tylko po najechaniu.
RobVious

1
dzięki, jest to lepsze rozwiązanie niż to, które próbowałem wcześniej
wingskush

Jak ustawić podpis na środku obrazu? top:30%działa, zobacz moje skrzypce , ale dla responsywnego układu dobrze byłoby ustawić go dokładnie na środku. BTW: Dzięki za tę miłą wiadomość.
p2 lub

3
@poor Oto jedno elastyczne podejście (zaktualizowany przykład) .. używa top: 50%/ transform: translateY(-50%)do wyśrodkowania w pionie. Jest to jedno z podejść wspomnianych w tej innej odpowiedzi, jeśli moja - stackoverflow.com/questions/5703552/ ...
Josh Crozier

44

11

Byłeś blisko. To zadziała:

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

Trzeba było umieścić :hoverzdjęcie na i .overlaypokryć cały obraz, dodając right:0;ibottom:0 .

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


Sugerowałbym również użycie animacji CSS3, aby uzyskać nieco płynniejsze przejście dla zgodnych przeglądarek (użytkownicy IE będą musieli po prostu cierpieć).
Jimmy Breck-McKye,

7

Oto dobry sposób użycia: after w obrazie div zamiast dodatkowego overlay div: 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);}

2

.overlay nie ma wysokości ani szerokości ani treści i nie można na nią najeżdżać display:none .

Zamiast tego nadałem elementowi div tego samego rozmiaru i pozycji, co .imageiRGBA wartość po najechaniu kursorem.

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

1

Zobacz, co zrobiłem tutaj: http://jsfiddle.net/dyarbrough93/c8wEC/

Po pierwsze, nigdy nie ustawiałeś wymiarów nakładki, co oznacza, że ​​nie była ona wyświetlana w pierwszej kolejności. Po drugie, zalecam po prostu zmianę indeksu Z nakładki po najechaniu kursorem na obraz. Zmień krycie / kolor nakładki zgodnie ze swoimi potrzebami.

.image { position: relative; width: 200px; height: 200px;}
.image img { max-width: 100%; max-height: 100%; }
.overlay { position: absolute; top: 0; left: 0; background-color: gray; z-index: -10; width: 200px; height: 200px; opacity: 0.5}
.image:hover .overlay { z-index: 10}

1

Możesz to osiągnąć, bawiąc się kryciem obrazu i ustawiając kolor tła obrazu na czarny. Dzięki przezroczystości obrazu będzie on ciemniejszy.

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

CSS:

.image { position: relative; border: 1px solid black; width: 200px; height: 200px; background: black; }
.image img { max-width: 100%; max-height: 100%; }
.image img:hover { opacity: .5 }

Może być konieczne ustawienie przezroczystości specyficznej dla przeglądarki, aby działało to również w innych przeglądarkach.


0

Dałbym minimalną wysokość i minimalną szerokość twojemu nakładce div o rozmiarze obrazu i zmieniłem kolor tła po najechaniu kursorem

.overlay { position: absolute; top: 0; left: 0;  z-index: 200; min-height:200px; min-width:200px; background-color: none;}
.overlay:hover { background-color: red;}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.