Создать непрозрачный div поверх прозрачного родительского элемента

EDIT: изменен заголовок, чтобы быть правильно

Я пытаюсь имитировать модальное всплывающее окно во всех HTML и CSS, и мне немного не повезло с одним элементом того, что я делаю. Я хочу, чтобы внутренний div, тот, у которого есть контент, не был непрозрачным, как граница, но независимо от того, что я пытаюсь с CSS, я не могу заставить его работать. Вот код:

CSS

.modalBackground {
    background-color:Gray;
    filter:alpha(opacity=70);
    opacity:0.7;
}

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>

я протягиваю руку мой ум на этом закончился. Я никоим образом не гуру HTML или CSS, поэтому объяснение того, почему решение работает, было бы очень признательно.

7 ответов


Обновил Ответ

лучший способ сделать это сейчас-использовать цвета rGBA. Это не будет работать для старых браузеров, но вы можете позволить дизайну изящно деградировать, просто подавая им сплошной цвет. Пример:

в CSS

.parent {
    background: gray; /* older browsers */
    background: rgba(128,128,128,0.7); /* newer browsers */
}

.child {
    background: blue;
}

Оригинальный Ответ

это is раздражает, но CSS этого не позволяет. Установка непрозрачности для одного элемента означает, что ни один дочерний элемент не может иметь большей непрозрачности. (100% от 25% непрозрачность? Право.)

Итак, одно из решений-использовать крошечный прозрачный PNG в качестве повторяющегося фонового изображения, чтобы обойти это. Единственная проблема - IE6, и есть отличный обходной путь под названием supersleight.

(Обновлено. Думаю, суперсвет сработает.)

обновление Вот очень простой пример. Создайте изображение (скажем, PNG с 50% черной заливкой), а затем создайте этот файл-сохраните их в той же папке. Если вы не видите тонкую коробку с прозрачным фоном за "материалом", тогда вы либо не сохраняете файл правильно, либо сохранили изображение где-то еще.

<!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>

вы также можете сделать это без использования прозрачных изображений. Создайте два отдельных divs и используйте z-index для управления, какой из них находится сверху

пример кода на jsfiddle


PNG обеспечит лучшую совместимость (вы должны использовать оператор filter: для IE6), но лучший способ с помощью CSS3 это просто используйте цвета RGBA (например, фон: rgba (0,0,0,0.5); получите вас черным на 50% alpha), это избавляет от любой унаследованной непрозрачности.


Как насчет использования видимости?

#parentDiv {
  visibility: hidden;
}

#childDiv {
  visibility: visible;
}

установка цвета родительского div с непрозрачностью с rgba-цветом будет иметь больше смысла здесь, потому что в этом случае дочерний элемент не унаследует непрозрачность и не будет прозрачным!

поэтому вместо использования background-color: gray или #something используйте что-то вроде этого:

.modalBackground {
  background-color: rgba(222, 222, 222, 0.7);
}

Как это родительский элемент имеет непрозрачность 0.7, но не наследует его для любого div или изображения или что-либо внутри этого div!

есть много rgba-генераторы там в сети, попробуйте их.

http://www.css3-generator.de/rgba.html


попробуй такое

<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>

способ, которым я смог поместить прозрачный div за непрозрачный div, состоял в том, чтобы использовать что-то вроде:

`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}'

где div не были вложены друг в друга, но один за другим в html

смысл?