CSS Hintergrundbild-Opazität?

79

Im Zusammenhang mit Wie gebe ich Text oder Bild mithilfe von CSS einen transparenten Hintergrund? , aber etwas anders.

Ich würde gerne wissen , ob es möglich ist, den Alpha - Wert eines Hintergrunds ändern Bildes , anstatt nur die Farbe. Natürlich kann ich das Bild nur mit verschiedenen Alpha-Werten speichern, aber ich möchte das Alpha dynamisch anpassen können.

Bisher ist das Beste, was ich habe ,:

<div style="position: relative;">
    <div style="position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px;
                      background-image: url(...); opacity: 0.5;"></div>
    <div style="position: relative; z-index: 1;">
        <!-- Rest of content here -->
    </div>
</div>

Es funktioniert, ist aber sperrig und hässlich und bringt die Dinge in komplizierteren Layouts durcheinander.

Niet the Dark Absol
quelle
1
Was steckt hinter dem Hintergrundbild? Eine Volltonfarbe oder ein anderes Bild?
Eric
@Eric: Ich beziehe mich damit nicht auf einen bestimmten Fall, ich versuche eine allgemeine Lösung für das Problem zu finden.
Niet the Dark Absol
1
@Kolink: Ich versuche mir ein Szenario vorzustellen, in dem ein Hintergrundbild ausgeblendet werden muss.
Eric
Nun, ich entwickle Online-Browsergames und es gibt ein paar Dinge, die ich in den Animationen tun möchte, die dieses Hintergrundbild mit variabler Deckkraft benötigen würden.
Niet the Dark Absol

Antworten:

16

Wenn sich der Hintergrund nicht wiederholen muss, können Sie die Sprite-Technik (Schiebetüren) verwenden, bei der Sie alle Bilder mit unterschiedlicher Deckkraft in eines (nebeneinander) einfügen und sie dann einfach mit verschieben background-position.

Sie können dasselbe teilweise transparente Hintergrundbild auch mehrmals deklarieren, wenn Ihr Zielbrowser mehrere Hintergründe unterstützt (Firefox 3.6+, Safari 1.0+, Chrome 1.3+, Opera 10.5+, Internet Explorer 9+). Die Deckkraft dieser mehreren Bilder sollte sich summieren, je mehr Hintergründe Sie definieren.

DanMan
quelle
10
Eine Einschränkung der Technik mit mehreren Hintergründen besteht darin, dass sich die Trübungen eher multiplizieren als addieren. Wenn Sie zwei Bilder mit einer Deckkraft von 50% überlagern, erhalten Sie ein Bild mit einer Deckkraft von 75%. Fügen Sie eine weitere hinzu, die Deckkraft springt auf 87,5%, eine weitere auf 93,75%. Mathematisch nähert sich die Gesamtopazität, erreicht jedoch nie 100%. In der Praxis benötigen Sie jedoch dank Rundung einen Stapel von 9, um ein Bild mit einer Deckkraft von 50% auf 100% zu bringen.
Iain Fraser
3
Für diejenigen, die mathematisch geneigt sind, erfahren Sie hier, wie sich das Hinzufügen eines weiteren halbtransparenten Bildes zu einem Stapel auf die Gesamtopazität auswirkt: stacked_opacity = current_opacity+((1-current_opacity)*single_opacity) Wenn unsere aktuelle Deckkraft also 0,25 beträgt, ergibt das Hinzufügen eines weiteren Bildes 0,4375. 0.25+((1-0.25)*0.25) = 0.4375 Das Hinzufügen eines weiteren ergibt also 0,578125; 0.4375+((1-0.4375)*0.25) = 0.578125
Iain Fraser
45

Sie können den ausgeblendeten Hintergrund mit CSS-generierten Inhalten erstellen

Demo unter http://jsfiddle.net/gaby/WktFm/508/

Html

<div class="container">
        contents
</div>

Css

