Черный прозрачный оверлей при наведении курсора изображения только с CSS?

101

Я пытаюсь добавить прозрачное черное наложение к изображению всякий раз, когда мышь наводит курсор на изображение, используя только CSS. Это возможно? Я пробовал это:

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

Но я не могу показать 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;
}
RobVious
источник
вы хотели поставить: наведите курсор на div изображения, а не на оверлейный div?
Энди
1
Просто примечание: почему вы ставите такой высокий Z-индекс на оверлей? Z-индексы не являются глобальными; нет необходимости «взламывать» высокое или низкое значение, чтобы они заработали.
Джимми Брек-Маккай,
1
Вот что наконец помогло мне решить эту проблему: jsfiddle.net/4Dfpm Нет необходимости в оверлейном div. Изображение становится менее непрозрачным при наведении курсора, div ниже должен иметь черный фон, вуаля.
Кай Ноак,

Ответы:

211

Я бы предложил использовать псевдоэлемент вместо элемента наложения. Поскольку псевдоэлементы не могут быть добавлены к закрытым imgэлементам, вам все равно потребуется обернуть imgэлемент.

ЖИВЫЙ ПРИМЕР ЗДЕСЬ - ПРИМЕР С ТЕКСТОМ

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

Что касается CSS, установить дополнительные размеры по .imageэлементу, и относительно его положения. Если вы стремитесь к адаптивному изображению, просто опустите размеры, и это все равно будет работать (пример) . Стоит просто отметить, что размеры должны быть на родительском элементе, а не на самом imgэлементе, см .

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

Присвойте дочернему imgэлементу ширину 100%родительского элемента и добавьте, vertical-align:topчтобы исправить проблемы с выравниванием базовой линии по умолчанию.

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

Что касается псевдоэлемента, установите значение содержимого и расположите его абсолютно относительно .imageэлемента. Ширина / высота 100%гарантирует, что это будет работать с различными imgразмерами. Если вы хотите переместить элемент, установите непрозрачность 0и добавьте свойства / значения перехода.

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

Используйте непрозрачность 1при наведении курсора на псевдоэлемент, чтобы облегчить переход:

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

КОНЕЧНЫЙ РЕЗУЛЬТАТ ЗДЕСЬ


Если вы хотите добавить текст при наведении:

Для простейшего подхода просто добавьте текст в качестве contentзначения псевдоэлемента:

ПРИМЕР ЗДЕСЬ

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

    /* Other styling.. */
}

Это должно работать в большинстве случаев; однако, если у вас более одного imgэлемента, вы можете не захотеть, чтобы один и тот же текст отображался при наведении курсора. Таким образом, вы можете установить текст в data-*атрибуте и, следовательно, иметь уникальный текст для каждого imgэлемента.

ПРИМЕР ЗДЕСЬ

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

При contentзначении attr(data-content)псевдоэлемент добавляет текст из атрибута .imageэлемента data-content:

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

Вы можете добавить немного стиля и сделать что-то вроде этого:

ПРИМЕР ЗДЕСЬ

В приведенном выше примере :afterпсевдоэлемент служит черным оверлеем, а :beforeпсевдоэлемент - заголовком / текстом. Поскольку элементы не зависят друг от друга, вы можете использовать отдельные стили для более оптимального размещения.

.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
Спасибо, Джош. Мне больше всего нравится эта версия. Что бы вы сделали, если бы захотели отобразить белый текст поверх этой прозрачной черноты? Не могли бы вы добавить еще один div и применить к нему прозрачность отдельно?
RobVious
Да, на самом деле только при наведении.
RobVious
1
спасибо, это лучшее решение, чем то, которое я пробовал раньше
Wingskush
Как установить подпись по центру изображения? top:30%работает, см. мою скрипку , но для адаптивного макета было бы неплохо установить его точно по центру. Кстати: Спасибо за хороший ответ.
p2or
3
@poor Вот один отзывчивый подход (обновленный пример) .. он использует top: 50%/ transform: translateY(-50%)для вертикального центрирования. Это один из подходов, упомянутых в этом другом ответе, если мой - stackoverflow.com/questions/5703552/…
Джош Крозье
44

CSS3 фильтр

Хотя эта функция реализована только в webkit и не имеет совместимости с браузерами , но стоит взглянуть на:

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

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

Демо JSFiddle

Ссылки

Похожие темы на SO

Хашем Колами
источник
1
Начиная с выпуска FF35, FF также поддерживает фильтры: jsfiddle.net/Zf5am/1766 .
Якоб ван Линген
чувак !! классное решение !!
Альваро Жоао
11

Вы были близки. Это будет работать:

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

Вам нужно было поместить :hoverизображение и сделать .overlayобложку целым изображением, добавив right:0;и bottom:0.

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

Дэвид
источник
Я бы также предложил использовать анимацию CSS3 для более плавного перехода для совместимых браузеров (пользователям IE просто придется пострадать).
Джимми Брек-Маккай
7

Вот хороший способ использования: после в div изображения вместо дополнительного оверлея 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не имеет высоты или ширины и содержимого, и вы не можете навести курсор мыши display:none.

Вместо этого я присвоил div тот же размер и положение, что .imageи RGBAзначение при наведении.

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

Посмотрите, что я сделал здесь: http://jsfiddle.net/dyarbrough93/c8wEC/

Во-первых, вы никогда не устанавливаете размеры наложения, что означает, что он вообще не отображается. Во-вторых, я рекомендую просто изменить z-index наложения при наведении курсора на изображение. Измените прозрачность / цвет наложения в соответствии с вашими потребностями.

.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

Вы можете добиться этого, поиграв с непрозрачностью изображения и установив черный цвет фона изображения. Сделав изображение прозрачным, оно будет темнее.

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

Вам может потребоваться установить непрозрачность для конкретного браузера, чтобы это работало и в других браузерах.

Сумурай8
источник
0

Я бы дал минимальную высоту и минимальную ширину вашему оверлеевому div размера изображения и изменил цвет фона при наведении

.overlay { position: absolute; top: 0; left: 0;  z-index: 200; min-height:200px; min-width:200px; background-color: none;}
.overlay:hover { background-color: red;}
Яко
источник