使用多个背景色为图像着色

Avatar of Chris Coyier
Chris Coyier 发布

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200美元免费额度!

CSS 中的 `background` 属性可以接受以逗号分隔的值。“多个”背景,如果你愿意。你也可以将它们视为分层背景,因为 它们具有堆叠顺序。如果我们在图像上叠加一种透明颜色,我们可以“着色”该图像。但这并不像你想象的那样简单。

我最初直观的猜测是这样做的

/* Warning: this doesn't work */
.tinted-image {
  background: 
    /* top, transparent red */ 
    rgba(255, 0, 0, 0.25),
    /* bottom, image */
    url(image.jpg);
}

不幸的是,这无效。我不确定为什么。一段时间前,当我 在 Twitter 上抱怨此事 时,我得到了各种想法/原因/借口。没有一个对我来说完全正确。确实,你不能用逗号分隔 `background-color`,但我认为这与这里无关,因为我正在用逗号分隔 `background` 简写,而不是专门的 `background-color`(更不用说以相反的顺序排列这些值也可以正常工作)。

我怀疑真正的原因是,这样很容易导致作者出错。`background: green, url(image.jpg);` 从某种意义上来说会“失败”,因为它只会用绿色填充背景。强制颜色放在最后,使颜色有点像“备用方案”,而不是像其他任何层一样。

不幸的是,我们也不能简单地将颜色放在底部并调整图像的不透明度以使某些颜色透出来,因为 `background-opacity` 不是一个东西。(尽管你可以 伪造它。)

但是有一种方法!

与其使用 `rgba()` 或 `hsla()` 来使用透明填充颜色,我们可以使用渐变。渐变在技术上是 `background-image`,因此不受无法放在堆叠顺序第一位(顶部)的规则约束。

/* Working method */
.tinted-image {
  background: 
    /* top, transparent red, faked with gradient */ 
    linear-gradient(
      rgba(255, 0, 0, 0.45), 
      rgba(255, 0, 0, 0.45)
    ),
    /* bottom, image */
    url(image.jpg);
}

查看 CodePen 上 Chris Coyier 的示例 使用多个背景色为图像着色 (@chriscoyier)。

嘿,不管什么有效,对吧?