.container{
    position: relative;
    z-index:1;
    overflow:hidden; /*if you want to crop the image*/
}
.container:before{
    z-index:-1;
    position:absolute;
    left:0;
    top:0;
    content: url('path/to/image.ext');
    opacity:0.4;
}

Sie können die Deckkraft jedoch nicht ändern, da wir den generierten Inhalt nicht ändern dürfen.

Sie können es zwar mit Klassen und CSS-Ereignissen bearbeiten ( aber nicht sicher, ob es Ihren Anforderungen entspricht ).

zum Beispiel

.container:hover:before{
    opacity:1;
}

AKTUALISIEREN

Sie können CSS-Übergänge verwenden, um die Deckkraft zu animieren ( erneut durch Klassen ).

Demo unter http://jsfiddle.net/gaby/WktFm/507/

Hinzufügen

-webkit-transition: opacity 1s linear;
-o-transition: opacity 1s linear;
-moz-transition: opacity 1s linear;
transition: opacity 1s linear;

Nach der .container:beforeRegel wird die Deckkraft in einer Sekunde auf 1 animiert.

Kompatibilität

  • FF 5 ( vielleicht auch 4, aber nicht installiert. )
  • IE 9 schlägt fehl ..
  • Webkit-basierte Browser schlagen fehl ( Chrome unterstützt es jetzt v26 - möglicherweise auch frühere Versionen, aber nur mit meinem aktuellen Build überprüft ), aber sie sind sich dessen bewusst und arbeiten daran ( https://bugs.webkit.org/show_bug.cgi?id=) 23209 )

.. also unterstützt es momentan nur der neueste FF .. aber eine nette Idee, nein? :) :)

Gabriele Petrioli
quelle
1
Sieht für mich in FF5 ziemlich gut aus, gute Arbeit. Ich habe völlig vergessen, dass Pseudoelemente die urlEigenschaft haben, ich habe es versucht backgroundund konnte die Z-Index-Probleme (Inhalt unten) nicht lösen.
Wesley Murch
Antwort geschätzt, aber wenn man bedenkt, wie schlecht Firefox mit anderen Dingen abschneidet (Speicherlecks überall, schreckliche Verzögerung in JS, es ist fast so langsam wie IE6, sicherlich langsamer als IE7 ...), werde ich nach einem browserübergreifenderen suchen Lösung.
Niet the Dark Absol
@WesleyMurch, darf ich Sie bitten, sich eine CSS-Frage zu einem anderen Thema unter stackoverflow.com/questions/14137378/… anzusehen
Istiaque Ahmed
24
.class {
    /* Fallback for web browsers that doesn't support RGBa */
    background: rgb(0, 0, 0);
    /* RGBa with 0.6 opacity */
    background: rgba(0, 0, 0, 0.6);
}

Kopiert von: http://robertnyman.com/2010/01/11/css-background-transparency-without-affecting-child-elements-through-rgba-and-filters/

Andy.Diaz
quelle
9
Vielleicht war ich nicht klar genug. Ich suche einen Hintergrund machen Bild teilweise transparent.
Niet the Dark Absol
@NiettheDarkAbsol Sie waren sich sicher, dass Sie keine "Problemumgehung" wollen, sondern ein Beispiel angegeben und wissen, dass die Antwort "NEIN, SIE KÖNNEN NICHT" lautet. Dieses Beispiel funktioniert also für das Szenario (das Sie nicht geben, sondern ablehnen), in dem Sie einen soliden Hintergrund hinter Ihrem Bild haben. Fügen Sie einfach einen weiteren Hintergrund über Ihr Bild ein, wobei die RGBA der Hintergrundfarbe entspricht. Der "Effekt" ist, dass Ihr Bild transparent aussieht. Sie sollten Antworten gerne annehmen oder eine andere Frage öffnen, da diese mit "NEIN, Sie können nicht" gelöst wurde
Sergio
2
@sergio Diese Antwort sagt mir , wie man eine Hintergrundfarbe teilweise transparent. Das ist sehr gut, mit Ausnahme der Frage - wie gesagt - ist über ein Hintergrundbild .
Niet the Dark Absol
13

