CSS 遮罩模块 第一级

W3C 候选推荐草案,

该版本:
https://www.w3.org/TR/2021/CRD-css-masking-1-20210805/
最新发布版本:
https://www.w3.org/TR/css-masking-1/
编辑草案:
https://drafts.fxtf.org/css-masking-1/
以前的版本:
实现报告:
https://test.csswg.org/harness/results/css-masking-1_dev/grouped/
测试套件:
http://test.csswg.org/suites/css-masking/nightly-unstable/
问题跟踪:
CSSWG 问题库
文中内联问题
编辑者:
(Adobe Inc.)
(Mozilla Japan)
Tab Atkins Jr. (Google)
建议编辑此规范:
GitHub 编辑

摘要

CSS 遮罩提供了两种部分或完全隐藏视觉元素的方式:遮罩和剪裁。

遮罩描述了如何使用另一个图形元素或图像作为亮度或 Alpha 遮罩。通常,通过 CSS 或 SVG 渲染元素可以概念性地描述为将该元素(包括其子元素)绘制到缓冲区中,然后该缓冲区被合成到元素的父元素中。亮度和 Alpha 遮罩会在合成阶段之前影响该缓冲区的透明度。

剪裁描述了视觉元素的可见区域。该 区域可以通过使用某些 SVG 图形元素或基本形状来描述。该区域之外的任何内容都不会被渲染。

CSS 是一种描述结构化文档(如 HTML 和 XML)在屏幕、纸张等上的呈现语言。

本文档状态

本节描述了本文档在出版时的状态。 其他文档可能会取代本文档。 当前 W3C 出版物的列表 以及此技术报告的最新修订版 可以在 W3C 技术报告索引 https://www.w3.org/TR/ 中找到。

本文档由 CSS 工作组 作为 候选推荐草案 发布。 作为候选推荐草案发布 并不意味着 W3C 会员的认可。 候选推荐草案 集成了工作组计划在后续候选推荐快照中包含的先前候选推荐中的变更。

这是一个草案文件 可能会随时更新、替换 或被其他文件取代。 除了作为正在进行的工作外,引用本文档是不合适的。

请通过 在 GitHub 上提交问题(首选)发送反馈, 在标题中包括规范代码“css-masking”,如: “[css-masking] …评论摘要…”。 所有问题和评论都被 归档。 或者,反馈可以发送到公共邮件列表 www-style@w3.org,该邮件列表已被归档

本文档受 2020年9月15日 W3C 流程文档 管辖。

本文档由在 W3C 专利政策 下运作的小组生成。 W3C 维护了与小组交付物相关的任何专利披露的公共列表; 该页面还包含披露专利的说明。 个人如实知道的专利, 且该专利包含必要声明,必须根据W3C 专利政策第6节披露相关信息。

1. 简介

本节非规范性内容。

本规范定义了两种不同的图形操作,它们都可以完全或部分隐藏对象的一部分:剪裁和遮罩。

1.1. 剪裁

一个封闭的矢量路径、形状或多边形定义了所谓的剪裁路径。在没有抗锯齿的情况下,该剪裁路径是一个区域,该区域的“内部”部分可以显示出来,而“外部”部分被“剪裁”掉,不会显示在画布上。

剪裁示例

一个剪裁路径(中间)应用于一个用不同颜色填充的多边形(左)。结果是一个“被剪裁出”的形状(右)。

clip-path 属性可以使用指定的基本形状作为剪裁路径,或者引用带有clipPath 元素的图形元素作为剪裁路径。

1.2. 遮罩

对图形对象应用遮罩的效果就像是图形对象通过遮罩绘制在背景上,从而完全或部分遮罩掉图形对象的某些部分。

遮罩示例

一个亮度遮罩(中间)应用于一个填充有渐变的形状(左)。结果是一个被遮罩的形状(右)。

遮罩通过 mask-imagemask-border-source 属性来应用。

mask-image 属性可以引用 mask 元素。mask 元素的内容作为遮罩。

或者,对于许多简单的用法,mask-image 属性可以直接引用图像作为遮罩,而无需显式的 mask 元素。此遮罩可以像 CSS 背景图像一样进行尺寸和定位,通过 mask-positionmask-size 和其他特性进行定义。

mask-border-source 属性将遮罩分为 9 个部分。可以通过不同方式切片、缩放和拉伸这些部分以适应 遮罩边框图像区域的大小。mask-border 属性作为 mask-border-source 和其他特性的速记属性。

mask 属性作为所有mask-bordermask-image 相关属性的速记属性。

注意:虽然遮罩提供了许多增强图形效果的可能性,且通常对内容的“可见部分”提供了更多控制,但剪裁路径的性能表现更好,而且基本形状更易于插值。

2. 模块交互

本规范定义了一组 CSS 属性,这些属性会影响应用这些属性的元素的视觉呈现。这些效果是在根据 视觉格式化模型 (来自 [CSS21]) 对元素进行大小调整和定位之后应用的。这些属性的某些值会创建一个 堆叠上下文。此外,本规范替换了来自 [CSS21]剪裁: clip 属性部分。

合成模型遵循 SVG 合成模型 [SVG11]:首先在没有滤镜效果、遮罩、剪裁和不透明度的情况下为元素设置样式。然后将元素及其子代绘制到临时画布上。最后,按照顺序将以下效果应用于元素:滤镜效果 [FILTER-EFFECTS]、剪裁、遮罩和不透明度。

本规范允许使用 CSS 合成和混合中的 Porter Duff 合成运算符来合成多个遮罩层 [COMPOSITING-1]

术语 对象边界框 遵循 SVG 1.1 中的定义 [SVG11]

3.

本规范遵循 CSS 属性定义惯例 (来自 [CSS21])。基本形状定义于 CSS 形状模块第一级 [CSS-SHAPES] 中。本规范未定义的值类型在 CSS 值和单位模块第三级中定义 [CSS3VAL]

除了在定义中列出的特定于属性的值外,本规范定义的所有属性还接受 CSS 通用关键字,例如 inherit 作为其属性值 [CSS3VAL]。为了提高可读性,未在此明确重复。

4. 术语

本规范中的 CSS 属性和值的定义类似于 CSS 背景和边框中的定义 [CSS3BG]。为了避免冗余,本规范依赖于 CSS 背景和边框的描述和定义。以下术语在 CSS 背景和边框中的含义在本规范中具有以下意义:

CSS 遮罩中的术语 [CSS3BG] 中的术语
遮罩层图像 背景图像
遮罩绘制区域 背景绘制区域
mask-size background-size
mask-position background-position
遮罩定位区域 背景定位区域
遮罩边框图像 边框图像
遮罩边框图像区域 边框图像区域

5. 剪裁路径

剪裁路径限制了可以应用绘制的区域,所谓的剪裁区域。从概念上讲,任何位于该区域之外的绘图部分都不会被绘制。这包括应用了剪裁路径的元素及其子元素的内容、背景、边框、文本装饰、轮廓和可见的滚动机制。

元素的祖先也可以剪裁其内容的部分(例如,通过他们自己的 clipclip-path 属性,和/或如果他们的 overflow 属性不是 visible)。渲染的是累积的交集部分。

如果剪裁区域超出 UA 的文档窗口边界,内容可能会被本机操作环境剪裁到该窗口。

剪裁路径影响元素的渲染。它不会影响元素的固有几何形状。被剪裁的元素(即通过 clipPath 元素或其子元素引用 clip-path 属性)必须保持与未剪裁时相同的几何形状。

考虑一个被应用于祖先的剪裁路径所剪裁的形状:
<g clip-path="circle()"> 
  <path id="shape" d="M0,0 L10,10, L 20,0 z"/> 
</g> 

该形状由 use 元素引用:

<use xlink:href="#shape"/> 

该形状的几何形状不受圆形剪裁路径的影响。

默认情况下,pointer-events 不会在形状的被剪裁(不可见)区域触发。例如,一个尺寸为 10px x 10px 的元素被剪裁为半径为 5px 的圆形时,将不会在 剪裁区域外接收 点击事件。

5.1. 剪裁形状: clip-path 属性

名称: clip-path
值: <clip-source> | [ <basic-shape> || <geometry-box> ] | none
初始值: none
适用于: 所有元素。在 SVG 中,它适用于 容器元素,不包括 defs 元素,以及所有 图形元素use 元素
继承:
百分比: n/a
计算值: 按指定值,但 <url> 值为绝对值
规范顺序: 按语法
动画类型: 按计算值
媒体: 视觉

指定一个基本形状或引用 clipPath 元素以创建一个 剪裁路径

