Reputation: 986
EDIT: Changed title to actually be correct
I'm trying to simulate a modal popup in all HTML and CSS and am having a bit of bad luck with one single element of what I'm doing. I want the innermost div, the one with the content, to not be opaque like the border is, but no matter what I try with the CSS I cannot get it to work. Here's the code:
The CSS
.modalBackground {
background-color:Gray;
filter:alpha(opacity=70);
opacity:0.7;
}
The HTML
<table style="height: 100%; width: 100%; position: fixed; top: 0; left: 0;"><tr><td class="modalBackground">
<div style="display: table; height: 40px; width: 150px; position: fixed; overflow: hidden;
top: 40%; margin-top: -50px; left: 50%; margin-left: -75px; padding-left: 30px;
border: solid 1px navy; background-color: White;">
<div style="#position: absolute; #top: 50%; display: table-cell; vertical-align: middle;">
<div style="#position: relative; #top: -50%;"
><asp:Image runat="server" ImageUrl= "~/images/indicators/indicatordark.gif" /> working...</div>
</div>
</div></td></tr></table>
I am reaching my witt's end on this. I'm no HTML or CSS guru by any means, so an explanation of why the solution works would be greatly appreciated.
Upvotes: 29
Views: 94132
Reputation:
The best way to do this now is to use rGBA colors. It won't work for older browsers, but you can let the design gracefully degrade by just feeding them a solid color. Example:
.parent {
background: gray; /* older browsers */
background: rgba(128,128,128,0.7); /* newer browsers */
}
.child {
background: blue;
}
It is annoying, but CSS doesn't allow that. Setting opacity for one element means no child element can have any greater opacity. (100% of 25% opacity is? Right.)
So, one solution is to use a tiny transparent PNG as a repeating background image to work around that. The only issue there is IE6, and there's an excellent workaround called supersleight.
(Updated. Think supersleight will work for you.)
Update Here's a very simple test case. Create the image (say, a PNG with 50% black fill) and then create this file--save them in the same folder. If you don't see a thin box with a transparent background behind 'stuff', then you're either not saving the file correctly or have saved the image somewhere else.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<style type="text/css">
body { background:white; }
#overlay { background-image:url(test.png); }
</style>
</head>
<body>
<div id="overlay">stuff</div>
</body>
</html>
Upvotes: 33
Reputation: 305
Setting the color of the parent div with opacity with a rgba-color would make more sense here, because in this case the child element wouldnt inherit the opacity and wont be transparent!
so instead of using background-color: gray or #something, use something like this:
.modalBackground {
background-color: rgba(222, 222, 222, 0.7);
}
Like this the parent-element has an opacity of 0.7 but is does not inherit it to any div or image or whatever inside of this div!
There are many rgba-generators out there on the net, try them.
http://www.css3-generator.de/rgba.html
Upvotes: 4
Reputation: 151
The way that I was able to put a transparent div behind an opaque div was to use something like:
`div.transparent-behind { opacity: 0.4;
z-index: -1; }
div.opaque-ontop { position: absolute;
top: (wherever you need it to fit)px;
left: (some # of)px}'
where the div's were not nested inside each other, but one right after another in the html
make sense?
Upvotes: 1
Reputation: 71
How about using visibility?
#parentDiv {
visibility: hidden;
}
#childDiv {
visibility: visible;
}
Upvotes: 2
Reputation: 41
A PNG would provide better compatibility (you have to use a filter: statement for IE6) ,but the better CSS3 method is just to use RGBA colours (e.g. background: rgba(0,0,0,0.5); will get you black at 50% alpha), that gets rid of any inherited opacity.
Upvotes: 1
Reputation: 3087
Try this
<div class="" id="" style=" background: none repeat-x scroll 4px 3px lightgoldenrodyellow; left: 450px; width:470px; text-align:center; height: 45px; position: fixed;
opacity:0.90;
filter:alpha(opacity=40);
z-index: 1000; ">
</div>
Upvotes: 0
Reputation: 388
You can also do this without using a transparent image. Create two separate divs and use z-index to control which one is on top
Upvotes: 15