Versuchen Sie diesen Trick. Verwenden Sie CSS-Schatten mit der Option (Einschub) und machen Sie zum Beispiel die tiefen 200px

Code:

box-shadow: inset 0px 0px 277px 3px #4c3f37;

.

Auch für alle Browser:

-moz-box-shadow: inset 0px 0px 47px 3px #4c3f37;
-webkit-box-shadow: inset 0px 0px 47px 3px #4c3f37;
box-shadow: inset 0px 0px 277px 3px #4c3f37;

und erhöhen Sie die Anzahl, damit Ihre Box gefüllt wird :)

Genießen!

Saud Alfadhli
quelle
1
Dies funktioniert nicht für das, was OP will, aber es erfüllt meine Anforderungen perfekt, danke !!
RozzA
@rozzA Das OP hat nicht angegeben, dass sich im Hintergrund ein anderes Bild befindet. Tatsächlich wollte er nur wissen, ob es möglich ist, die Deckkraft des Hintergrunds zu ändern, und antwortete: "NEIN". Dies ist ein netter Ansatz :), aber nicht anders als das Hinzufügen eines neuen Hintergrunds mit RGBA-Transparenz.
Sergio
6

Sie können ein zweites Element in das Element einfügen, auf dem Sie einen transparenten Hintergrund haben möchten.

<div class="container">
    <div class="container-background"></div>
    <div class="content">
         Yay, happy content!
    </div>
</div>

Stellen Sie dann den '.container-Hintergrund' so ein, dass er das übergeordnete Element abdeckt. An diesem Punkt können Sie die Deckkraft anpassen, ohne die Deckkraft des Inhalts in '.container' zu beeinflussen.

.container {
    position: relative;
}
.container .container-background {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background: url(background.png);
    opacity: 0.5;
}
.container .content {
    position: relative;
    z-index: 1;
}
Alex K.
quelle
Ist das nicht genau das gleiche wie der "Hack", den ich in der Frage verwendet habe?
Niet the Dark Absol
1
Hmm ... Ich nehme an, aber ich verstehe nicht, was bei Ihnen nicht funktioniert. Ich benutze diese Methode und es funktioniert großartig.
Alex K
1
Es ist genau wie Ihr Hack, aber weil Sie nur ungern ein Beispiel liefern und durch Ihren Kommentar "@Eric: Ich beziehe mich damit nicht auf einen bestimmten Fall, versuche ich eine allgemeine Lösung für das Problem zu finden" Sie Es scheint klar zu sein, was Sie wollen, ist kein Hack oder eine Problemumgehung, die für bestimmte Szenarien funktionieren könnte (obwohl Sie eine bereitstellen), sondern die einfache Antwort, ob es möglich ist oder nicht. Die richtige Antwort lautet also "NEIN, dies ist nach den aktuellen CSS-Spezifikationen nicht möglich". Ihre Probleme scheinen einige Layouts zu sein, die für Sie "kompliziert" sind. Diese Antwort macht es für Sie komplizierter.
Sergio
Ich meinte genau wie das OP-Beispiel.
Sergio
2

Versuche dies

<div style="background: linear-gradient( rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) ), url(/image.png);background-repeat: no-repeat; background-position: center;"> </div>

JM verursacht
quelle
Würde gerne sehen, dass der lineare Gradient in Position bleibt, auch wenn Sie die Hintergrundposition ändern.
Klewis
1

Sie können das Bild nicht über CSS bearbeiten. Die einzige Lösung, die mir einfällt, besteht darin, das Bild zu bearbeiten und seine Deckkraft zu ändern oder verschiedene Bilder mit allen erforderlichen Deckkraft zu erstellen.

