WebGL Tutorial
and more

CSS Masking Module

撰写时间:2025-04-19

修订时间:2025-04-19

mask-image

body { mask-image: linear-gradient(black 0%, transparent 100%); }

Hello

CSS Masking

布尔运算

引用外部SVG文件。

#output { width: 100px; height: 100px; border: 1px solid gray; background: steelblue; mask-image: url("./rect.svg"), url("./circle.svg"); mask-composite: subtract; }

引用dataURL

:root { --rect-url: url('data:image/svg+xml;utf8,'); --circle-url: url('data:image/svg+xml;utf8,'); } #container { border: .1px solid gray; margin: 0em auto; display: flex; flex-direction: column; align-items: center; gap: 0.5em; #src { position: relative; > div { width: 100px; height: 100px; } #src-1 { background-image: var(--rect-url); } #src-2 { position: absolute; top: 0; left: 0; background-image: var(--circle-url); z-index: 1; opacity: 0.8; } } #dst { display: grid; grid-template-rows: 1fr auto; justify-items: center; > div { width: 100px; height: 100px; grid-row: 1; border: .1px solid gray; background-color: hsl(from deepskyblue h 45% 50%); mask-image: var(--rect-url), var(--circle-url); mask-repeat: no-repeat; mask-position: 100% 100%; mask-size: 100% 100%; } > label { color: hsl(from #9933CC h 50% 80%); grid-row: 2; padding: 0.5em; } #add {mask-composite: add;} #subtract {mask-composite: subtract;} #intersect {mask-composite: intersect;} #exclude {mask-composite: exclude;} } }

这种内联方式,对于内容比较简单、且有在线修改需求的SVG来讲,比较方便。

同时改变mask-positionmask-size的值,可在改变布尔图像的大小的同时仍保持居中。

SVG中的mask

SVG内置支持蒙版功能,可通过mask标签来使用蒙版。

基本原理

使用绿色绘制了两个正方形。右边正方形未使用蒙版,则以绿色填充,以白色描边,没有任何问题。

而左边正方形使用了蒙版,则填充及描边均受到了蒙版内容的影响。

mask用以定义蒙版。在该蒙版中,分别以白色、灰色、及近乎接近黑色的#222填充了3个小圆,则左边的正方形只填充了蒙版中有内容的区域。并且,蒙版区域若为白色,则完全填充;蒙版区域若为黑色,则完全不填充;黑白之间的灰色,依其灰色比例决定填充颜色的亮度。

此外,左边正方形虽然也进行了描边,但由于蒙版除了填充3个小圆之外,其他区域均没有任何内容,也即这些区域的颜色为黑色,则左边正方形不会描边。给蒙版内容添加以下描边代码:

则左边正方形也将产生描边。

可以这样理解:对于用作蒙版的图像,蒙版中的白色完全透明;黑色完全不透明;各阶灰色取灰色中的白色成分设置其透明度。

因此,蒙版中的白色,其效果等同于将相应区域挖空,黑色部分则完全遮挡,灰色部分则产生相应的透明效果。透过蒙版,用喷枪将颜料喷涂到目标区域,则可精准地只在相应部位绘制背景图像。

SVG中蒙版的不足

SVG的每个mask都是独立的,无法直接在单个蒙版中引用其他蒙版。若要对多个形状进行布尔运算,必须通过手动组合图形(使用filterfeComposite)来生成新的蒙版。

因此,下面的代码不会有布尔运算的结果:

主要原因在于目前的SVG规范尚没有定义mask-composite的属性名称并提供相应的布尔运算功能。

综上,若要快速地通过蒙版来实现多边形的布尔运算,则就应像上节一样,在HTML中实现。

参考资源

  1. CSS Masking Level 1
  2. SVG 2 Specification