<clip-source> = <url>
<geometry-box> = <shape-box> | fill-box | stroke-box | view-box
<basic-shape>

CSS 形状模块中定义的基本形状函数 [CSS-SHAPES]。基本形状利用指定的参考框对基本形状进行大小调整和定位。如果没有指定参考框,将使用 border-box 作为参考框。

<geometry-box>

如果与 <basic-shape> 组合使用,它提供了 <basic-shape> 的参考框。

如果单独指定,使用指定框的边缘(包括任何角部形状,如由 border-radius 定义的角部形状 [CSS3BG]),作为剪裁路径。另见 “从框值创建形状” [CSS-SHAPES]

fill-box

使用 对象边界框 作为参考框。

stroke-box

使用 描边边界框 作为参考框。

view-box

使用最近的 SVG 视口 作为参考框。

如果为创建 SVG 视口 的元素指定了 viewBox 属性:

  • 参考框定位在 viewBox 属性建立的坐标系的原点。

  • 参考框的尺寸设置为 viewBox 属性的 宽度高度 值。

none

不会创建 剪裁路径

对于没有关联 CSS 布局框的 SVG 元素,使用值content-boxpadding-boxfill-boxborder-boxmargin-boxstroke-box

对于有关联 CSS 布局框的元素,使用值fill-boxcontent-boxstroke-boxview-boxborder-box

计算值为 none 以外的值将创建一个 堆叠上下文,与 CSS opacity 属性的 1 以外的值相同 [CSS3COLOR]

如果 URI 引用无效(例如,指向不存在的对象或该对象不是 clipPath 元素),则不会应用剪裁。

本示例演示了基本形状 <polygon()> 作为剪裁路径的使用。每对以空格分隔的长度值代表多边形的一个点。可视化的剪裁路径可见于 简介
clip-path: polygon(15px 99px, 30px 87px, 65px 99px, 85px 55px, 
        122px 57px, 184px 73px, 198px 105px, 199px 150px, 
        145px 159px, 155px 139px, 126px 120px, 112px 138px, 
        80px 128px, 39px 126px, 24px 104px); 
在此示例中,clip-path 属性引用了一个 SVG clipPath 元素。每对以逗号分隔的长度值代表多边形的一个点。与前一个示例一样,剪裁路径的可视化效果可见于 简介

clip-path: url("#clip1"); 
<clipPath id="clip1"> 
    <polygon points="15,99 30,87 65,99 85,55 122,57 184,73 198,105 
        199,150 145,159 155,139 126,120 112,138 80,128 39,126 24,104"/> 
</clipPath> 

clip-path 属性是 SVG 元素的 呈现属性

6. SVG 剪裁路径源

6.1. clipPath 元素

名称: clipPath
分类: 容器元素, 永不渲染的元素
内容模型: 可以按任何顺序包含以下任意数量的元素:
属性:
DOM 接口: SVGClipPathElement

属性定义:

clipPathUnits = "userSpaceOnUse | objectBoundingBox"

定义了 clipPath 内容的坐标系。

userSpaceOnUse

clipPath 内容代表当前 用户坐标系统中的值,当 clipPath 元素被引用时使用 (即引用 clipPath 元素的元素的 用户坐标系统)。

objectBoundingBox

坐标系统的原点位于应用剪裁路径的元素边界框的左上角,边界框具有相同的宽度和高度。用户坐标与 CSS 中的 px 单位等比例。

如果未指定属性 clipPathUnits,则默认值为 userSpaceOnUse

可动画: 是。

CSS 属性会从祖先元素继承到 clipPath 元素;但不会从引用 clipPath 元素的元素继承。

clipPath 元素不会直接呈现;它们只能通过 clip-path 属性进行引用。display 属性不适用于 clipPath 元素;因此,即使 clipPath 元素的 display 属性设置为非 noneclipPath 元素仍不会直接呈现,并且当 display 属性设置为 none 时,clipPath 元素仍然可被引用。

一个 clipPath 元素可以包含 path 元素,text 元素,基本形状(如 circle),或者 use 元素。如果 use 元素是 clipPath 元素的子元素,它必须直接引用 pathtext基本形状 元素。间接引用是错误的,clipPath 元素必须被忽略。

Firefox 禁止渲染引用违反内容模型的剪裁路径的元素。没有浏览器会忽略带有间接引用的剪裁路径的使用。<https://github.com/w3c/csswg-drafts/issues/17>

每个子元素的原始几何形状(不包括诸如 填充描边描边宽度等渲染属性)在 clipPath 内部概念上定义了一个 1-bit 的遮罩(可能包含沿几何形状边缘的抗锯齿),该遮罩表示与该元素关联的图形的轮廓。遮罩外部的所有内容都会被遮挡。如果子元素因 displayvisibility 变得不可见,则它不会影响剪裁路径。如果 clipPath 元素包含多个子元素,子元素的轮廓会被逻辑 "OR" 操作合并为一个轮廓,然后用于限制可以应用涂料的区域。因此,如果某个点位于 clipPath 的任意子元素内,该点就位于剪裁路径内部。

定义与 CSS 属性相关的原始几何形状,特别是文本上的几何形状。<https://github.com/w3c/csswg-drafts/issues/170>

