Für eine einfache halbtransparente Hintergrundfarbe sind die oben genannten Lösungen (CSS3 oder bg images) die besten Optionen. Wenn Sie jedoch etwas Ausgefalleneres wünschen (z. B. Animation, mehrere Hintergründe usw.) oder sich nicht auf CSS3 verlassen möchten, können Sie die "Fenstertechnik" ausprobieren:
.pane, .pane > .back, .pane > .cont { display: block; }
.pane {
position: relative;
}
.pane > .back {
position: absolute;
width: 100%; height: 100%;
top: auto; bottom: auto; left: auto; right: auto;
}
.pane > .cont {
position: relative;
z-index: 10;
}
<p class="pane">
<span class="back" style="background-color: green; opacity: 0.6;"></span>
<span class="cont" style="color: white;">Hello world</span>
</p>
Die Technik funktioniert durch die Verwendung von zwei "Schichten" innerhalb des äußeren Fensterelements:
- eine (die "Rückseite"), die der Größe des Fensterelements entspricht, ohne den Fluss des Inhalts zu beeinträchtigen,
- und eine (die "cont"), die den Inhalt enthält und dazu beiträgt, die Größe des Fensters zu bestimmen.
El position: relative
auf der Scheibe ist wichtig; es sagt der hinteren Ebene, dass sie sich an die Größe der Scheibe anpassen soll. (Wenn Sie die <p>
Tag absolut sein soll, ändern Sie das Fenster von einem <p>
à un <span>
und verpacken Sie das Ganze in eine Absolut-Position <p>
Tag.)
Der Hauptvorteil dieser Technik gegenüber den oben genannten ist, dass der Bereich keine bestimmte Größe haben muss; wie oben kodiert, passt er in voller Breite (normales Blockelement-Layout) und nur so hoch wie der Inhalt. Das äußere Fensterelement kann beliebig groß sein, solange es rechteckig ist (d.h. inline-block wird funktionieren; plain-old inline wird nicht funktionieren).
Außerdem gibt es Ihnen viel Freiheit für den Hintergrund; Sie können wirklich alles in das hintere Element einfügen, ohne dass es den Fluss des Inhalts beeinträchtigt (wenn Sie mehrere Unterebenen in voller Größe haben möchten, stellen Sie einfach sicher, dass sie auch position: absolute, width/height: 100%, und top/bottom/left/right: auto haben).
Eine Variante, die die Anpassung des Hintergrunds (über oben/unten/links/rechts) und/oder das Anheften des Hintergrunds (durch Entfernen eines der Paare links/rechts oder oben/unten) ermöglicht, besteht darin, stattdessen das folgende CSS zu verwenden:
.pane > .back {
position: absolute;
width: auto; height: auto;
top: 0px; bottom: 0px; left: 0px; right: 0px;
}
Wie geschrieben, funktioniert dies in Firefox, Safari, Chrome, IE8+ und Opera, obwohl IE7 und IE6 zusätzliche CSS und Ausdrücke benötigen, IIRC, und das letzte Mal, als ich es überprüft habe, funktioniert die zweite CSS-Variante nicht in Opera.
Worauf Sie achten sollten:
- Schwebende Elemente innerhalb der Konturebene sind nicht enthalten. Sie müssen sicherstellen, dass sie geleert oder anderweitig eingeschlossen sind, sonst rutschen sie aus dem Boden heraus.
- Die Ränder werden auf das Element "pane" und die Füllung auf das Element "cont" angewendet. Verwenden Sie nicht das Gegenteil (Ränder auf dem cont-Element oder padding auf dem pane-Element), sonst werden Sie feststellen, dass die Seite immer etwas breiter als das Browserfenster ist.
- Wie bereits erwähnt, muss das Ganze als Block oder Inline-Block ausgeführt werden. Sie können gerne
<div>
s anstelle von <span>
s, um Ihr CSS zu vereinfachen.
Eine ausführlichere Demo, die die Flexibilität dieser Technik in Verbindung mit display: inline-block
und mit beiden auto
& spezifisch width
s/ min-height
s:
.pane, .pane > .back, .pane > .cont { display: block; }
.pane {
position: relative;
width: 175px; min-height: 100px;
margin: 8px;
}
.pane > .back {
position: absolute; z-index: 1;
width: auto; height: auto;
top: 8px; bottom: 8px; left: 8px; right: 8px;
}
.pane > .cont {
position: relative; z-index: 10;
}
.debug_red { background: rgba(255, 0, 0, 0.5); border: 1px solid rgba(255, 0, 0, 0.75); }
.debug_green { background: rgba(0, 255, 0, 0.5); border: 1px solid rgba(0, 255, 0, 0.75); }
.debug_blue { background: rgba(0, 0, 255, 0.5); border: 1px solid rgba(0, 0, 255, 0.75); }
<p class="pane debug_blue" style="float: left;">
<span class="back debug_green"></span>
<span class="cont debug_red">
Pane content.<br/>
Pane content.
</span>
</p>
<p class="pane debug_blue" style="float: left;">
<span class="back debug_green"></span>
<span class="cont debug_red">
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.
</span>
</p>
<p class="pane debug_blue" style="float: left; display: inline-block; width: auto;">
<span class="back debug_green"></span>
<span class="cont debug_red">
Pane content.<br/>
Pane content.
</span>
</p>
<p class="pane debug_blue" style="float: left; display: inline-block; width: auto; min-height: auto;">
<span class="back debug_green"></span>
<span class="cont debug_red">
Pane content.<br/>
Pane content.
</span>
</p>
Und hier ist ein Live-Demo der Technik, die in großem Umfang eingesetzt wird:
21 Stimmen
Leider nicht, CSS3 zielt darauf ab, dies mit dem neuen Farbmodul zu beheben, es würde Ihnen erlauben, einen Alpha-Wert anzugeben, wenn Sie eine Farbe angeben. w3.org/TR/css3-color
77 Stimmen
Eigentlich ist die Deckkraft der untergeordneten Elemente multipliziert durch die Deckkraft des übergeordneten Elements, nicht außer Kraft gesetzt. Wenn also zum Beispiel das
p
Die Opazität von.6
und diespan
Die Opazität von.5
dann wäre die tatsächliche Deckkraft des Textes im Bereich0.3
.0 Stimmen
Ist dieses Live-Beispiel das, was wir mit dieser Antwort erreicht haben? codepen.io/pablofiumara/pen/EIFaH
3 Stimmen
Vermutlich ja, aber da der Hintergrund durchscheinend ist, brauchen Sie den Filter/die Deckkraft nicht: codepen.io/anon/pen/ksJug
7 Stimmen
@chharvey was soll passieren, wenn ich definiere
opacity:.5
für die Eltern undopacity:2
für das untergeordnete Element?15 Stimmen
@Alexander, ich bin froh, dass Sie diese Frage gestellt haben. Mathematisch gesehen würde man vermuten, dass das Kind wieder zu einer Deckkraft von 1 zurückkehren würde,
opacity:2;
es ungültiges CSS . Der Wert deropacity
Eigenschaft muss innerhalb des umfassenden Bereichs [0,1] liegen.0 Stimmen
Können Sie
background: rgb(#, #, #,
*Gleitpunkt Zahl von 0 bis 1*);
Dadurch wird der Hintergrund undurchsichtig, wenn Sie nur eine Farbe verwenden möchten.