ARTICLE AD BOX
Instead of using opacity, set a background-color with rgba, where 'a' is the level of transparency.
So instead of:
background-color: rgb(0,0,255); opacity: 0.5;use
background-color: rgba(0,0,255,0.5);11 Comments
Welcome to CSS - as far as I know there is no quicker way that is cross-browser compatible. Fortunately, once you have the code working once, you can use it across other projects. The only other option is to use jQuery's opacity function which handles a lot of this for you.
2011-04-24T12:33:41.613Z+00:00
Opacity is not actually inherited in CSS. It's a post-rendering group transform. In other words, if a <div> has opacity set you render the div and all its kids into a temporary buffer, and then composite that whole buffer into the page with the given opacity setting.
What exactly you want to do here depends on the exact rendering you're looking for, which is not clear from the question.
2 Comments
If it were inherited, they would get lighter. Try actually setting opacity: 0.7 on all the descendants to see what inheritance would look like. Like I said, what happens instead is that opacity is applied to the entire "element and all its descendants" group as a unit instead of inheriting.
2013-04-10T13:52:31.847Z+00:00
A little trick if your parent is transparent and you would like your child to be the same, but defined exclusively (e.g. to overwrite the user agent styles of a select dropdown):
.parent { background-color: rgba(0,0,0,0.5); } .child { background-color: rgba(128,128,128,0); }As others have mentioned in this and other similar threads, the best way to avoid this problem is to use RGBA/HSLA or else use a transparent PNG.
But, if you want a ridiculous solution, similar to the one linked in another answer in this thread (which is also my website), here's a brand new script I wrote that fixes this problem automatically, called thatsNotYoChild.js:
http://www.impressivewebs.com/fixing-parent-child-opacity/
Basically it uses JavaScript to remove all children from the parent div, then reposition the child elements back to where they should be without actually being children of that element anymore.
To me, this should be a last resort, but I thought it would be fun to write something that did this, if anyone wants to do this.
Opacity of child element is inherited from the parent element.
But we can use the css position property to accomplish our achievement.
The text container div can be put outside of the parent div but with absolute positioning projecting the desired effect.
Ideal Requirement------------------>>>>>>>>>>>>
HTML
<div class="container"> <div class="bar"> <div class="text">The text opacity is inherited from the parent div </div> </div> </div>CSS
.container{ position:relative; } .bar{ opacity:0.2; background-color:#000; z-index:3; position:absolute; top:0; left:0; } .text{ color:#fff; }Output:--

the Text is not visible because inheriting opacity from parent div.
Solution ------------------->>>>>>
HTML
<div class="container"> <div class="text">Opacity is not inherited from parent div "bar"</div> <div class="bar"></div> </div>CSS
.container{ position:relative; } .bar{ opacity:0.2; background-color:#000; z-index:3; position:absolute; top:0; left:0; } .text{ color:#fff; z-index:3; position:absolute; top:0; left:0; }Output :

the Text is visible with same color as of background because the div is not in the transparent div
The question didn't defined if the background is a color or an image but since @Blowski have already answered for coloured backgrounds, there's a hack for images below:
background: linear-gradient(rgba(0,0,0,.6), rgba(0,0,0,.6)), url('image.jpg');This way you can manipulate the color of your opacity and even add nice gradient effects.
I also faced the same issues, after doing some googling I found some solutions ( 3-ways ) of this problem. I am sharing the solutions here, you can try any of these.
Option-1: Use a pseudo markup element before or after as the background
.parentContainer { position: relative; } .parentContainer:before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: #fff; opacity: 0.6; } .childContent { position: relative; color: red; z-index: 1; }Option-2: Use rgba colors with alpha value instead of opacity.
<div id="parentContainer" style="background: rgba(255,255,255,0.6);"> <div id="childContent"> Content ... </div> </div>Option-3: Use background div with absolute position one element over another.
<div class="parentContainer"> <div class="childContent"> Here is the content. </div> <div class="background"></div> </div> .parentContainer { position: relative; } .childContent { position: relative; color: White; z-index: 5; } .background { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; background-color: Black; z-index: 1; opacity: .5; }There is no one size fits-all approach, but one thing that I found particularly helpful is setting opacity for a div's direct children, except for the one that you want to keep fully visible. In code:
<div class="parent"> <div class="child1"></div> <div class="child2"></div> <div class="child3"></div> <div class="child4"></div> </div>and css:
div.parent > div:not(.child1){ opacity: 0.5; }In case you have background colors/images on the parent you fix color opacity with rgba and background-image by applying alpha filters
Answers above seems to complicated for me, so I wrote this:
kb-mask-overlay it's your (opacity) parent, pop-up it's your (no opacity) children. Everything below it's rest of your site.
Below worked for me:
ChangedFrom:
opacity: 0.52; background-color: #7c7c7c;To:
opacity: 1 !important; background-color: rgba(124, 124, 124, 0.52) !important;To convert the hex & opacity to rgba,
use a website like http://hex2rgba.devoth.com/
2 Comments
It worked for me on Chrome. Opacity goes to children also. Background is only for element. So, may be, set opacity of parent to 1, and background for both parent & children. If it does not work, share a sample on codesandbox.io or like site so that others can see too, also may be raise another question you might get more answers.
2022-04-23T09:45:05.273Z+00:00
It seems that display: block elements do not inherit opacity from display: inline parents.
Maybe because it's invalid markup and the browser is secretly separating them? Because source doesn't show that happening. Am I missing something?
If you have to use an image as the transparent background, you might be able to work around it using a pseudo element:
html
<div class="wrap"> <p>I have 100% opacity</p> </div>css
.wrap, .wrap > * { position: relative; } .wrap:before { content: " "; opacity: 0.2; background: url("http://placehold.it/100x100/FF0000") repeat; position: absolute; width: 100%; height: 100%; }My answer is not about static parent-child layout, its about animations.
I was doing an svg demo today, and i needed svg to be inside div (because svg is created with parent's div width and height, to animate the path around), and this parent div needed to be invisible during svg path animation (and then this div was supposed to animate opacity from 0 to 1, it's the most important part). And because parent div with opacity: 0 was hiding my svg, i came across this hack with visibility option (child with visibility: visible can be seen inside parent with visibility: hidden):
.main.invisible .test { visibility: hidden; } .main.opacity-zero .test { opacity: 0; transition: opacity 0s !important; } .test { // parent div transition: opacity 1s; } .test-svg { // child svg visibility: visible; }And then, in js, you removing .invisible class with timeout function, adding .opacity-zero class, trigger layout with something like whatever.style.top; and removing .opacity-zero class.
var $main = $(".main"); setTimeout(function() { $main.addClass('opacity-zero').removeClass("invisible"); $(".test-svg").hide(); $main.css("top"); $main.removeClass("opacity-zero"); }, 3000);Better to check this demo http://codepen.io/suez/pen/54bbb2f09e8d7680da1af2faa29a0aef?editors=011
I solved this problem by first creating and saving a faded image which I then used in the css background. I used the following python code:
from PLI import Image bg = Image.open('im1.jpg') fg = Image.open('im2.jpg') #blend at ratio .3 Image.blend(bg,fg,.3).save('out.jpg')Here, im1.jpg was simply a white image of the same dimensions as im2.jpg.
On mac you can use Preview editor to apply opacity to a white rectangle laid over your .png image before you put it in your .css.
1) Image
Logo
2) Create a rectangle around the image
Rectanle around logo
3) Change background color to white
rectangle turned white
4) Adjust rectangle opacity
opaque image
For other people trying to make a table (or something) look focused on one row using opacity. Like @Blowski said use color not opacity. Check out this fiddle: http://jsfiddle.net/2en6o43d/
.table:hover > .row:not(:hover)Assign opacity 1.0 to the child recursively with:
div > div { opacity: 1.0 }Example:
Explore related questions
See similar questions with these tags.