对于给定的 图形元素,实际使用的剪裁路径将是由其 clip-path 属性(如果有)指定的剪裁路径与其祖先上的任何剪裁路径的交集,如通过新视口建立的元素上的 clip-path 属性指定的剪裁路径。(参见 [SVG11]

有几点补充说明:

6.2. 绕组规则: clip-rule 属性

名称: clip-rule
值: nonzero | evenodd
初始值: nonzero
应用于: 应用于 SVG 图形元素
是否继承:
百分比: 不适用
计算值: 按指定值
规范顺序: 按语法
动画类型: 离散
媒体: 视觉

clip-rule 属性表示用于确定是否某个给定点在由 剪裁区域(由 图形元素 创建)内的算法。算法定义和 clip-rule 的值参照 fill-rule 属性的定义。详见 SVG 1.1 中的 “填充属性”部分 [SVG11]

nonzero

详见 fill-rule 属性的描述 [SVG11]

evenodd

详见 fill-rule 属性的描述 [SVG11]

属性 clip-rule 仅适用于包含在 图形元素 内的 clipPath 元素。

注意: clip-rule 属性不适用于 <basic-shape>

以下图形演示了 nonzero 规则:

带有nonzero规则的形状.

三个形状从左到右: 五角星用一条连续的、重叠的线绘制; 两个顺时针方向绘制的圆,一个包含另一个,且两者都属于同一形状的子路径; 两个圆,一个包含另一个,其中较大的圆顺时针方向绘制,较小的圆逆时针方向绘制,且两者都属于同一形状。只有最后一个形状有一个“洞”。

以下图形演示了 evenodd 规则:

带有evenodd规则的形状.

三个形状从左到右: 五角星用一条连续的、重叠的线绘制; 两个顺时针方向绘制的圆,一个包含另一个,且两者都属于同一形状的子路径; 两个圆,一个包含另一个,其中较大的圆顺时针方向绘制,较小的圆逆时针方向绘制,且两者都属于同一形状。所有三个形状都有一个“洞”。

以下代码片段将会使剪裁路径应用 even-odd 剪裁规则,因为 clip-rule 是在定义剪裁形状的 path 元素上指定的:
<g clip-rule="nonzero">
  <clipPath id="MyClip">
    <path d="..." clip-rule="evenodd" />
  </clipPath>
  <rect clip-path="url(#MyClip)" ... />
</g>

而以下代码片段不会使剪裁路径应用 evenodd 剪裁规则,因为 clip-rule 是在引用元素上指定的,而不是在定义剪裁形状的对象上指定的:

<g clip-rule="nonzero">
  <clipPath id="MyClip">
    <path d="..." />
  </clipPath>
  <rect clip-path="url(#MyClip)" clip-rule="evenodd" ... />
</g>

clip-rule 属性是 SVG 元素的 表示属性

7. 定位蒙版

7.1. 蒙版图片来源: mask-image 属性

名称: mask-image
值: <mask-reference>#
初始值: none
应用于: 所有元素。在 SVG 中,适用于 容器元素,不包括 defs 元素,所有 图形元素use 元素
是否继承:
百分比: 不适用
计算值: 关键字 none,计算出的 <image>,或计算出的 <url>
规范顺序: 按语法
动画类型: 离散
媒体: 视觉

此属性设置元素的 蒙版层图像。定义如下:

<mask-reference> = none | <image> | <mask-source>
<mask-source> = <url>
<url>

一个 URL 引用指向 mask 元素(例如 url(commonmasks.svg#mask))或指向 CSS 图像。

none

值为 none 时,计为透明的黑色图像层。

计算值不为 none 时,结果将创建一个 层叠上下文 [CSS21],其方式与 CSS opacity 处理非 1 值时的行为相同。

蒙版引用为空图像(宽度或高度为零)、下载失败、不是对 mask 元素的引用、或不存在或无法显示(例如由于不支持的图像格式)时,仍计为透明的黑色图像层。

有关如何处理 蒙版层图像,请参见 “蒙版处理” 一节。

注意:<mask-reference> 列表中,值为 none 可能会根据 mask-composite 指定的合成运算符影响蒙版操作。

注意: <mask-source> 计为蒙版层,并且可以在可重复的 <mask-reference> 列表中与 <image> 或进一步的 <mask-source> 列表项结合使用。

注意: 元素还可以使用 mask-border-source 进行蒙版。请参阅 mask-border-sourcemask-image 之间的交互。

蒙版引用的示例:
body { mask-image: linear-gradient(black 0%, transparent 100%) } 
p { mask-image: none } 
div { mask-image: url(resources.svg#mask2) } 

有关 mask-image 如何与其他逗号分隔的蒙版属性交互以形成每个蒙版层的内容,请参阅 “分层多个蒙版层图像”

7.2. 蒙版图片解释: mask-mode 属性

名称: mask-mode
值: <masking-mode>#
初始值: match-source
应用于: 所有元素。在 SVG 中,适用于 容器元素,不包括 defs 元素,所有 图形元素use 元素
是否继承:
百分比: 不适用
计算值: 按指定值
规范顺序: 按语法
动画类型: 离散
媒体: 视觉

mask-mode 属性指示 <mask-reference> 是作为亮度蒙版还是透明度蒙版处理。 (参见 蒙版处理。)

<masking-mode> = alpha | luminance | match-source

值具有以下含义:

alpha

alpha 表示使用 蒙版层图像 的透明度值作为蒙版值。 参见 计算蒙版值

luminance

luminance 表示使用 蒙版层图像 的亮度值作为蒙版值。 参见 计算蒙版值

match-source

如果 <mask-reference>mask-image 属性的类型为 <mask-source>,则应使用引用的 mask 元素的 mask-type 属性指定的值。

如果 <mask-reference>mask-image 属性的类型为 <image>,则应使用 蒙版层图像 的透明度值作为蒙版值。

在下面的示例中,mask-type 属性将 mask 元素的蒙版类型设置为 alphamask-image 属性引用了该 mask 元素,并且 mask-mode 属性的值为 luminancemask-mode 属性将覆盖 mask-type 的定义并设置为 luminance

mask-mode 属性不应影响 mask-border-source 的蒙版模式。

<mask id="SVGMask" mask-type="alpha" maskContentUnits="objectBoundingBox"> 
  <radialGradient id="radialFill"> 
    <stop stop-color="white" offset="0"/> 
    <stop stop-color="black" offset="1"/> 
  </radialGradient> 
  <circle fill="url(#radialFill)" cx="0.5" cy="0.5" r="0.5"/> 
</mask> 

<style> 
  rect { 
    mask-image: url(#SVGMask); 
    mask-mode: luminance; 
  } 
</style> 

<rect width="200" height="200" fill="green"/> 

参见 “分层多个蒙版层图像” 以了解 mask-mode 如何与其他逗号分隔的蒙版属性交互以形成每个蒙版层。

7.3. 平铺蒙版图片: mask-repeat 属性

名称: mask-repeat
值: <repeat-style>#
初始值: repeat
应用于: 所有元素。在 SVG 中,适用于 容器元素,不包括 defs 元素,所有 图形元素use 元素
是否继承:
百分比: 不适用
计算值: 由两个关键字组成,每个维度一个
规范顺序: 按语法
动画类型: 离散
媒体: 视觉

指定在 蒙版层图像 调整大小定位 后如何平铺。

参见 background-repeat 属性 [CSS3BG] 了解属性值的定义。

body { 
    background-color: blue; 
    mask-image: url(dot-mask.png) luminance; 
    mask-repeat: space; 
} 

带有点状蒙版的元素图像

使用 space 的效果: 一个点的 蒙版层图像 平铺以覆盖整个 蒙版绘制区域,并且 蒙版层图像 被等距排列。

参见 “分层多个蒙版层图像” 以了解 mask-repeat 如何与其他逗号分隔的蒙版属性交互以形成每个蒙版层。

7.4. 定位蒙版图片: mask-position 属性

名称: mask-position
值: <position>#
初始值: 0% 0%
应用于: 所有元素。在 SVG 中,适用于 容器元素,不包括 defs 元素,所有 图形元素use 元素
是否继承:
百分比: 参考 蒙版绘制区域的大小 减去 蒙版层图像 的大小;见 background-position [CSS3BG]
计算值: 由两个关键字表示原点和两个从该原点偏移的值组成,每个值表示为绝对长度(如果给定了 <length>),否则为百分比。
规范顺序: 按语法
动画类型: 可重复列表
媒体: 视觉

参见 background-position 属性 [CSS3BG] 了解属性值的定义。

在下面的示例中,单个图片被放置在视口的右下角。
body { 
    mask-image: url("logo.png"); 
    mask-position: 100% 100%; 
    mask-repeat: no-repeat; 
} 
蒙版位置也可以相对于其他角进行定位。例如,以下代码将背景图片设置为距底部10px,距右侧3em的位置:

mask-position: right 3em bottom 10px

参见 “分层多个蒙版层图像” 以了解 mask-position 如何与其他逗号分隔的蒙版属性交互以形成每个蒙版层。

7.5. 蒙版区域: mask-clip 属性

名称: mask-clip
值: [ <geometry-box> | no-clip ]#
初始值: border-box
应用于: 所有元素。在 SVG 中,适用于 容器元素,不包括 defs 元素,所有 图形元素use 元素
是否继承:
百分比: 不适用
计算值: 按指定
规范顺序: 按语法
动画类型: 离散
媒体: 视觉

对于不引用 蒙版元素的 蒙版层图像mask-clip 确定了 蒙版绘制区域,该区域决定了受蒙版影响的区域。元素的绘制内容必须限制在此区域内。

mask-clip 属性不会影响引用 蒙版 元素的 蒙版层图像xywidthheightmaskUnits 属性决定了引用蒙版的 蒙版绘制区域

值的含义如下:

content-box

绘制的内容被限制在 内容框内。

padding-box

绘制的内容被限制在 内边距框内。

border-box

绘制的内容被限制在 边框框内。

fill-box

绘制的内容被限制在 对象边界框内。

stroke-box

绘制的内容被限制在 描边边界框内。

view-box

使用最近的 SVG 视口作为参考框。

如果为创建 SVG 视口的元素指定了 viewBox 属性:

  • 参考框定位在 viewBox 属性建立的坐标系的原点处。

  • 参考框的尺寸设置为 viewBox 属性的 宽度高度 值。

no-clip

绘制的内容不受限制(不裁剪)。

对于没有关联 CSS 布局框的 SVG 元素,使用值content-boxpadding-box 会计算为 fill-boxborder-boxmargin-box 会计算为 stroke-box

对于具有关联 CSS 布局框的元素,使用值fill-box 会计算为 content-boxstroke-boxview-box 会计算为 border-box

参见 “分层多个蒙版层图像” 以了解 mask-clip 如何与其他逗号分隔的蒙版属性交互以形成每个蒙版层。

7.6. 定位区域: mask-origin 属性

名称: mask-origin
值: <geometry-box>#
初始值: border-box
应用于: 所有元素。在 SVG 中,适用于 容器元素,不包括 defs 元素,所有 图形元素use 元素
是否继承:
百分比: 不适用
计算值: 按指定
规范顺序: 按语法
动画类型: 离散
媒体: 视觉

对于渲染为单个框的元素,指定 蒙版定位区域。对于渲染为多个框的元素(例如,跨多行的内联框,跨多个页面的框),指定哪些框 box-decoration-break 操作以确定蒙版定位区域。

content-box

位置相对于 内容框

padding-box

位置相对于 内边距框。(对于单个框,0 0 是内边距边缘的左上角,100% 100% 是右下角。)

border-box

位置相对于 边框框

fill-box

位置相对于 对象边界框

stroke-box

位置相对于 描边边界框

view-box

使用最近的 SVG 视口 作为参考框。

如果为创建 viewBox 属性的 SVG 视口 指定了属性:

  • 参考框定位在由 viewBox 属性建立的坐标系的原点处。

  • 参考框的尺寸设置为 viewBox 属性的 宽度高度 值。

对于没有关联 CSS 布局框的 SVG 元素,content-boxpadding-boxborder-box 的值计算为 fill-box

对于具有关联 CSS 布局框的元素,fill-boxstroke-boxview-box 的值计算为 mask-origin 的初始值。

注意: mask-origin 属性类似于 background-origin 属性 [CSS3BG],但它有一组不同的值,并且具有不同的初始值。

注意: 如果 mask-clippadding-boxmask-originborder-boxmask-positiontop left(初始值),并且元素有非零边框,则 蒙版层图像的顶部和左侧将被裁剪。

参见 “分层多个蒙版层图像” 以了解 mask-origin 如何与其他逗号分隔的蒙版属性交互以形成每个蒙版层。

7.7. 调整蒙版图像大小: mask-size 属性

名称: mask-size
值: <bg-size>#
初始值: auto
应用于: 所有元素。在 SVG 中,适用于 容器元素,不包括 defs 元素,所有 图形元素use 元素
是否继承:
百分比: 不适用
计算值: 按指定,但长度转为绝对值
规范顺序: 按语法
动画类型: 可重复列表
媒体: 视觉

指定 蒙版层图像的大小。

参见 background-size 属性 [CSS3BG] 以了解属性值的定义。

参见 “分层多个蒙版层图像” 以了解 mask-size 如何与其他逗号分隔的蒙版属性交互以形成每个蒙版层。

7.8. 合成蒙版层: mask-composite 属性

名称: mask-composite
值: <compositing-operator>#
初始值: add
应用于: 所有元素。在 SVG 中,适用于 容器元素,不包括 defs 元素,和所有 图形元素
是否继承:
百分比: 不适用
计算值: 按指定
规范顺序: 按语法
动画类型: 离散
媒体: 视觉
<compositing-operator> = add | subtract | intersect | exclude

每个关键字代表一个 Porter-Duff 合成运算符 [COMPOSITING-1],定义了当前蒙版层与其下蒙版层之间的合成操作。

在下文中,当前蒙版层称为 ,其下所有蒙版层(应用了相应的合成操作符)称为 目标

add

叠加在 目标上。(参见 Porter-Duff 合成运算符 源叠加 以获取更多详细信息。)

subtract

放置在不重叠 目标的地方。(参见 Porter-Duff 合成运算符 源外 以获取更多详细信息。)

intersect

目标重叠的 部分替换 目标。(参见 Porter-Duff 合成运算符 源内。)

exclude

合并 目标的不重叠区域。(参见 Porter-Duff 合成运算符 XOR。)

如果没有进一步的蒙版层,必须忽略合成运算符。蒙版层不应与元素的内容或元素背后的内容进行合成,而应当仿佛它们在一个隔离的组中被渲染。

在应用当前蒙版层的合成操作之前,必须先对当前蒙版层下的所有蒙版层进行合成。

这个例子使用了两个 蒙版层图像circle.svgrect.svg
源叠加合成蒙版层的例子

两个 蒙版层图像通过 mask-image 属性进行引用:

mask-image: circle.svg, rect.svg;

含有 rect.svg 的蒙版层位于含有 circle.svg 的蒙版层下方。这意味着 circle.svgrect.svg 离用户更近。

通过 mask-composite 属性,作者可以选择不同的方式来组合多个蒙版层。

以下示例指定了两个蒙版层和两个合成操作符。
mask-image: rect.svg, circle.svg;
mask-composite: add, exclude;

rect.svgcircle.svg 使用了 add 合成运算符。没有进一步的蒙版层使用 exclude,因此 exclude 被忽略。

这是一个具有不同合成运算符的三个蒙版层的例子。
mask-image: trapeze.svg, circle.svg, rect.svg;
mask-composite: subtract, add;

首先,circle.svg 被“添加”到 rect.svg 上。在第二步中,只可见 trapeze.svg 未与前两层合成结果重叠的部分。

源叠加合成蒙版层的例子

参见 “分层多个蒙版层图像” 了解 mask-composite 如何与其他逗号分隔的蒙版属性交互以形成每个蒙版层。

7.9. 蒙版简写: mask 属性

名称: mask
值: <mask-layer>#
初始值: 参见各属性
应用于: 所有元素。在 SVG 中,适用于 容器元素,不包括 defs 元素,和所有 图形元素use 元素
是否继承:
百分比: 参见各属性
计算值: 参见各属性
规范顺序: 按语法
动画类型: 参见各属性
媒体: 视觉
<mask-layer> = <mask-reference> || <position> [ / <bg-size> ]? ||<repeat-style> || <geometry-box> || [ <geometry-box> | no-clip ] || <compositing-operator> || <masking-mode>

如果存在一个 <geometry-box> 值和 no-clip 关键字,那么 <geometry-box> 设置 mask-origin,而 no-clip 设置 mask-clip 为该值。

如果存在一个 <geometry-box> 值且不存在 no-clip 关键字,那么 <geometry-box> 同时设置 mask-originmask-clip 为该值。

如果存在两个 <geometry-box> 值,第一个设置 mask-origin,第二个设置 mask-clip

属性 使用值 中的 mask-repeatmask-positionmask-clipmask-originmask-size 的值在 <mask-reference> 引用 mask 元素时不应产生效果。在这种情况下,该元素定义了蒙版图层图像的位置、大小和剪裁。

简写属性 mask 还会将 mask-border 重置为初始值。因此,建议作者使用 mask 简写,而不是其他简写或单独的属性,以覆盖级联中的任何先前蒙版设置。这将确保 mask-border 也已重置,以允许新样式生效。

7.10. 蒙版图像渲染模型

mask-image 属性的值不是 none 时,应用该属性的元素(使用 CSS 盒模型格式化)将以与 CSS opacity [CSS3COLOR] 相同的方式建立 层叠上下文,并将该元素的所有后代作为一个组进行渲染,并对整个组应用蒙版。

mask-image 属性不会影响任何元素的 CSS 盒子的几何形状或点击测试。

mask 属性是 SVG 元素的 展示属性

7.10.1. 蒙版处理

在以下部分中,蒙版图像 指的是 蒙版图层图像蒙版边框图像

蒙版图像可以通过两种不同的方式来解释,具体取决于计算蒙版值的方式,这些蒙版值将与目标的 alpha 值相乘。

第一种也是最简单的方式是使用蒙版图像的 alpha 通道。在这种情况下,蒙版值在给定点处的值仅仅是该点的 alpha 通道值。颜色通道对蒙版值没有影响。

第二种方式是使用蒙版图像的亮度。在这种情况下,蒙版值在给定点的计算方法是通过颜色通道值和 alpha 通道值,使用以下步骤进行计算。

  1. 从颜色通道值计算亮度值。

    • 如果蒙版元素上的 color-interpolation 属性的计算值为 linearRGB,则将原始图像颜色值(可能在 sRGB 颜色空间中)转换为 linearRGB 颜色空间。

    • 然后,使用非预乘的 RGB 颜色值,应用亮度到 alpha 的系数(定义在 feColorMatrix 滤镜原语中 [SVG11])将 RGB 颜色值转换为亮度值。

  2. 将计算得出的亮度值与相应的 alpha 值相乘以生成蒙版值。

无论使用哪种方法,计算蒙版值的过程都假设蒙版内容是一个四通道的 RGBA 图像对象。对于其他类型的图像对象,要求进行特殊处理,具体如下。

对于用于蒙版的三通道 RGB 图像对象(例如,引用一个三通道图像文件时),效果就好像该对象被转换为四通道 RGBA 图像,alpha 通道统一设置为 1。

对于用于蒙版的单通道图像(例如,引用单通道灰度图像文件时),效果就好像该对象被转换为四通道 RGBA 图像,其中引用对象的单个通道用于计算三个颜色通道,alpha 通道统一设置为 1。

注意: 在引用灰度图像文件时,计算颜色通道时必须考虑到编码灰度值与线性光值之间的传递曲线。

注意: 对于用于蒙版操作的 SVG 图形元素(例如,circletext),均视为四通道 RGBA 图像。

蒙版的效果与如果没有蒙版但将给定对象的 alpha 通道与蒙版的结果蒙版值相乘所产生的效果是相同的。

未被 蒙版图像 覆盖的区域视为透明黑色。蒙版值为 0。

注意: 带有重复 蒙版图像 瓦片的蒙版可能会彼此偏移。蒙版图像 之间的空间视为透明黑色蒙版。

7.10.2. 叠加多个蒙版图像

一个盒子的蒙版可以有多层。层数由 mask-image 属性的逗号分隔值的数量决定。即使在包含其他 <mask-reference> 的值列表中有一个 none 的值,它仍然会创建一层。

参见 多重背景图像叠加 [CSS3BG]

mask-modemask-composite 在 CSS 背景和边框中没有对应项 [CSS3BG]。与其他有对应项的蒙版属性类似,值列表从第一个值开始匹配:末尾的多余值将不使用。如果某个属性没有足够的逗号分隔值来匹配层数,UA 必须通过重复值列表来计算使用值,直到值足够为止。

所有 蒙版图层图像 都会转换为 alpha 蒙版(如有必要,请参阅 蒙版处理)并通过合成操作结合起来,考虑到由 mask-composite 指定的合成操作符。

8. 边框盒蒙版

使用 mask-border,图像可以分为九块:四个角、四个边缘和中间的一块,如下图所示。

蒙版边框图像的各部分

蒙版边框图像的各部分。

这些部分可以以不同的方式切割、缩放和拉伸以适应 蒙版边框图像区域 的大小。然后将变形的图像用作蒙版。mask-border 的语法与 CSS 背景和边框中的 border-image 属性对应 [CSS3BG]

以下示例中的 蒙版边框图像 被分为四个角,尺寸为 75 像素,四个边缘和中间部分被拉伸和缩放。
蒙版边框的示例

“mask-border”的示例。左边的对象是要蒙版的对象。第二张图像是 alpha 蒙版,最后一张图像是蒙版对象。

div {
    background: linear-gradient(bottom, #F27BAA 0%, #FCC8AD 100%);
    mask-border-slice: 25 fill;
    mask-border-repeat: stretch;
    mask-border-source: url(mask.png);
}

8.1. 蒙版边框图像源:mask-border-source 属性

名称: mask-border-source
值: none | <image>
初始值: none
适用于: 所有元素。在 SVG 中,适用于 容器元素,排除 defs 元素,所有 图形元素 以及 use 元素
是否继承:
百分比: 不适用
计算值: 关键字 none 或计算的 <image>
规范顺序: 按照语法
动画类型: 离散
媒体: 视觉

指定用于 蒙版边框图像 的图像。

图像如果为空(宽度或高度为 0)、下载失败、不存在或无法显示(例如格式不受支持),则会被忽略。它仍然作为 蒙版边框图像 计入,但不会遮罩该元素。

参见 “蒙版处理” 了解如何处理 蒙版边框图像

计算值为非 none 时,会创建一个 堆叠上下文 [CSS21],类似于 CSS 中 opacity 属性对非 1 的值产生的效果 [CSS3COLOR]

mask-border-sourcemask-image 可以独立指定。如果这两个属性都有非 none 的值,则该元素会依次被两个遮罩操作所遮罩。

注意: mask-image 的应用顺序无论是在 mask-border-source 之前还是之后,结果都是一样的。

8.2. 蒙版边框图像解释:mask-border-mode 属性

名称: mask-border-mode
值: luminance | alpha
初始值: alpha
适用于: 所有元素。在 SVG 中,适用于 容器元素,排除 defs 元素,所有 图形元素 以及 use 元素
是否继承:
百分比: 不适用
计算值: 如指定
规范顺序: 按照语法
动画类型: 离散
媒体: 视觉

mask-border-mode 属性表示是否将 <image> 值用于 mask-border-source 处理时视为亮度蒙版或 alpha 蒙版。(参见 蒙版处理。)

值的含义如下:

alpha

值为 alpha 时,表示使用 蒙版边框图像 的 alpha 值作为蒙版值。参见 计算蒙版值

luminance

值为 luminance 时,表示使用 蒙版边框图像 的亮度值作为蒙版值。参见 计算蒙版值

mask-modemask-type 属性不应影响 蒙版边框图像 类型。

8.3. 蒙版边框图像切割:mask-border-slice 属性

名称: mask-border-slice
值: <number-percentage>{1,4} fill?
初始值: 0
适用于: 所有元素。在 SVG 中,适用于 容器元素,排除 defs 元素,所有 图形元素 以及 use 元素
是否继承:
百分比: 参考 蒙版边框图像 的大小
计算值: 如指定
规范顺序: 按照语法
动画类型: 离散
媒体: 视觉

此属性指定从 蒙版边框图像 顶部、右侧、底部和左侧的向内偏移,将其分为九个区域:四个角,四个边缘和一个中间部分。除非存在 fill 关键字,否则中间图像部分将被丢弃并视为完全不透明的白色(中间部分覆盖的内容不会被蒙版,直接显示)。

参见 border-image-slice 属性 [CSS3BG] 了解属性值的定义。

8.4. 蒙版区域:mask-border-width 属性

名称: mask-border-width
值: [ <length-percentage> | <number> | auto ]{1,4}
初始值: auto
适用于: 所有元素。在 SVG 中,适用于 容器元素,排除 defs 元素,所有 图形元素 以及 use 元素
是否继承:
百分比: 相对于 蒙版边框图像区域 的宽度/高度
计算值: 所有 <length> 变为绝对值,否则按指定计算
规范顺序: 按照语法
动画类型: 离散
媒体: 视觉

蒙版边框图像 绘制在一个称为 蒙版边框图像区域 的区域内。该区域的边界默认对应于边框盒,参见 mask-border-outset

参见 border-image-width 属性 [CSS3BG] 了解属性值的定义。

注意: 对于没有关联布局盒的 SVG 元素,border-width 被视为 0

8.5. 边缘溢出:mask-border-outset 属性

名称: mask-border-outset
值: [ <length> | <number> ]{1,4}
初始值: 0
适用于: 所有元素。在 SVG 中,适用于 容器元素,排除 defs 元素,所有 图形元素use 元素
是否继承:
百分比: 不适用
计算值: 所有 <length> 变为绝对值,否则按指定计算
规范顺序: 按照语法
动画类型: 离散
媒体: 视觉

该值指定了蒙版边框图像区域超出边框盒的范围。如果有四个值,则它们依次设置上、右、下、左边的溢出值。如果左值缺失,则与右值相同;如果下值缺失,则与上值相同;如果右值缺失,则与上值相同。

mask-border-width 类似,<number> 表示相应的border-width 的倍数。任何 mask-border-outset 的值不允许为负数。

注意: 对于没有关联布局盒的 SVG 元素,border-width 被视为 0

8.6. 蒙版边框图像平铺:mask-border-repeat 属性

名称: mask-border-repeat
值: [ stretch | repeat | round | space ]{1,2}
初始值: stretch
适用于: 所有元素。在 SVG 中,适用于 容器元素,排除 defs 元素,所有 图形元素use 元素
是否继承:
百分比: 不适用
计算值: 按指定值计算
规范顺序: 按照语法
动画类型: 离散
媒体: 视觉

该属性指定如何缩放和平铺 蒙版边框图像 的侧面和中间部分。第一个关键字适用于水平边,第二个适用于垂直边。如果省略第二个关键字,则假定与第一个相同。

请参阅 border-image-repeat 属性 [CSS3BG] 了解属性值的定义。

缩放和平铺 蒙版边框图像 部分的确切过程请参见 使用蒙版边框图像进行遮罩 部分。

8.7. 蒙版边框图像简写:mask-border 属性

名称: mask-border
值: <'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'>
初始值: 参见各个属性
适用于: 参见各个属性
是否继承:
百分比: 不适用
计算值: 参见各个属性
规范顺序: 按语法
动画类型: 参见各个属性
媒体: 视觉

这是一个用于设置 mask-border-source, mask-border-slice, mask-border-width, mask-border-outset, mask-border-repeatmask-border-mode 的简写属性。省略的值会被设置为其初始值。

注意: mask 简写会重置属性 mask-border, mask-border-source, mask-border-slice, mask-border-width, mask-border-outset, mask-border-repeatmask-border-mode

8.8. 使用蒙版边框图像进行遮罩

mask border image(由 mask-border-source 给定)通过 mask-border-slice 值切割后,产生的九个图像将按四个步骤进行缩放、定位并平铺到其对应的 mask border image 区域,如 绘制边框图像 部分所述 [CSS3BG]

mask-border-source 属性应用于使用 CSS 盒模型格式化的元素时, 会以与 CSS opacity [CSS3COLOR] 相同的方式建立一个 堆叠上下文,并且将遮罩应用于整个组渲染所有该元素的子代。

mask-border-source 属性对任何元素的 CSS 盒子的几何形状或命中测试没有影响。

9. SVG 蒙版来源

9.1. mask 元素

名称: mask
类别: 容器元素, 从不渲染元素
内容模型: 任何顺序下列元素的任意数量:
属性:
DOM 接口: SVGMaskElement

属性定义:

maskUnits = "userSpaceOnUse | objectBoundingBox"

定义属性 xywidthheight 的坐标系统。

userSpaceOnUse

xywidthheight 表示当前引用 mask 元素时的 用户坐标系统 中的值(即引用 用户坐标系统 的元素通过 mask 属性引用 mask 元素时的用户坐标系统)。

objectBoundingBox

xywidthheight 表示应用了该蒙版的元素的 对象边界框 的分数或百分比。用户坐标等同于CSS单位px的大小。

如果属性 maskUnits 未指定,则效果相当于指定了 objectBoundingBox 值。

可动画:是。

maskContentUnits = "userSpaceOnUse | objectBoundingBox"

定义 mask 的内容的坐标系统。

userSpaceOnUse

用户坐标系 对于 mask 元素的内容,是在引用 mask 元素时存在的当前 用户坐标系 (即,通过 mask 属性引用 mask 元素的元素的 用户坐标系)。

objectBoundingBox

坐标系统的原点位于应用了剪切路径的元素的边界框的左上角,并且具有与该 边界框 相同的宽度和高度。用户坐标等同于CSS单位px的大小。

如果属性 maskContentUnits 未指定,则效果相当于指定了 userSpaceOnUse 值。

可动画:是。

x = "<length-percentage>"

矩形的一个角在x轴上的坐标,用于最大的可能的离屏缓冲区。如果未指定该属性,但至少指定了 ywidthheight 属性,则效果相当于指定了值 -10%

可动画:是。

y = "<length-percentage>"

矩形的一个角在y轴上的坐标,用于最大的可能的离屏缓冲区。如果未指定该属性,但至少指定了 xwidthheight 属性,则效果相当于指定了值 -10%

可动画:是。

width = "<length-percentage>"

最大的可能的离屏缓冲区的宽度。负值或零值会禁用元素的渲染。如果未指定该属性,但至少指定了 xyheight 属性,则效果相当于指定了值 120%

可动画:是。

height = "<length-percentage>"

最大的可能的离屏缓冲区的高度。负值或零值会禁用元素的渲染。如果未指定该属性,但至少指定了 xywidth 属性,则效果相当于指定了值 120%

可动画:是。

如果至少指定了一个属性 xywidthheight,则给定对象和由 xywidthheight 定义的矩形将建立一个当前剪切路径。蒙版的渲染内容必须被该当前剪切路径剪裁。

CSS 属性从 mask 元素的祖先继承;属性不会从引用 mask 元素的元素继承。

mask 元素从不直接渲染;它们的唯一用途是作为通过 mask 属性引用的对象。opacityfilterdisplay 属性不适用于 mask 元素;因此,即使 display 属性设置为非 none 的值,mask 元素也不会直接渲染,且即使 display 属性在 mask 元素或其任一祖先上被设置为 nonemask 元素仍然可以被引用。

9.2. 蒙版源解释: mask-type 属性

名称: mask-type
值: luminance | alpha
初始值: luminance
应用于: mask 元素
继承:
百分比: 不适用
计算值: 如指定
规范顺序: 按语法
动画类型: 离散
媒体: 视觉

mask-type 属性定义了 mask 元素的内容是作为亮度蒙版还是 alpha 蒙版处理,如 计算蒙版值 中所述。

值的含义如下:

luminance

表示应使用蒙版的亮度值。

alpha

表示应使用蒙版的 alpha 值。

mask-type 属性允许 mask 元素的作者指定首选的蒙版模式。然而,作者可以通过在被蒙版内容上将 mask-mode 的值设置为 match-source 之外的其他值来覆盖此首选项。

在以下示例中,mask-type 的计算值是 luminancemask-mode 的计算值是 match-source。UA 必须遵循 mask 元素上定义的首选蒙版模式。
<svg>
  <mask style="mask-type: luminance;" id="mask">
    ...
  </mask>
</svg>

<p style="mask-image: url(#mask); mask-mode: auto;">
  这是被蒙版的内容。
</p>

在下一个示例中,mask-mode 的计算值为 alpha 并覆盖了 mask 元素上的首选项,该首选项计算为 luminance蒙版图层图像 用作 alpha 蒙版。

lt;svg>
 <mask style="mask-type: luminance;" id="mask2">
   ...
 </mask>
lt;/svg>

lt;p style="mask-image: url(#mask2); mask-mode: alpha;">
 这是被蒙版的内容。
lt;/p>

mask-type 属性是 SVG 元素的 呈现属性

10. 隐私与安全注意事项

遮罩操作的执行时间应独立于源像素和目标像素。遮罩操作的实现必须确保无论像素值如何,始终耗费相同的时间。如果不遵循此规则,攻击者可能会推断出信息并发起计时攻击。

计时攻击是一种通过研究操作所需的时间来获取受保护内容信息的方法。如果,例如绘制红色像素的时间比绿色像素更长,则可能能够在不访问元素内容的情况下大致重构出正在渲染的元素的图像。

<mask-source><clip-source> 在获取资源方面有特殊要求。

用户代理必须使用由 潜在 CORS 启用的获取 方法,该方法由 [FETCH] 规范定义,用于所有 <mask-source><clip-source><image> 值的 mask-imagemask-border-sourceclip-path 属性。获取资源时,用户代理必须使用“匿名”模式,将引用来源设置为样式表的 URL,并将来源设置为包含文档的 URL。如果因此导致网络错误,则效果等同于指定了值 none

附录A: 已弃用的clip属性

名称: clip
值: rect() | auto
初始值: auto
适用于: 绝对定位元素。在SVG中,适用于建立新视口的元素pattern元素和mask元素。
是否继承:
百分比: 不适用
计算值: 按指定计算
规范顺序: 按语法
动画类型: 通过计算值
媒体: 视觉

本规范已弃用clip属性。建议作者使用clip-path属性代替。用户代理必须支持clip属性。

clip属性仅适用于绝对定位的元素。在SVG中,它适用于建立新视口的元素pattern元素和mask元素。值的含义如下:

auto

元素不会被裁剪。

rect() = rect( <top>, <right>, <bottom>, <left> )

<top><bottom> 指定从盒子上边框的偏移量,<right><left> 指定从左边框的偏移量。作者应使用逗号分隔偏移值。用户代理必须支持使用逗号分隔,但也可能支持不带逗号的分隔(但不能混合使用),因为该规范的先前版本对此含糊不清。

<top><right><bottom><left> 可以具有 <length> 值,或 auto。允许使用负长度。值 auto 表示剪裁区域的给定边缘将与元素生成的边框盒相同(即 auto 表示与 0 相同,适用于 <top><left>;同样,对于 <bottom>,结果与使用的高度加上垂直内边距和边框宽度之和相同;对于 <right>,结果与使用的宽度加上水平内边距和边框宽度之和相同,这样四个 auto 值会使剪裁区域与元素的边框盒相同)。

当坐标舍入到像素坐标时,应注意当 <left><right> 具有相同值时(或 <top><bottom> 具有相同值时),不会有像素仍然可见,反之当这些值为 auto 时,确保不会隐藏元素边框盒内的任何像素。

clip 属性是SVG元素的展示属性

示例:以下两个规则:
p#one { clip: rect(5px, 40px, 45px, 5px); }
p#two { clip: rect(5px, 55px, 45px, 5px); }

假设两个P元素的尺寸分别为50x55像素,将分别创建由虚线限定的矩形剪裁区域,如下图所示:

rect形状的值

此图说明了两个相邻的块框,具有不同尺寸的矩形剪裁区域。(参见长描述。)

附录B: 计算描边边界框

根据element的类型,计算描边边界框的算法如下:

不包含useimage图形元素
包含文本内容元素a元素
  1. boxelement对象边界框初始化的矩形。

  2. 如果stroke-width使用值 <= 0 或stroke的使用值为none,则返回box

  3. delta为膨胀值,初始化为stroke-width的一半。

  4. 如果element不是rectellipsecircleimage,则按以下顺序执行适用的条件:

    使用的stroke-linejoin值为miter
    1. miterstroke-miterlimit的使用值。

    2. 如果miter小于√2,并且stroke-linecap的使用值为square,则将delta乘以√2。否则,将delta乘以miter

    使用的stroke-linecap值为square
    1. delta乘以√2。

  5. delta的值膨胀box

  6. 返回box

注意: stroke-opacitystroke-dasharraystroke-dashoffset的值不会影响描边边界框的计算。

容器元素
use
  1. parent容器元素,如果它是一个,否则为use元素影子树的根。

  2. 对每个parent的子元素child

    1. 调用描边边界框算法计算child

    2. childBox为调用算法返回的边界框值。

    3. childBoxchild的坐标空间映射到parent的坐标空间。

  3. box为所有childBox的并集。

  4. 返回box

image
  1. 返回element对象边界框

注意: 将来的SVG规范可能会覆盖此部分。

附录C: DOM接口

接口 SVGClipPathElement

SVGClipPathElement接口对应于clipPath元素。

[Exposed=Window]
interface SVGClipPathElement : SVGElement {
  readonly attribute SVGAnimatedEnumeration clipPathUnits;
  readonly attribute SVGAnimatedTransformList transform;
};
属性:
clipPathUnits 类型为 SVGAnimatedEnumeration,只读

对应于clipPathUnits属性的clipPath元素。取值为SVGUnitTypes定义的常量之一。

transform 类型为 SVGAnimatedTransformList,只读

对应于给定元素的呈现属性transform

接口 SVGMaskElement

SVGMaskElement接口对应于mask元素。

[Exposed=Window]
interface SVGMaskElement : SVGElement {
  readonly attribute SVGAnimatedEnumeration maskUnits;
  readonly attribute SVGAnimatedEnumeration maskContentUnits;
  readonly attribute SVGAnimatedLength x;
  readonly attribute SVGAnimatedLength y;
  readonly attribute SVGAnimatedLength width;
  readonly attribute SVGAnimatedLength height;
};
属性:
maskUnits, 类型为 SVGAnimatedEnumeration, 只读

对应给定mask元素上的maskUnits属性。取值为定义在SVGUnitTypes中的常量之一。

maskContentUnits, 类型为 SVGAnimatedEnumeration, 只读

对应给定mask元素上的maskContentUnits属性。取值为定义在SVGUnitTypes中的常量之一。

x, 类型为 SVGAnimatedLength, 只读

对应给定mask元素上的x属性。

y, 类型为 SVGAnimatedLength, 只读

对应给定mask元素上的y属性。

width, 类型为 SVGAnimatedLength, 只读

对应给定mask元素上的width属性。

height, 类型为 SVGAnimatedLength, 只读

对应给定mask元素上的height属性。

自上次发布以来的更改

2014年8月26日候选推荐标准 以来,进行了以下更改。

2014年5月22日工作草案以来,进行了以下更改。

2014年2月13日工作草案以来,进行了以下更改。

2013年10月29日最后通告工作草案以来,进行了以下更改。

2013年6月20日工作草案以来,进行了以下显著更改。

2012年11月15日工作草案以来,进行了以下显著更改。

详见更改日志

致谢

感谢Elika J. Etemad、Cameron McCormack、Liam R. E. Quin、Björn Höhrmann、Alan Stearns、Jarek Foksa、David Baron、Boris Zbarsky、Markus Stange和Sara Soueidan的仔细审查、评论和修正。特别感谢CJ Gammon提供的图形资源。

一致性

文档约定

一致性要求以描述性断言和 RFC 2119 术语的结合方式表达。关键字“必须”(MUST),“不得”(MUST NOT),“必需”(REQUIRED),“应”(SHALL),“不应”(SHALL NOT),“应该”(SHOULD),“不应该”(SHOULD NOT),“建议”(RECOMMENDED),“可以”(MAY)和“可选的”(OPTIONAL)在本文件的规范部分中,按 RFC 2119 的描述进行解释。为了便于阅读,这些词汇在本规范中并非全大写。

除非明确标记为非规范的部分、示例和注释外,本规范的所有文本都是规范性的。[RFC2119]

本规范中的示例通过“例如”一词引入,或通过class="example"与规范文本区分开来,例如:

这是一个说明性示例。

说明性注释以“注”一词开头,并通过class="note"与规范文本区分开来,例如:

注:这是一个说明性注释。

规范部分中的建议性内容通过<strong class="advisement">样式突出显示,例如: 用户代理必须提供可访问的替代方案。

一致性类别

本规范的一致性定义分为三类:

样式表
一个CSS样式表
渲染器
一个用户代理(UA),它解释样式表的语义并渲染使用它们的文档。
创作工具
一个用户代理(UA),它编写样式表。

如果样式表的所有语法语句均根据该模块中定义的通用CSS语法和每个功能的个体语法是有效的,则该样式表符合本规范。

如果渲染器不仅根据相关规范解释样式表,还通过正确解析并相应渲染文档支持本规范定义的所有功能,则该渲染器符合本规范。但是,如果用户代理由于设备限制而无法正确渲染文档,则不视为不符合规范。(例如,用户代理不要求在单色显示器上渲染颜色。)

如果创作工具编写的样式表在语法上符合通用CSS语法以及本模块中每个功能的个体语法,并符合本模块中描述的样式表的所有其他一致性要求,则该创作工具符合本规范。

部分实现

为了使作者能够利用向前兼容的解析规则分配备用值,CSS 渲染器必须将没有可用支持级别的规则、属性、属性值、关键字和其他语法结构视为无效,并忽略。特别是,用户代理不得选择性地忽略不支持的值,而在一个多值属性声明中仅保留支持的值:如果任意一个值被视为无效(不支持的值必须如此),则 CSS 规定整个声明必须被忽略。

不稳定和专有功能的实现

为了避免与未来稳定的CSS功能发生冲突,CSSWG建议在实现不稳定功能和专有扩展遵循最佳实践

非实验性实现

一旦规范进入候选推荐阶段(Candidate Recommendation),就可以进行非实验性实现,且实现者应当发布符合规范并且经过正确实现验证的无前缀版本。

为了建立和维护CSS在不同实现中的互操作性,CSS工作组要求非实验性的CSS渲染器在发布任何CSS功能的无前缀版本之前,向W3C提交实现报告(如有必要,还需提交用于该实现报告的测试用例)。提交给W3C的测试用例需接受CSS工作组的审核和修正。

关于提交测试用例和实现报告的更多信息可以在CSS工作组的网站https://www.w3.org/Style/CSS/Test/找到。相关问题可以发送到public-css-testsuite@w3.org邮件列表。

候选推荐退出标准

为了让本规范进入提案推荐阶段(Proposed Recommendation),每个功能必须至少有两个独立的、可互操作的实现。每个功能可以由不同的产品实现,不要求所有功能都由单个产品实现。为了达到此标准,我们定义以下术语:

独立
每个实现必须由不同的开发方开发,且不能共享、重用或派生于其他符合条件的实现代码。与本规范的实现无关的代码部分不受此要求的限制。
可互操作
通过官方CSS测试套件中的相应测试用例,或者如果该实现不是Web浏览器,则通过等效测试。如果用户代理(UA)被用于声明互操作性,则必须为该用户代理创建所有相关测试的等效测试。此外,如果该UA被用于声明互操作性,则必须有一个或多个其他用户代理也能以相同方式通过这些等效测试,以实现互操作性。等效测试必须公开以便进行同行评审。
实现
一个用户代理,该用户代理:
  1. 实现了该规范。
  2. 向公众提供。该实现可以是已发布的产品或其他公开可用的版本(例如,测试版、预发布版本或“夜间构建”)。非已发布产品的版本必须已实现该功能至少一个月,以证明其稳定性。
  3. 非实验性版本(即专为通过测试套件而设计的版本,不打算用于正常使用)。

该规范将至少在候选推荐阶段保持六个月。

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[COMPOSITING-1]
Rik Cabanier; Nikos Andronikos. 合成与混合第1级。2015年1月13日。CR。URL: https://www.w3.org/TR/compositing-1/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS碎片化模块第4级。2018年12月18日。WD。URL: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.。CSS层叠与继承第5级。2021年6月8日。WD。URL: https://www.w3.org/TR/css-cascade-5/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley. CSS颜色模块第4级。2021年6月1日。WD。URL: https://www.w3.org/TR/css-color-4/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS显示模块第3级。2020年12月18日。CR。URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS字体模块第4级。2021年7月29日。WD。URL: https://www.w3.org/TR/css-fonts-4/
[CSS-FONTS-5]
Myles Maxfield; Chris Lilley. CSS字体模块第5级。2021年7月29日。WD。URL: https://www.w3.org/TR/css-fonts-5/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS图像模块第3级。2020年12月17日。CR。URL: https://www.w3.org/TR/css-images-3/
[CSS-INLINE-3]
Dave Cramer; Elika Etemad; Steve Zilles. CSS内联布局模块第3级。2020年8月27日。WD。URL: https://www.w3.org/TR/css-inline-3/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS溢出模块第3级。2020年6月3日。WD。URL: https://www.w3.org/TR/css-overflow-3/
[CSS-SHAPES]
Vincent Hardy; Rossen Atanassov; Alan Stearns. CSS形状模块第1级。2014年3月20日。CR。URL: https://www.w3.org/TR/css-shapes-1/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS文本模块第3级。2021年4月22日。CR。URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-DECOR-3]
Elika Etemad; Koji Ishii. CSS文本装饰模块第3级。2019年8月13日。CR。URL: https://www.w3.org/TR/css-text-decor-3/
[CSS-UI-3]
Tantek Çelik; Florian Rivoal. CSS基本用户界面模块第3级(CSS3 UI)。2018年6月21日。REC。URL: https://www.w3.org/TR/css-ui-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS值和单位模块第4级。2021年7月15日。WD。URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS书写模式第3级。2019年12月10日。REC。URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS书写模式第4级。2019年7月30日。CR。URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS21]
Bert Bos; et al. 层叠样式表第2级修订1(CSS 2.1)规范。2011年6月7日。REC。URL: https://www.w3.org/TR/CSS21/
[CSS3-TRANSFORMS]
Simon Fraser; et al. CSS变换模块第1级。2019年2月14日。CR。URL: https://www.w3.org/TR/css-transforms-1/
[CSS3BG]
Bert Bos; Elika Etemad; Brad Kemper. CSS背景与边框模块第3级。2021年7月26日。CR。URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS3VAL]
Tab Atkins Jr.; Elika Etemad. CSS值和单位模块第3级。2019年6月6日。CR。URL: https://www.w3.org/TR/css-values-3/
[FETCH]
Anne van Kesteren. Fetch标准。Living Standard。URL: https://fetch.spec.whatwg.org/
[FILL-STROKE-3]
Elika Etemad; Tab Atkins Jr. CSS填充和描边模块第3级。2017年4月13日。WD。URL: https://www.w3.org/TR/fill-stroke-3/
[FILTER-EFFECTS]
Dirk Schulze; Dean Jackson. 滤镜效果模块第1级。2018年12月18日。WD。URL: https://www.w3.org/TR/filter-effects-1/
[RFC2119]
S. Bradner. 用于指示需求级别的关键字。1997年3月。最佳当前实践。URL: https://datatracker.ietf.org/doc/html/rfc2119
[SVG11]
Erik Dahlström; 等. 可缩放矢量图形(SVG)1.1(第二版)。2011年8月16日。REC。URL: https://www.w3.org/TR/SVG11/
[SVG2]
Amelia Bellamy-Royds; 等. 可缩放矢量图形(SVG)2。2018年10月4日。CR。URL: https://www.w3.org/TR/SVG2/
[WebIDL]
Boris Zbarsky. Web IDL。2016年12月15日。ED。URL: https://heycam.github.io/webidl/

参考性引用

[CSS3COLOR]
Tantek Çelik; Chris Lilley; David Baron. CSS颜色模块第3级。2018年6月19日。REC。URL: https://www.w3.org/TR/css-color-3/

属性索引

名称 初始值 适用对象 继承 %ages 动画类型 规范顺序 计算值 媒体
clip rect() | auto auto 绝对定位元素。在SVG中,适用于建立新视口的元素、图案元素和遮罩元素。 n/a 按计算值 按语法 按指定 视觉
clip-path <clip-source> | [ <basic-shape> || <geometry-box> ] | none none 所有元素。在SVG中,适用于除defs元素之外的容器元素、所有图形元素以及use元素。 n/a 按计算值 按语法 按指定,但<url>值绝对化 视觉
clip-rule nonzero | evenodd nonzero 适用于SVG图形元素 n/a 离散 按语法 按指定 视觉
mask <mask-layer># 见单个属性 所有元素。在SVG中,适用于除defs元素之外的容器元素、所有图形元素以及use元素。 见单个属性 见单个属性 按语法 见单个属性 视觉
mask-border <'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'> 见单个属性 见单个属性 n/a 见单个属性 按语法 见单个属性 视觉
mask-border-mode luminance | alpha alpha 所有元素。在SVG中,适用于除defs元素之外的容器元素、所有图形元素以及use元素。 n/a 离散 按语法 按指定 视觉
mask-border-outset [ <length> | <number> ]{1,4} 0 所有元素。在SVG中,适用于除defs元素之外的容器元素、所有图形元素以及use元素。 n/a 离散 按语法 所有<length>值绝对化,否则按指定 视觉
mask-border-repeat [ stretch | repeat | round | space ]{1,2} stretch 所有元素。在SVG中,适用于除defs元素之外的容器元素、所有图形元素以及use元素。 n/a 离散 按语法 按指定 视觉
mask-border-slice <number-percentage>{1,4} 填充? 0 所有元素。在SVG中,适用于除defs元素之外的容器元素、所有图形元素以及use元素。 参照遮罩边界图像的大小 离散 按语法 按指定 视觉
mask-border-source none | <image> none 所有元素。在SVG中,适用于除defs元素之外的容器元素、所有图形元素以及use元素。 n/a 离散 按语法 关键字none或计算的<image> 视觉
mask-border-width [ <length-percentage> | <number> | auto ]{1,4} auto 所有元素。在SVG中,适用于除defs元素之外的容器元素、所有图形元素以及use元素。 相对于遮罩边界图像区域的宽度/高度 离散 按语法 所有<length>值绝对化,否则按指定 视觉
mask-clip [ <geometry-box> | no-clip ]# border-box 所有元素。在 SVG 中,适用于除 defs 元素外的容器元素、所有图形元素和 use 元素 不适用 离散 根据语法 按指定 视觉
mask-composite <compositing-operator># add 所有元素。在 SVG 中,适用于除 defs 元素外的容器元素和所有图形元素 不适用 离散 根据语法 按指定 视觉
mask-image <mask-reference># none 所有元素。在 SVG 中,适用于除 defs 元素外的容器元素、所有图形元素和 use 元素 不适用 离散 根据语法 关键词 none、已计算的 <image> 或已计算的 <url> 视觉
mask-mode <masking-mode># match-source 所有元素。在 SVG 中,适用于除 defs 元素外的容器元素、所有图形元素和 use 元素 不适用 离散 根据语法 按指定 视觉
mask-origin <geometry-box># border-box 所有元素。在 SVG 中,适用于除 defs 元素外的容器元素、所有图形元素和 use 元素 不适用 离散 根据语法 按指定 视觉
mask-position <position># 0% 0% 所有元素。在 SVG 中,适用于除 defs 元素外的容器元素、所有图形元素和 use 元素 参考遮罩绘制区域的尺寸减去遮罩层图像的尺寸;参见文本 background-position [CSS3BG] 可重复列表 根据语法 包含:两个代表原点的关键字和两个从该原点开始的偏移,每个偏移以绝对长度(如果给定 <length>)表示,否则以百分比表示。 视觉
mask-repeat <repeat-style># repeat 所有元素。在 SVG 中,适用于除 defs 元素外的容器元素、所有图形元素和 use 元素 不适用 离散 根据语法 包含:两个关键字,每个维度一个 视觉
mask-size <bg-size># auto 所有元素。在 SVG 中,适用于除 defs 元素外的容器元素、所有图形元素和 use 元素 不适用 可重复列表 根据语法 按指定,但长度为绝对值 视觉
mask-type luminance | alpha luminance mask 元素 不适用 离散 根据语法 按指定 视觉

IDL 索引

[Exposed=Window]
interface SVGClipPathElement : SVGElement {
  readonly attribute SVGAnimatedEnumeration clipPathUnits;
  readonly attribute SVGAnimatedTransformList transform;
};

[Exposed=Window]
interface SVGMaskElement : SVGElement {
  readonly attribute SVGAnimatedEnumeration maskUnits;
  readonly attribute SVGAnimatedEnumeration maskContentUnits;
  readonly attribute SVGAnimatedLength x;
  readonly attribute SVGAnimatedLength y;
  readonly attribute SVGAnimatedLength width;
  readonly attribute SVGAnimatedLength height;
};

问题索引

Firefox 禁用了引用违反内容模型的 clipPaths 元素的渲染。没有浏览器在使用间接引用时忽略 clipPath。<https://github.com/w3c/csswg-drafts/issues/17>
定义与影响其的 CSS 属性相关的原始几何形状,特别是在文本上。<https://github.com/w3c/csswg-drafts/issues/170>