Mehrere Hintergrundbilder sind ein cooles Feature von CSS3. Die Syntax ist einfach, man trennt sie einfach durch Kommas. Ich finde es am einfachsten/besten, die background-Kurzschreibweise zu verwenden, damit man Position und Wiederholung usw. deklarieren und alles zusammenfassen kann. Was bei der Syntax nicht offensichtlich ist, ist, welches Bild in der vertikalen Stapelreihenfolge oben liegt, wenn sich diese Bilder überlappen. Der Standard ist diesbezüglich eindeutig und die Browserimplementierungen folgen ihm. Das erste ist oben und von dort geht es abwärts.
background:
url(number.png) 600px 10px no-repeat, /* On top, like z-index: 4; */
url(thingy.png) 10px 10px no-repeat, /* like z-index: 3; */
url(Paper-4.png); /* On bottom, like z-index: 1; */
Es ist wie z-index, aber das ist kein z-index, es sind Teile eines einzigen Elements.
Ich finde es etwas verwirrend, da es das Gegenteil davon ist, wie HTML natürlich funktioniert. Wenn alle Elemente den gleichen z-index haben (und auf eine bestimmte Weise positioniert sind und sich überlappen), liegt das letzte Element oben und nicht das erste. Keine große Sache, man muss es nur einmal lernen.
Das Wichtigste, was man sich merken sollte, ist, dass wenn man einen der Hintergründe für ein vollständig opakes / vollständig wiederholendes Bild verwenden würde, diesen nicht zuerst, sondern zuletzt auflisten sollte, sonst bedeckt er alle anderen.
Denken Sie auch daran, dass multiple Hintergründe zwar absolut revolutionär sind, die Fallback-Lösung für Browser, die diese nicht unterstützen, darin besteht, dass sie überhaupt nichts für den Hintergrund anzeigen. Seien Sie also vorsichtig. Der beste Weg, damit umzugehen, ist wie immer Modernizr. Sie verwenden es sogar als Demo direkt auf der Startseite ihrer Website (zur Klarheit angepasst).
.multiplebgs body {
/* Use awesome multiple backgrounds here */
}
.no-multiplebgs body {
/* laaaaaame fallback */
}
Heutzutage (Update Mai 2019) würde ich mir darüber wahrscheinlich keine Sorgen mehr machen, da die Browserunterstützung dafür extrem hoch ist. Außerdem könnte man es in CSS so machen:
@supports (background-image: url(foo.jpg), url(bar.jpg)) {
body { }
}
Klare und einfache Erklärung. Danke.
Es wäre interessant, wenn sie einen anderen Wert für einen z-index-ähnlichen Effekt zulassen würden.
Wie
background: url(number.png) 600px 10px 5 no-repeatMöglicherweise… aber das wäre vielleicht zu kompliziert. Welche Vorteile bringt das gegenüber dem einfachen Ändern der Reihenfolge?
Hintergrundebenen mit JavaScript wechseln? Das ist alles, was mir einfällt.
Aber das führt mich zu einer weiteren Frage. Wie ändert das, wie jQuery es mit .css() anspricht?
Wo Sie es ansprechen… Ich würde mir wünschen, dass es für ein paar Dinge eine einfache Eigenschaft für diese Hintergründe in CSS gäbe (ich weiß, dass sie möglich sind, aber eine einfachere Syntax wäre großartig).
Mangels eines besseren Beispiels, sagen wir mal ein schwarz-grauer karierter Hintergrund mit zwei einfarbigen Blockbildern. Wie zum Beispiel eine „Karo“-Eigenschaft oder sogar eine „fade-left: value;“-Sache, für verblasste Bilder.
Ich weiß nicht, aber es wäre verrückt.
Ich denke, erlaubte Transparenz wäre cool und kreativ. Habe versucht, rgba-Farbe darüberzulegen. Nicht möglich.
Ich habe gehört, es kommt ;-)
Sie werden in der Lage sein, viele Dinge in einen „image()“-Ausdruck einzufügen, insbesondere rgba-Farben; und „image()“-Ausdrücke können dann überall dort verwendet werden, wo ein Bild zulässig ist.
Modernizr ist für Fallbacks nicht notwendig. Fügen Sie einen Standardhintergrund vor der Eigenschaft für mehrere Hintergründe hinzu. Moderne Browser verwenden die zuletzt gelesene Deklaration, während ältere Browser die ignorieren, die sie nicht verstehen.
Mir zuvorgekommen!
Das einzige Problem bei diesem Ansatz ist, dass neuere Browser dafür bestraft werden, dass sie den Fallback laden müssen, auch wenn sie ihn nicht benötigen. Ein moderner Browser lädt Ressourcen nur, wenn ein Selektor mit einem Element übereinstimmt, daher stimmt der Modernizr-Selektor für neuere Browser nicht überein und das Fallback-Bild wird nicht geladen.
Der Ansatz von Modernizr besteht darin, Entwicklern eine Möglichkeit zu geben, nur nicht-konforme Browser zu bestrafen, indem sie Polyfills oder einen sinnvollen Fallback laden.
Ich bevorzuge die geringe Strafe für neuere Browser, die durch eine doppelte Eigenschaft verursacht wird, gegenüber der Abhängigkeit von JavaScript für einen CSS-Fallback.
Einige Browser würden diese zusätzliche Grafik herunterladen, andere nicht.
Es war einmal, dass ich versuchte, Web2.0-schöne Buttons mit einer Mischung aus Verläufen zu erstellen. Also benutzte ich CSS3-Verläufe für Webkit und Gecko. Ich brauchte zwei Fallbacks. Für Opera benutzte ich mehrere Hintergründe (Verläufe in PNGs) und für ältere Browser benutzte ich einen Hintergrund.
Im Fall von Hintergrundbildern gab es keine Bestrafung, da ich die gleichen Bilder verwendete, die den gewünschten Verlauf-ähnlichen Hintergrund erzeugten. Der Fallback bestand in diesem Fall nur darin, die Anzahl der Bilder zu reduzieren, sodass die Schaltflächen einfacher waren.
Im Fall von Verlaufs-Hintergründen haben Chrome und FF die Fallback-Bilder (die für Opera) nicht heruntergeladen, aber Safari schon :P.
Ist das Herunterladen und Initialisieren eines JS-Skripts (Modernizr) keine Bestrafung?
JavaScript für Funktionalität zu benötigen, stört mich immer. Besonders wenn es nur für die Veralterung verwendet wird.
Meiner Meinung nach haben Leute, die ältere Browser verwenden, am ehesten JavaScript standardmäßig deaktiviert.
Cool
Was Fallbacks für Browser betrifft, die keine Unterstützung für mehrere Hintergründe haben, ist es nicht notwendig, sich auf Modernizr zu verlassen. Sie können einen effektiven Fallback erstellen, indem Sie einfach zwei background-Eigenschaften in derselben Deklaration definieren.
Beispiel
…Waffe wegsteck ;)
Okay, ich habe das ausprobiert und ihr habt Recht.
http://jsbin.com/egabe5/2/edit
Ich habe es in Firefox 2 getestet, der keine multiplen BGs unterstützt, und er greift die erste Deklaration auf. Das ist ein großartiger Ansatz. Ich war lange davon überzeugt, dass die zweite die erste überschreiben würde (da es sich um dieselbe Eigenschaft handelt) und nichts angezeigt würde. Nicht der Fall.
Es scheint, dass Chris sich so sehr mit den neuen Möglichkeiten von CSS beschäftigt, dass er die ganz grundlegenden Dinge davon vergisst ;)
Sehr gut..Danke!!
Danke für den Tipp, Chris. Ich konnte nicht herausfinden, warum ein zusätzlicher rgba(255,255,255,.3) BG beim Hovern nicht funktionierte.
Ach Mann, du machst die Dinge immer einfacher, als ich denke, dass sie wären. Danke, Mann. Du hast meinen Fortschritt wirklich vorangebracht.
Meiner Meinung nach macht die bestehende Stapelreihenfolge mehr Sinn. Da CSS entwickelt wurde, um Design von Markup zu trennen, macht es Sinn, dass es einem „Designer-ähnlichen“ Paradigma folgt und nicht einem Markup-Paradigma. In diesem Fall ist es vergleichbar mit Ebenen in Grafikprogrammen wie Photoshop, bei denen die „oberste“ Ebene diejenige ist, die Priorität/Sichtbarkeit hat.
Danke für den Tipp. Ich habe das immer so gemacht
Körper {
/*...background*/
margin: 0; padding: 0;
}
#border-wrapper {
/*...background*/
margin: 20px; padding: 20px; /*optional*/
}
Etwas, das ich kürzlich ausprobiert habe, war, einen Hintergrund auf dem HTML-Element und einen anderen auf dem BODY zu platzieren.
Bingo, das funktioniert einwandfrei. Ich habe versucht, ein gekacheltes BG auf HTML und zum Beispiel ein zentriertes transparentes PNG (etwas wie ein Alpha-Verlauf) auf BODY zu verwenden. Diese Methode schien auf praktisch jedem Browser neben dem dd_belated png fix einwandfrei zu funktionieren. Würde mich interessieren, ob noch jemand diese Methode verwendet hat, bitte korrigieren Sie mich, wenn ich falsch liege.
Ist es möglich, irgendwo ein Beispiel zu sehen? Ich kann es mir kaum vorstellen? Es klingt aber cool!
Hier ist ein Beispiel… http://bit.ly/gfNJzF.
Bitte entschuldigen Sie die schlechte Lesbarkeit und das unfertige Logo des Kunden. Die Papiertextur ist dem HTML-Tag zugewiesen und die überlagernde Karte befindet sich auf dem BODY.
Alistair – wissen Sie, dass Ihr Body-Stil eine Deklaration hat, die sagt:
color: 333px;
Ja, die Stapelreihenfolge hat mich bei dem Versuch, mehrere Hintergrundbilder mit einem Hintergrundgradienten darunter zu erstellen, gestört. Eine Zeit lang konnte ich nicht herausfinden, warum nur der Verlauf angezeigt wurde (er war zuerst aufgeführt, dann wurden die anderen Bilder angewendet).
Wie Sie sagten, haben alle Entwickler, mit denen ich gesprochen habe, dies als kontraintuitiv empfunden, aber es ist nur eine dieser Sachen, die man nur einmal lernen muss; es lässt mich jedoch fragen, warum die Leute, die den Standard schreiben, diese Reihenfolge gewählt haben.
Interessanterweise sind es nicht nur Bilder, die geschichtet werden können, sondern auch CSS-Verläufe.
Ich hatte Probleme in IE 8.
wird nicht angezeigt
-moz-border-radius
-moz-box-shadow
Ich hoffe, Sie wissen, dass das herstellerspezifische CSS-Selektoren sind, die nur in Firefox funktionieren, daher das Präfix „moz“ von „Mozilla“.
Der Standard ergibt für mich keinen Sinn.
Ich würde sagen, das zuerst Deklarierte sollte auf der untersten Ebene liegen. Ein Künstler malt nicht die oberste Ebene zuerst und versucht dann, darunter liegende Ebenen hinzuzufügen.
Logisch gesehen beginnen wir normalerweise mit Hintergründen, legen (sagen wir) ein Bild ab, dann vielleicht ein 100%iges Div darüber mit einem halbtransparenten Bild und so weiter.
Offensichtlich sind die Leute, die diesen Teil des Standards geschrieben haben, keine Designer oder Künstler. Oder Vulkanier, um genau zu sein ;-)
Es wäre schön, wenn es eine Möglichkeit gäbe, einen zweiten Hintergrund hinzuzufügen, ohne das gesamte Attribut wiederholen zu müssen.
Beispiel
Stellen Sie sich vor, Sie generieren Karten per CSS, Sie haben einen Rahmen mit Bildern und ein Muster.
Gibt es heute ** eine Möglichkeit, das ohne JS ** zu erreichen?
Wie bekommt man die CSS3-Mehrfachhintergrund-Eigenschaft, wenn sie für denselben Tag mit unterschiedlichen Eigenschaften verwendet werden muss?