Nehmen wir an, Sie haben einen Farbverlauf in CSS, der von Rot zu transparent geht. Einfach, oder? So:
.element {
background: linear-gradient(
to bottom,
red,
transparent
);
}
Es gibt hier jedoch einen ziemlich großen Haken.
In Chrome (auch Android), Firefox und Edge wären Sie bestens bedient.

Aber in Safari (auch iOS) wären Sie nicht bestens bedient.

Das Problem, soweit ich es verstehe, ist, dass transparent als „transparentes Schwarz“ interpretiert (und interpoliert) wird.
Um es zu beheben, müssen Sie die Farbe als eine vollständig transparente Version dieser exakten Farbe festlegen. So:
.element {
background: linear-gradient(
to bottom,
red,
rgba(255, 0, 0, 0)
)
}
Das ist mit einem Hex-Code nicht immer einfach, da nicht offensichtlich ist, was das entsprechende RGBa- oder HSLa-Äquivalent ist. Es ist jedoch nicht schwer, einen Farbkonverter zu finden, suchen Sie einfach im Web.
Die CSS Level 4 color() Funktion wird dies erleichtern. So:
.element {
background: linear-gradient(
to bottom,
#eb8fa9,
color(#eb8fa9 alpha(0%)) /* or is it color-mod()? */
)
}
Aber die Unterstützung dafür ist noch nicht vorhanden.
Sass kann helfen, wenn Sie das verwenden
.element {
background: linear-gradient(
to bottom,
#eb8fa9,
rgba(#eb8fa9, 0);
)
}
transparentals transparentes Schwarz zu interpretieren, entspricht der Spezifikation. Ich habe Leute jahrelang davor gewarnt. Browser haben ihr Verhalten erst in den letzten zwei oder drei Jahren geändert und ihre Behandlung von transparenten Farben von der streng korrekten zu dem geändert, was die meisten Leute tatsächlich wollten. Ich bin mir nicht sicher, ob diese Änderung einer Spezifikation irgendwo entspricht. Ich wusste nicht, dass iOS noch nicht geändert wurde – es ist wahrscheinlich, dass es das noch tun wird.Beachten Sie auch, dass Sie die gleichen Probleme bei CSS-Formen haben (ich glaube, ich habe hier den Artikel kommentiert) aufgrund von Antialiasing (Sie enden mit etwas, das im Wesentlichen ein ein Pixel breiter Farbverlauf ist).
Es steht im CSS CSS Image Values and Replaced Content Module Level 3, das seit 2012 stabil ist (Candidate Recommendation Status). Beachten Sie Beispiel 23 in diesem Abschnitt.
Danke dafür, aber lassen Sie mich das richtig verstehen, Chris: Solange die „Transparenz“ auf der Alpha-Farbe basiert, passiert das in Safari nicht?
Ich habe gerade etwas mit einem linearen Farbverlaufshintergrund erstellt und da ich das weiß, werde ich überprüfen, ob ich die Dinge richtig handhabe, jetzt und für immer!
Gott sei Dank benutze ich Sass, oder? ;-)
# puh!
Farbverläufe sind in Design-Apps (Sketch, Adobe usw.) oft genauso. Ich habe meine Farbverläufe immer so geschrieben und gedacht, die Logik wäre im Browser die gleiche.
Ja. Hier auch.
Die meisten modernen Editoren enthalten eine Funktion oder ein Add-on, um eine Farbe zwischen verschiedenen Formaten umzuschalten (wie „Pigments“ in Atom). Sie könnten die Hex-Farbe auch in Safari oder Chrome in der Vorschau anzeigen und die Entwicklertools in einem davon verwenden. Ein Shift-Klick auf die Farbfeld schaltet zwischen den verschiedenen Farbformaten um.
Das ist nicht nur ein Problem der Browser-Interpretation. Das ist schon seit einiger Zeit in Photoshop so. Ich habe Sprites mit weißen Rändern erstellt und die transparenten Pixel außerhalb beim Zuschneiden wurden schwarz und erzeugten seltsame Artefakte in der Spiel-Engine. Es dauerte ewig, bis ich herausfand, dass das das Problem war. Gut, dass die Leute es auf breiterer Ebene erkennen und Lösungen finden.
Eine weitere mögliche Syntax wäre
Unterstützt in Chrome 52 und Firefox 49; Sie benötigen ein PostCSS-Plugin wie
postcss-color-hex-alpha, um diese Syntax in die abwärtskompatiblergba()Syntax zu konvertieren.TL;DR transparent == #0000, nicht das vorherige mit 0% Alpha.
„CSS Color Level 4“ wird von WebKit (Safari) bearbeitet https://webkit.org/status/#specification-css-color-level-4
Bis dahin könnte WebKit „Farbinterpolation für Farben mit Alpha falsch (Farbverläufe)“ beheben https://bugs.webkit.org/show_bug.cgi?id=150940, so dass die Ansätze wie
color(#eb8fa9 alpha(0%))irrelevant sein könnten.Offensichtliche Eigenwerbung, ich weiß, aber ich habe ein PostCSS-Plugin geschrieben, um diese spezifische Situation zu behandeln: https://github.com/gilmoreorless/postcss-gradient-transparency-fix/
Ich denke, Safaris Art, dies zu tun, ist weitaus flexibler, auch wenn es ein Fehler ist, wie Binyamin oben zeigt. Wenn Sie eine Farbe mit 0 % Alpha festlegen und sie in einem Farbverlauf verwenden, mischt Safari sie sanft zwischen den anderen Farben. In Chrome und Firefox (zum Beispiel) wird es, egal welche RGB-Werte Sie festlegen, genauso aussehen wie transparentes Weiß. Vergleichen Sie diese Demo in Safari und Chrome oder Firefox
http://codepen.io/smcginnis/pen/egVLJE
Versuchen Sie auch, mit dem Alpha-Wert zu spielen – er wird bei höheren Werten weniger auffällig (0,25 funktioniert ziemlich gut), aber die Mischung ist immer noch anders.
Außerdem, entschuldigen Sie, wenn es nicht genug Kontrast zwischen dem Volltonfarb-Stopp und dem Hintergrund gibt; diese Demo war nur zum Spaß, bevor ich merkte, dass sie nur in Safari funktionierte und mich an diesen Beitrag erinnerte. Versuchen Sie,
#coffeeinlimezu ändern, um es leichter sichtbar zu machen.