假设您在 CSS 中有一个从红色到透明的渐变。 轻松,对吧? 像这样
.element {
background: linear-gradient(
to bottom,
red,
transparent
);
}
不过,这里有一个很大的陷阱。
在 Chrome(也包括 Android)、Firefox 和 Edge 中,一切正常。

但在 Safari(也包括 iOS)中,则不正常。

据我所知,问题在于透明被解释(和插值)为“透明黑色”。
要解决它,您必须将颜色设置为该精确颜色的完全透明版本。 像这样
.element {
background: linear-gradient(
to bottom,
red,
rgba(255, 0, 0, 0)
)
}
使用十六进制代码并不总是容易,因为 RGBa 或 HSLa 等效项并不明显。 不过,找到颜色转换器并不难,只需在网上搜索即可。
CSS Level 4 的color()
函数将使此操作更加容易,例如
.element {
background: linear-gradient(
to bottom,
#eb8fa9,
color(#eb8fa9 alpha(0%)) /* or is it color-mod()? */
)
}
但对它的支持尚未普及。
如果您使用的是 Sass,它可以提供帮助
.element {
background: linear-gradient(
to bottom,
#eb8fa9,
rgba(#eb8fa9, 0);
)
}
transparent
作为透明黑色符合规范。 我多年来一直警告人们这一点。 浏览器只是在过去两三年内改变了它们的行为,改变了它们对透明颜色的处理方式,从严格意义上的正确方式转变为大多数人实际想要的方式。 不确定这种变化是否与任何规范相匹配。 我不知道 iOS 还没有改变 - 似乎很有可能它会改变。请注意,您在 CSS 形状中也会遇到相同的问题(我相信我在本文中对此发表了评论),这是由于抗锯齿(您最终得到的是本质上是一像素宽的渐变)。
它位于 CSS CSS 图像值和替换内容模块级别 3 中,自 2012 年以来一直保持稳定(候选推荐状态)。 请注意该部分中的示例 23。
感谢您的提醒,但让我澄清一下,Chris,只要“透明度”基于 alpha 颜色,这在 Safari 中就不会发生?
我正在使用线性渐变背景构建某些东西,知道这一点,我会确保以正确的方式处理所有事物,现在和永远!
谢天谢地我使用的是 Sass eh? ;-)
#phew!
渐变在设计应用程序(Sketch、Adobe 等)中通常也是如此。 我一直以这种方式编写我的渐变,以为逻辑在浏览器中会相同。
是的。 我也是这样。
大多数现代编辑器包含一个函数或附加组件来在不同的格式之间切换颜色(例如 Atom 中的“Pigments”)。 您也可以在 Safari 或 Chrome 中预览十六进制颜色,并在其中使用开发者工具。 按住 Shift 键单击颜色样本会在各种颜色格式之间切换。
这不仅仅是浏览器解释的问题。 它在 photoshop 中已经存在一段时间了。 我会制作带有白色轮廓的精灵,并且在裁剪它们时外部透明像素会变黑,并在游戏引擎中产生奇怪的伪影。 花了很长时间才弄清楚这就是问题所在。 很高兴人们在更广泛的范围内认识到这一点并想出解决方案。
另一种可能的语法是
在 Chrome 52 和 Firefox 49 中受支持;您需要一个像
postcss-color-hex-alpha
这样的 postcss 插件来将此语法转换为向后兼容的rgba()
语法。TL;DR 透明 == #0000,而不是之前带有 0% alpha 的。
“CSS 颜色级别 4” 正在由 WebKit (Safari) 开发 https://webkit.org/status/#specification-css-color-level-4
在那之前,WebKit 可能会修复“具有 alpha 的颜色的颜色插值不正确(渐变)” https://bugs.webkit.org/show_bug.cgi?id=150940,因此
color(#eb8fa9 alpha(0%))
方法可能无关紧要。我知道这是赤裸裸的自我推销,但我编写了一个 PostCSS 插件来处理这种情况:https://github.com/gilmoreorless/postcss-gradient-transparency-fix/
我认为 Safari 的处理方式更加灵活,即使它是一个错误,正如 Binyamin 在上面所展示的那样。 如果您设置一个 alpha 为 0% 的颜色并在渐变中使用它,Safari 将在其他颜色之间平滑地混合它。 例如,在 Chrome 和 Firefox 中,无论您设置了哪些 RGB 值,它看起来都与透明白色相同。 比较一下在 Safari 和 Chrome 或 Firefox 中的这个演示
http://codepen.io/smcginnis/pen/egVLJE
还可以尝试调整 alpha 值 - 在较高的值(.25 效果很好)下它变得不那么明显,但混合方式仍然不同。
另外,如果纯色停止和背景之间没有足够的对比度,请不要感到抱歉;这个演示只是为了好玩,在我意识到它只在 Safari 中工作并且想起了这篇文章之前。 尝试将
#coffee
更改为lime
以使其更易于查看。