CSS has no property that changes only a background-image layer’s opacity. Setting opacity on the element fades the entire element—including its text and controls. For a dark or colored wash, layer a translucent gradient over the image. To make the image itself translucent while keeping content opaque, put it on a separate pseudo-element or child layer.
Choose the effect you actually want
“Background image opacity” can mean two different visual results. A tint or wash puts a translucent color over the image; the image remains behind that color, and the page behind the image does not show through. Independent image opacity makes the image layer translucent, allowing the layers behind it to show through while the foreground content stays opaque.
| Method | Use it for | What changes | Trade-off |
|---|---|---|---|
| Gradient overlay | A dark wash, colored tint, or improved text contrast | A color is composited over the image | Does not reveal the page behind the image |
| Pseudo-element or child layer | Making the image itself translucent | The image layer’s opacity | Needs deliberate positioning and stacking |
background-blend-mode |
Combining backgrounds with a blend effect | The way background layers combine | Not a direct opacity percentage |
opacity on the container |
Fading the entire component | The element and all its contents | Text, links, and controls fade too |
Add a translucent overlay for a tint or dark wash
For the common case—darkening a hero photograph so white text is easier to read—place a semi-transparent gradient before the image in the background-image list:
.hero {
min-height: 24rem;
background-image:
linear-gradient(rgb(0 0 0 / 0.35), rgb(0 0 0 / 0.35)),
url("hero.jpg");
background-size: cover;
background-position: center;
background-repeat: no-repeat;
color: white;
}
The first listed background layer is painted closest to the viewer, so the gradient sits over the URL image. The 0.35 is the alpha of the black overlay color: zero is transparent and one is opaque. It is not a setting that changes the image file’s own opacity. Adjust it to suit the actual image and foreground text.
Recommended Free Tools
#1 Best Overall
- HTML CSS Design and Build Web Sites
- Comes with secure packaging
- It can be a gift option
Use a colored wash
Replace the black in both gradient stops with the color you want. For example, a blue wash can use linear-gradient(rgb(15 50 110 / 0.4), rgb(15 50 110 / 0.4)). Keeping both stops the same creates an even overlay. Use different stops when a gradient across the image is intentional.
Why a background color alone usually does not work
A background color is painted beneath the element’s background images. If the image is opaque, a translucent background-color behind it will be hidden. Use a gradient as an additional top background-image layer when you want an overlay without adding markup. A color alone can be useful when there is no image, or when the image itself has transparent areas through which the color should show.
Keep multiple background settings aligned
When a rule has multiple background images, the comma-separated values in properties such as background-size and background-position correspond to the image layers in order. A single value applies across layers; use multiple values if the gradient and image need different settings. For example, background-size: auto, cover leaves the gradient at its default size and scales the photo to cover the box. A simple solid-color gradient generally needs no special sizing.
Make the image translucent while keeping text opaque
Put the image on its own layer and apply opacity to that layer, not to the content container. A pseudo-element works well for a decorative background:
Rank #2
.hero {
position: relative;
isolation: isolate;
min-height: 24rem;
padding: 2rem;
color: white;
}
.hero::before {
content: "";
position: absolute;
inset: 0;
z-index: -1;
background: url("hero.jpg") center / cover no-repeat;
opacity: 0.35;
pointer-events: none;
}
The pseudo-element is the image layer; the heading, links, and buttons remain normal content at full opacity. The container’s position: relative gives the absolutely positioned layer a containing block. isolation: isolate creates a local stacking context to help keep the negative layer behind the content but within the component. Check the result against the page’s existing stacking and positioning rules, especially if ancestors create stacking contexts or overlap the hero.
Use a child element when it is easier to manage
If pseudo-element stacking conflicts with your layout, make the image a real child and put content in a sibling layer. This is also useful when the image layer needs its own classes or behavior:
<section class="hero">
<div class="hero__image" aria-hidden="true"></div>
<div class="hero__content">
<h1>A clear heading</h1>
<a href="/details">Read more</a>
</div>
</section>
.hero {
position: relative;
min-height: 24rem;
}
.hero__image {
position: absolute;
inset: 0;
background: url("hero.jpg") center / cover no-repeat;
opacity: 0.35;
}
.hero__content {
position: relative;
padding: 2rem;
}
Here the image and content occupy separate layers. The content is positioned above the image without inheriting its opacity. Since the background is decorative in this example, the image child is marked aria-hidden="true"; do not use that treatment for information the reader needs.
Why container opacity fades the text too
opacity applies to an element as a whole, including its rendered contents. It is not inherited in the ordinary sense, but the browser composites the element and its descendants together with the specified opacity. Consequently, this rule fades both the photo and the text inside .hero:
Rank #3
- Brand: Wiley
- Set of 2 Volumes
- A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers
.hero {
background: url("hero.jpg") center / cover no-repeat;
opacity: 0.35;
}
Use it only if the intended result is to fade the complete component. At opacity: 0 the element is fully transparent; at opacity: 1 it is fully opaque; values between them partially composite the element. For a background-only wash, use a gradient. For independent image transparency, use a distinct image layer.
Blend modes are effects, not opacity controls
background-blend-mode controls how an element’s background images blend with one another and with its background color. Its blend-mode values correspond in order to the background-image layers. Modes such as multiply and screen change the color-combination result; they do not provide a numeric image-opacity slider.
mix-blend-mode is different: it blends an element’s content with the backdrop behind it in the same stacking context. It is not a substitute for blending the element’s own background layers. Neither blend property is the simplest tool for a straightforward transparent overlay or independently translucent image.
Check contrast and meaning
- Check foreground text against the image at the places where it actually appears. A wash may improve contrast in one area while leaving another part of a changing or responsive image difficult to read.
- Do not rely on a background image alone to communicate information. Background images are not announced by screen readers; put essential information in document content or provide an equivalent text description.
- If the image is decorative, treat it as decoration. If it conveys information, ensure that information remains available independently of the CSS background.
Troubleshoot common results
The text and buttons look faded
Look for opacity on the element that contains them, or on a parent. Move the image to a pseudo-element or child layer and set opacity there. If the desired result is only a tint, remove the container opacity and use a translucent gradient over the image.
Quick wins for a faster PC:
Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Rank #4
The overlay color does not appear
If you set only background-color, an opaque background image is painted above it. Add a gradient as the first background-image layer. Also check that the gradient is not listed after the URL image: the first layer is the topmost one.
The pseudo-element covers the content or disappears
Confirm that the container establishes a positioning context and inspect the component’s stacking behavior. A local stacking context using isolation: isolate can keep a negative-z-index layer behind local content. If another stacking context or positioned element changes the result, a real child image layer and a positioned content sibling may be easier to reason about.
The layer intercepts clicks
A decorative layer should not capture pointer input. Add pointer-events: none to the pseudo-element or image child when appropriate, and confirm that the actual links and buttons remain interactive.
The effect changes the wrong part of the image
Check the layer order and the comma-separated background settings. For a solid wash, use the same gradient color at both stops; for a directional effect, ensure the gradient direction and stops match the intended area. background-position and background-size control placement and scaling, not opacity.
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Repair Windows errors before they cause bigger problems3Scan for outdated or missing drivers - takes under a minuteBest Value
Or skip the browser setup
If you need a screenshot of the finished page for a visual check, ScreenshotNeo can return one with a GET request. The example captures a page URL; it does not change your CSS or replace the need to implement the overlay in your site.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
See the ScreenshotNeo API documentation for request options. ScreenshotNeo removes cookie banners, newsletter popups, and chat widgets before capture; bot checks, blank pages, and failed loads are never billed. It also has an MCP server so AI agents can take screenshots. The free plan includes 1,000 screenshots a month with no card, and paid plans start at $5 for 3,000. Learn more at ScreenshotNeo, or sign up free.
Runnable request examples
These examples request an image of the target URL from ScreenshotNeo. Replace YOUR_API_KEY with your API key. The response format and capture options can be selected through the API’s supported parameters; see the linked documentation for the current parameter names.
cURL
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
Python
import requests
r = requests.get(
"https://api.screenshotneo.com/v1/shot",
params={"access_key": "YOUR_API_KEY", "url": "https://example.com"},
timeout=90,
)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
Node.js
const q = new URLSearchParams({
access_key: 'YOUR_API_KEY',
url: 'https://example.com'
});
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot request failed: ${res.status}`);
await require('node:fs/promises').writeFile('shot.webp', Buffer.from(await res.arrayBuffer()));
Store API keys outside source code in real applications. These requests are for capturing a URL; they are separate from the CSS rules that control the image and overlay in the rendered page.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Frequently Asked Questions
Can I change a CSS background image’s opacity without changing the image file?
Yes. Put the background on a separate pseudo-element or child layer and set opacity on that layer. A translucent gradient is another CSS-only option when a tint, rather than transparency through to the page behind, is the goal.
Does a transparent gradient make the background image itself transparent?
No. It places a translucent color over the image. Use a separate image layer when the image itself must be independently translucent.
Do I need JavaScript to add a background-image overlay?
No. CSS background layers or a separate CSS-positioned image layer are sufficient for these effects.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