Cokegod
quelle
Dies ist die klarere Antwort, wenn wir vergessen, dass das OP eine "Alternative" bereitgestellt hat, aber bedenken Sie, dass er später kommentierte, dass er "kein Beispiel liefern möchte" (um eine Alternative bereitzustellen).
Wenn man
1
#id {
  position: relative;
  opacity: 0.99;
}

#id::before {
  content: "";
  position: absolute;
  width: 100%;
  height: 100%;
  z-index: -1;
  background: url('image.png');
  opacity: 0.3;
}

Hack mit einer Deckkraft von 0,99 (weniger als 1) erstellt einen Z-Index-Kontext, sodass Sie sich keine Gedanken über globale Z-Index-Werte machen müssen. (Versuchen Sie, es zu entfernen und sehen Sie, was in der nächsten Demo passiert, in der der übergeordnete Wrapper einen positiven Z-Index hat.)
Wenn Ihr Element bereits einen Z-Index hat, benötigen Sie diesen Hack nicht.

Demo .

Nutzer
quelle
@ bjb568 Ja, das war mein erster Gedanke. Aber es funktioniert nicht wirklich als durchscheinender Hintergrund, sondern als durchscheinender Vordergrund. Versuchen Sie, ein Bild innerhalb des Blocks hinzuzufügen oder die Textfarbe in die Hintergrundfarbe (Weiß) zu ändern, und Sie werden sehen.
Benutzer
@ bjb568 Ja, in deinem Beispiel kannst du den Hintergrund über dem inneren Bild sehen. Versuchen Sie, die Deckkraft des "Hintergrund" -Elements zu erhöhen, und Sie werden sehen, wie das innere Bild verblasst.
Benutzer
@ bjb568 Hast du dich jemals gefragt, warum du hinzufügen musstest no-repeat? Sie denken, Ihre Version ist in Ordnung, weil das Element eine feste Größe hat, die der Größe des Hintergrundbilds entspricht, und weil Sie kein übergeordnetes Element mit Hintergrund haben (Hintergrundfarbe würde ausreichen).
Benutzer
@ bjb568 Ich gab ein gründliches Beispiel. Wenn Sie der Meinung sind, dass es Redundanz gibt, beginnen Sie damit und versuchen Sie, alles zu entfernen. Sie werden sehen, dass jeder Parameter seinen Platz hat. Wenn Sie glauben, eine andere Technik gefunden zu haben, geben Sie diese bitte als weitere Antwort an.
Benutzer
Ich habe mich gefragt. Ich kann es auch ohne seltsame Hacks machen. No-Repeat ist für ... es wiederholt sich nicht. Ok, gut. Eine andere Antwort also.
bjb568
1

Hier ist ein weiterer Ansatz zum Einrichten von Gradient und Transparenz mit CSS. Sie müssen jedoch ein wenig mit den Parametern herumspielen.

background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, transparent)),url("gears.jpg"); /* Chrome,Safari4+ */
background-image: -webkit-linear-gradient(top, transparent, transparent),url("gears.jpg"); /* Chrome10+,Safari5.1+ */
background-image:    -moz-linear-gradient(top, transparent, transparent),url("gears.jpg"); /* FF3.6+ */
background-image:     -ms-linear-gradient(top, transparent, transparent),url("gears.jpg"); /* IE10+ */
background-image:      -o-linear-gradient(top, transparent, transparent),url("gears.jpg"); /* Opera 11.10+ */
background-image:         linear-gradient(to bottom, transparent, transparent),url("gears.jpg"); /* W3C */
Stanislav
quelle
-1
body {
  ' css code that goes in your body'
}

body::after {
  background: url(yourfilename.jpg);
  content: "";
  opacity: 0.6;
  position: fixed;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
  z-index: -1;   
  width:auto;
  height: 100%;
  }

Sozusagen ist es der Körper :: nachdem Sie gesucht haben. Auf diese Weise wird der Code für Ihren Körper nicht oder nur der Hintergrund geändert, auf dem Sie bei Bedarf Änderungen vornehmen können.

Ali Silva
quelle