Наложение фонового изображения на цвет фона rgba
У меня есть div
с background-image
. Я хочу наложить фоновое изображение на цвет rgba (rgba(0,0,0,0.1)
), когда пользователь наводит div.
Мне было интересно, есть ли одно-div-решение (т.е. не с несколькими div, один для изображения и один для цвета и т.д.).
Я пробовал несколько вещей:
<div class="the-div" id="test-1"></div>
<div class="the-div" id="test-2"></div>
<div class="the-div" id="test-3"></div>
И этот CSS:
.the-div {
background-image: url('the-image');
margin: 10px;
width: 200px;
height: 80px;
}
#test-1:hover {
background-color: rgba(0,0,0,0.1);
}
#test-2:hover {
background: url('the-image'), rgba(0,0,0,0.1);
}
#test-3:hover {
background: rgba(0,0,0,0.1);
}
Смотрите эту скрипту.
Единственное, что я видел, это сделать другое изображение с наложением, предварительно загрузить его с помощью JavaScript, а затем использовать .the-div:hover { background: url('the-new-image'); }
. Тем не менее, я хотел бы использовать только CSS-решение (более быстрый, меньше HTTP-запросов, меньше жесткого диска). Есть ли?
Ответы
Ответ 1
Решение PeterVR имеет тот недостаток, что дополнительный цвет отображается поверх всего блока HTML, а это означает, что он также отображается поверх содержимого div, а не только поверх фонового изображения. Это нормально, если ваш div пуст, но если он не использует линейный градиент, это может быть лучшим решением:
<div class="the-div">Red text</div>
<style type="text/css">
.the-div
{
background-image: url("the-image.png");
color: #f00;
margin: 10px;
width: 200px;
height: 80px;
}
.the-div:hover
{
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1)), url("the-image.png");
background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1)), url("the-image.png");
background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1)), url("the-image.png");
background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1)), url("the-image.png");
background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.1)), to(rgba(0, 0, 0, 0.1))), url("the-image.png");
background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1)), url("the-image.png");
}
</style>
См. fiddle. Слишком плохо, что спецификации градиента в настоящий момент беспорядочны. См. таблица совместимости, код выше должен работать в любом браузере с примечательной долей на рынке - за исключением MSIE 9.0 и старше.
Изменить (март 2017): состояние Интернета стало намного менее беспорядочным. Таким образом, строки linear-gradient
(поддерживаемые Firefox и Internet Explorer) и -webkit-linear-gradient
(поддерживаемые в Chrome, Opera и Safari) достаточны, дополнительные префиксные версии больше не нужны.
Ответ 2
Да, есть способ сделать это. Вы можете использовать псевдоэлемент after
, чтобы расположить блок поверх фонового изображения. Что-то вроде этого:
http://jsfiddle.net/Pevara/N2U6B/
css для :after
выглядит следующим образом:
#the-div:hover:after {
content: ' ';
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: rgba(0,0,0,.5);
}
изменить
Если вы хотите применить это к непустому элементу и просто получить наложение на фон, вы можете сделать это, применив к элементу положительный z-index
, а отрицательный - к :after
. Что-то вроде этого:
#the-div {
...
z-index: 1;
}
#the-div:hover:after {
...
z-index: -1;
}
И обновленная скрипка: http://jsfiddle.net/N2U6B/255/
Ответ 3
/* Working method */
.tinted-image {
background:
/* top, transparent red, faked with gradient */
linear-gradient(
rgba(255, 0, 0, 0.45),
rgba(255, 0, 0, 0.45)
),
/* bottom, image */
url(https://upload.wikimedia.org/wikipedia/commons/7/73/Lion_waiting_in_Namibia.jpg);
height: 1280px;
width: 960px;
background-size: cover;
}
.tinted-image p {
color: #fff;
padding: 100px;
}
<div class="tinted-image">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laboriosam distinctio, temporibus tempora a eveniet quas qui veritatis sunt perferendis harum!</p>
</div>
Ответ 4
В идеале свойство фона позволит нам накладывать различные фоны, похожие на слоирование фонового изображения, подробно описанные в http://www.css3.info/preview/multiple-backgrounds/. К сожалению, по крайней мере, в Chrome (40.0.2214.115) добавление фона rgba вместе с фоном изображения url(), похоже, нарушает свойство.
Решение, которое я нашел, - это визуализировать слой rgba как 1px * 1px Base64-кодированное изображение и встроить его.
.the-div:hover {
background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgkAQAABwAGkn5GOoAAAAASUVORK5CYII=), url("the-image.png");
}
для изображений с кодировкой base64 1 * 1 пиксель Я использовал http://px64.net/
Вот ваш jsfiddle с этими изменениями. http://jsfiddle.net/325Ft/49/ (я также поменял образ на тот, который все еще существует в Интернете)
Ответ 5
У меня есть следующее:
html {
background:
linear-gradient(rgba(0,184,255,0.45),rgba(0,184,255,0.45)),
url('bgimage.jpg') no-repeat center center fixed;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
}
Вышеприведенное будет иметь красивый непрозрачный синий оверлей.