12 Stimmen

Gibt es eine Möglichkeit, die Deckkraft auf absolut positionierte untergeordnete Elemente in IE8 anzuwenden

Wenn ein Html-Element in den meisten Browsern nur teilweise undurchsichtig ist, "erben" seine Kinder diese Undurchsichtigkeit. (Es ist nicht ganz Vererbung - richtiger ist, dass das gesamte Bild zusammengesetzt wird, einschließlich des Elternteils und seiner Kinder rekursiv, und dann wird die Deckkraft auf das Ganze angewendet).

Im IE8 (und ich würde annehmen, auch für frühere Versionen von IE), ist dies nicht immer, was mit Opazität passiert. Wenn die untergeordneten Elemente position:static haben (der Standard, wenn keine Position angegeben ist), dann funktioniert es wie oben beschrieben. Wenn die Position jedoch auf etwas anderes gesetzt ist (z. B. absolut oder relativ), dann ist das untergeordnete Element vollständig undurchsichtig.

Ich möchte wissen, wie ich die Deckkraft sowohl für das übergeordnete als auch für das untergeordnete Element korrekt einstellen kann, ohne das untergeordnete Element mit position:absolute zu verändern;

Hier ist ein Beispiel für das Problem. Der folgende Code soll einen durchscheinenden grauen Kasten mit einer durchscheinenden blauen Umgebung über einem vertikalen roten Balken erzeugen. Bei Firefox, Chrome usw. ist dies tatsächlich zu sehen. Im IE8 ist der blaue Kasten korrekt durchscheinend, aber der graue Teil ist undurchsichtig.

<!doctype html>
<html>
  <head>
    <style>
      div.parentElem
      {
        background-color:#0000ff;
        position: absolute;
        left:75px;
        top:75px;
        width:300px;
        height:225px;        
        opacity:0.5;
        filter:alpha(opacity=50);
      }
      div.childElem
      {
        background-color:#808080;
        position: absolute;
        left: 10px;
        right: 10px;
        top: 10px;
        bottom: 10px;
      }
      div.redBar
      {
        position: absolute;
        left:150px;
        top:50px;
        height:350px;
        width:25px;
        background-color: #ff0000;        
      }
    </style>
  </head>
  <body>
    <div class="redBar"></div>
    <div class="parentElem">
      <div class="childElem"></div>
    </div>
  </body>
</html>

Natürlich ist dies nur ein Beispiel - ich hätte auch ein einzelnes div mit blauem Rand und grauem Hintergrund verwenden können, um den gewünschten Effekt zu erzielen. Im realen Szenario bin ich Schichtung mehrere verschiedene divs, von denen jeder ein png Hintergrundbild dynamisch ein Bild zu bauen hat.

Mein erster Lösungsversuch bestand darin, die Deckkraft sowohl auf das übergeordnete Element als auch auf das untergeordnete Element anzuwenden, indem ich entweder den Filter des untergeordneten Elements auf alpha(opacity=50) setzte oder einfach filter:inherit; einstellte. Dies führt jedoch nicht zum gewünschten Ergebnis, da es ein durchscheinendes blaues Rechteck mit einem durchscheinenden grauen Rechteck darüber erzeugt. Der leere Raum in der Mitte ist schließlich durchscheinend blau-grau, während er eigentlich durchscheinend grau sein sollte. Ebenso funktioniert es nicht, die Elemente zu Geschwistern zu machen. Jede Lösung muss die beiden Bilder zusammensetzen, bevor eine Transparenz auf irgendetwas angewendet wird.

Bei meiner Recherche habe ich einige Vorschläge gefunden, dass die Anwendung von zoom:1; oder float:none; auf das innere Element das Problem lösen könnte, aber beides hat bei mir nicht funktioniert.

Mein letzter Ausweg war, dem Kindelement position:static zu geben. Es ist eine ziemlich hässliche Lösung, aber was ich tun würde, um es auf das obige Beispiel anzuwenden, ist den Stil des Kind-Elements zu ändern, um wie aussehen:

  div.childElem
  {
    background-color:#808080;
    position:static;
    margin-left:10px; 
    margin-right:10px;
    height:205px;
    margin-top:10px;
  }

Das ist eine ziemlich unschöne Lösung, denn das bedeutet, dass ich die Höhe des Objekts kennen muss. Außerdem muss ich in einem realen Fall, in dem ich mehrere verschiedene png's zusammenstelle und möchte, dass sie logische Geschwister sind, sie alle in eine verschachtelte Eltern-Kind-Enkel-Beziehung usw. setzen. Das hindert mich auch daran, Textelemente hinzuzufügen, außer ganz oben auf dem Stapel (dem innersten div), ohne die Positionierung durcheinander zu bringen. Es funktioniert aber, und es sieht in allen Browsern gleich aus.

Gibt es eine Möglichkeit, eine solche schreckliche Umgehung zu vermeiden und haben Deckkraft korrekt auf die untergeordneten Elemente, ohne dass die Position statisch? Danke!

7voto

gibbitz Punkte 71

1voto

squidbe Punkte 1003

Geben Sie für div.childElem neben der Höhe auch die Breite an. In Ihrem Fall:

width:280px;

Wahrscheinlich hat das mit dem guten alten hasLayout zu tun.

0voto

MatTheCat Punkte 17296

Denn nur der IE versteht filter Regel können Sie es auf Kinder Elemente verwenden, wenn Sie wissen, dass sie positioniert sind... Ich habe keine "richtige" Lösung gefunden =/

0voto

mikepr Punkte 665

Ich konnte eine Möglichkeit finden, die Deckkraft korrekt auf absolut positionierte Kinder anzuwenden. Wenn ich der Seite keinen Doctype gebe, wird die Deckkraft korrekt angewendet. Realistisch gesehen, weil dies den Browser in den Quirks-Modus zwingt, ist es in der Regel nicht eine praktikable Lösung.

0voto

YakkoWarner Punkte 71

Eine kleine Korrektur zu Ihrer Frage. Dieses merkwürdige Verhalten tritt auf nur im IE8. Sowohl IE7 als auch IE9 zeigen das erwartete Verhalten (wobei untergeordnete Elemente zunächst über das übergeordnete Element gelegt werden und dann der Filter auf die gesamte zusammengesetzte Gruppe angewendet wird). Der IE8 funktioniert auch nicht, wenn das übergeordnete Element position:relative ist (und wenn die untergeordneten Elemente entweder absolut oder relativ sind).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X