I have a div
with a background-image
. I want to overlay the background-image with an rgba color (rgba(0,0,0,0.1)
) when the user hovers the div.
I was wondering if there's a one-div solution (i.e. not with multiple divs, one for the image and one for the color, etc.).
I tried multiple things:
<div class="the-div" id="test-1"></div>
<div class="the-div" id="test-2"></div>
<div class="the-div" id="test-3"></div>
And this 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);
}
See this fiddle.
The only option I saw is to make another image, with overlay, preload it using JavaScript and then use .the-div:hover { background: url('the-new-image'); }
. However, I'd like a CSS-only solution (neater; less HTTP requests; less harddisk). Is there any?
This question is related to
css
background
background-image
rgba
Ideally the background property would allow us to layer various backgrounds similar to the background image layering detailed at http://www.css3.info/preview/multiple-backgrounds/. Unfortunately, at least in Chrome (40.0.2214.115), adding an rgba background alongside a url() image background seems to break the property.
The solution I've found is to render the rgba layer as a 1px*1px Base64 encoded image and inline it.
.the-div:hover {
background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgkAQAABwAGkn5GOoAAAAASUVORK5CYII=), url("the-image.png");
}
for base64 encoded 1*1 pixel images I used http://px64.net/
Here is your jsfiddle with these changes made. http://jsfiddle.net/325Ft/49/ (I also swapped the image to one that still exists on the internet)
Yes, there is a way to do this. You could use a pseudo-element after
to position a block on top of your background image. Something like this:
http://jsfiddle.net/Pevara/N2U6B/
The css for the :after
looks like this:
#the-div:hover:after {
content: ' ';
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: rgba(0,0,0,.5);
}
edit:
When you want to apply this to a non-empty element, and just get the overlay on the background, you can do so by applying a positive z-index
to the element, and a negative one to the :after
. Something like this:
#the-div {
...
z-index: 1;
}
#the-div:hover:after {
...
z-index: -1;
}
And the updated fiddle: http://jsfiddle.net/N2U6B/255/
/* Working method */_x000D_
.tinted-image {_x000D_
background: _x000D_
/* top, transparent red, faked with gradient */ _x000D_
linear-gradient(_x000D_
rgba(255, 0, 0, 0.45), _x000D_
rgba(255, 0, 0, 0.45)_x000D_
),_x000D_
/* bottom, image */_x000D_
url(https://upload.wikimedia.org/wikipedia/commons/7/73/Lion_waiting_in_Namibia.jpg);_x000D_
height: 1280px;_x000D_
width: 960px;_x000D_
background-size: cover;_x000D_
}_x000D_
_x000D_
.tinted-image p {_x000D_
color: #fff;_x000D_
padding: 100px;_x000D_
}
_x000D_
<div class="tinted-image">_x000D_
_x000D_
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laboriosam distinctio, temporibus tempora a eveniet quas qui veritatis sunt perferendis harum!</p>_x000D_
_x000D_
</div>
_x000D_
source: https://css-tricks.com/tinted-images-multiple-backgrounds/
I've gotten the following to work:
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;
}
The above will produce a nice opaque blue overlay.
Source: Stackoverflow.com