CSS混合模式基础

Avatar of Chris Coyier
Chris Coyier 发表

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

Bennett Feely 一直在出色地 向人们展示 CSS 混合模式的魅力。我们习惯于在静态设计中(感谢 Photoshop)看到许多设计效果,但在网络上,尤其是在动态内容中,我们并不常看到。但随着 CSS 混合模式获得更多支持,这种情况将会改变。我想看看实现它的不同方法,因为它并不完全是现成的。

CSS 多个背景混合模式

您可以将 background-image 混合在一起,或将它们与背景颜色混合。这很简单,如下所示:

.blended {
  background-image: url(face.jpg);
  background-color: red;
  background-blend-mode: multiply;
}

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的笔 背景混合

Multiply 是 一个不错且有用的模式,但还有:screenoverlaydarkenlightencolor-dodgecolor-burnhard-lightsoft-lightdifferenceexclusionhuesaturationcolorluminosity。还有 normal 用于重置。

Adobe(参与了 此功能的规范制定创建了这个笔来展示不同的可能性。. 更新:他们已删除了该笔,但仍然保留了 此说明页面

单个元素可以拥有多个背景,堆叠起来。例如

.graphic-or-whatever {
  background:
    url(grid.png),
    url(building.jpg)
}

这些也可以通过添加 background-blend-mode 简单地混合。

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的笔 多个背景混合

这是一个由 Bennett Feely 提供的酷炫且实用的示例

查看 CodePen 上 Bennett Feely (@bennettfeely) 编写的笔 rxoAc

这是另一个示例,它巧妙地重新组合了分离成青色/品红/黄色/黑色部分(CMYK)的彩色图像。您知道这就是印刷中的胶印工作原理,对吧?=)

查看 CodePen 上 Bennett Feely (@bennettfeely) 编写的笔 使用 background-blend-mode 进行 CMY/CMYK 彩色印刷

任意 HTML 元素混合模式

将背景混合在一起非常酷,但就我个人而言,我对此并没有像将任意 HTML 元素混合在一起那样兴奋。例如,在背景上覆盖一个 <h1> 标题。或者甚至是在文本上覆盖文本。

前几天我在机场看到了这个,并拍了一张照片,因为我觉得它看起来很整洁,并且我认为我可以弄清楚如何在网络上实现它。

我第一次尝试重现它时,使用了不透明度。但是不透明度确实会使颜色变暗,并且不会使那些重叠的部分具有应有的额外暗度。CJ Gammon 向我展示了有一个专门用于此目的的混合属性:mix-blend-mode

因此,要重现此效果

<h1>hungry?</h1>

然后使用 Lettering.js 将其分解成

$("h1").lettering();

然后使用负字间距将字母挤压在一起,设置 mix-blend-mode 并着色

h1 {
  font-size: 7rem;
  font-weight: 700;
  letter-spacing: -1.25rem;
}
h1 span {
  mix-blend-mode: multiply;
}
h1 span:nth-child(1) {
  color: rgba(#AB1795, 0.75);
}
/* etc, on coloring */

比较

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的笔 重叠字母

就像我提到的,如果您问我,真正的网络文本叠加在图像上是一个非常棒的用例。

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的笔 GxlBm

Canvas 混合模式

DOM 混合模式对我来说最有趣,但需要注意的是 <canvas> 也具有混合模式,并且具有更深层次的支持(请参见下文了解所有内容)。

您可以在画布上下文中设置它。例如

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

ctx.globalCompositeOperation = 'multiply';

该值可以是我上面列出的任何一个。这是一个简单的演示

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的笔 canvas 混合模式

以及一个花哨的演示,您可以看到混合赋予了演示活力

查看 CodePen 上 Justin Windle (@soulwire) 编写的笔 sketch.js 演示

SVG 混合模式

正如您可能猜到的,SVG 确实有自己的机制来执行此操作。一种方法是在 <svg> 本身中定义它,这相当复杂

<svg>
  
  <defs>
    
    <filter id="f1" x="0" y="0" width="1" height="1">
      <feImage xlink:href="#p1" result="p1"/>
      <feImage xlink:href="#p2" result="p2"/>
      <feBlend mode="multiply" in="p1" in2="p2" />
    </filter>
    
    <path id="p1" d='M100 100 L200 100 L200 200 L100 200 Z' fill='#00FFFF'/>
    <path id="p2" d='M150 150 L250 150 L250 250 L150 250 Z' fill='#CC3300'/>
    
  </defs>
  
  <rect width="100%" height="100%" filter="url(#f1)"/>
  
</svg>

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的笔 Fnvdp

以及 一个更复杂的示例

好消息是 mix-blend-mode 将适用于内联 SVG。因此,如果您以这种方式使用 SVG,则可以使用类或任何其他方式定位形状本身,并为其提供所需的任何混合模式。

这是一个由 Bennet 提供的示例,它正是这样做的

查看 CodePen 上 Bennett Feely (@bennettfeely) 编写的笔 KDkCj

浏览器支持

对于 canvas: Firefox 20+、Chrome 30+、Safari 6.1+、Opera 17+、iOS 7+、Android 4.4+。最坏的消息是:IE 不支持。

对于 HTML/CSS: Firefox 30+、Chrome 35+、Safari 6.1(显然不支持 7?)。支持度不如 canvas。

目前,对于 Chrome,您需要运行 Canary,转到 chrome://flags/ 并启用“实验性 Web 平台功能”。

这实际上有点复杂,因此,如果您确实想深入了解并了解支持情况,请查看 Adobe 提供的 支持矩阵

渐进增强

混合的好处在于,其核心是设计效果。如果它们不受支持,您可以确保回退仍然可读(渐进增强!)。

这是 Jeremy Keith 的 一篇近期想法

完全有可能——甚至可以说是可取的——在每个浏览器都支持之前就使用这些功能。这就是我们推动网络发展的方式。

因此,一种支持方式是在不支持的浏览器中查看设计,如果它仍然可读/可用,那么您就完成了,无需进一步操作。

如果结果最终不可读/不可用,您可以调整内容直到它们可读/可用,或者运行测试以确定支持情况,并在不支持的情况下执行某些特定操作。

要测试支持情况,我想您可以测试要使用的属性

var supportsMixBlendMode = window.getComputedStyle(document.body).mixBlendMode;

var supportsBackgroundBlendMode = window.getComputedStyle(document.body).backgroundBlendMode;

如果返回值为“normal”(或除 undefined 之外的任何值),则表示支持存在,否则不存在。然后可能将一个类应用于 <html> 元素,以便您可以知道这一点并在 CSS 中的任何位置使用它来调整内容,类似于 Modernizr 的风格。也许他们将来甚至会为此进行测试。

除非它没有那么简单,如果是这样,请告诉我。


需要更多想法?查看 此合集。混合愉快!