CSS 遮罩模块第 1 级

W3C 候选推荐标准草案,

此版本
https://w3org.cn/TR/2021/CRD-css-masking-1-20210805/
最新发布版本
https://w3org.cn/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/
问题追踪
CSS 工作组问题仓库
文档内联
编辑
(Adobe Inc.)
(Mozilla Japan)
Tab Atkins Jr. (Google)
建议编辑此规范
GitHub 编辑器

摘要

CSS 遮罩提供了两种部分或完全隐藏视觉元素部分区域的方法:遮罩(masking)和裁剪(clipping)。

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

裁剪描述了视觉元素的可见区域。该区域可以使用特定的 SVG 图形元素或基本形状来描述。在此区域之外的所有内容都不会被渲染。

CSS 是一种用于描述结构化文档(如 HTML 和 XML)在屏幕、纸张等介质上渲染方式的语言。

关于本文档

本节描述了本文件发布时的状态。其他文件可能会取代本文件。W3C 当前出版物列表和本技术报告的最新修订版本可在 https://w3org.cn/TR/ 的 W3C 技术报告索引中找到。

本文件由 CSS 工作组发布,为候选推荐标准草案。发布为候选推荐标准并不意味着 W3C 成员的背书。候选推荐标准草案整合了来自上一个候选推荐标准的更改,工作组打算将其包含在后续的候选推荐标准快照中。

这是一份草案文档,可能会随时被其他文档更新、替换或废弃。将其作为非进行中工作引用是不恰当的。

请通过 在 GitHub 上提交问题(首选)来发送反馈,并在标题中包含规范代码“css-masking”,例如:“[css-masking] …评论摘要…”。所有问题和评论均已存档。或者,也可以将反馈发送至(已存档的)公共邮件列表 www-style@w3.org

本文档受 2020年9月15日版 W3C 流程文档 约束。

本文档由在 W3C 专利政策下运作的团体编写。W3C 维护着一份与该团体交付成果相关的专利披露公开列表;该页面还包含了披露专利的指南。任何对个人认为包含必要权利要求 (Essential Claim(s)) 的专利具有实际知情权的个人,必须根据 W3C 专利政策第 6 节披露相关信息。

1. 引言

本节不具有规范性。

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

1.1. 裁剪

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

Example Mask

裁剪路径(中)应用于填充有不同颜色的多边形(左)。这导致了一个“裁剪出”的形状(右)。

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

1.2. 遮罩

将遮罩应用于图形对象的效果,就如同通过遮罩将图形对象绘制到背景上,从而完全或部分地遮住图形对象的某些部分。

Example Mask

亮度遮罩(中)应用于填充有渐变的形状(左)。这导致了一个被遮罩的形状(右)。

遮罩使用 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]Clipping: the clip property 一节。

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

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

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

3.

本规范遵循 [CSS21] 中的 CSS 属性定义约定。基本形状在 CSS 形状模块级别 1 [CSS-SHAPES] 中定义。这些规范中未定义的值类型在 CSS 值和单位模块级别 3 [CSS3VAL] 中定义。

除了定义中列出的属性特定值外,本规范中定义的所有属性也都接受 CSS 范围内的关键字(如 inherit)作为其属性值 [CSS3VAL]。为保证可读性,未再明确重复说明。

4. 术语

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

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

5. 裁剪路径

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

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

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

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

考虑一个被应用于祖先的裁剪路径所裁剪的形状
<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 的圆形的元素,将不会接收 裁剪区域 之外的 click 事件。

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

名称clip-path
<clip-source> | [ <basic-shape> || <geometry-box> ] | none
初始值 none(无)
应用于所有元素。在 SVG 中,它适用于除 defs 元素之外的 容器元素、所有 图形元素use 元素
可继承
百分比 不可用
计算值 按指定,但 <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] 定义)作为裁剪路径。另请参阅 “Shapes from box values” [CSS-SHAPES]

fill-box

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

stroke-box

使用 笔触边界框 作为参考框。

view-box

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

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

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

  • 参考框的维度被设置为 viewBox 属性的 widthheight 值。

none(无)

不创建 裁剪路径

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

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

计算值除 none 外,会导致创建一个 层叠上下文 [CSS21],方式与 CSS opacity [CSS3COLOR] 在值不为 1 时相同。

如果 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 元素时所处的当前 用户坐标系 中的值(即通过 clip-path 属性引用 clipPath 元素的元素所处的 用户坐标系)。

objectBoundingBox(对象边界框)

该坐标系的原点位于应用裁剪路径的元素的 边界框 的左上角,宽度和高度与此 边界框 相同。用户坐标 的大小与 CSS px 单位相当。

如果未指定 clipPathUnits 属性,则效果如同指定了 userSpaceOnUse 一样。

可动画化: 是。

CSS 属性从其祖先继承到 clipPath 元素中;属性从引用 clipPath 元素的元素中继承。

clipPath 元素永远不会被直接渲染;其唯一用途是被 clip-path 属性引用。display 属性不适用于 clipPath 元素;因此,即使 display 属性设置为除 none 以外的值,clipPath 元素也不会被直接渲染,并且即使在 clipPath 元素或其任何祖先上的 display 属性设置为 none 时,clipPath 元素也可用于引用。

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

Firefox 禁止渲染引用内容模型被破坏的 clipPath 的元素。没有浏览器忽略 use 上带有间接引用的 clipPath。<https://github.com/w3c/csswg-drafts/issues/17>

每个子元素的原始几何形状(不包括如 fillstrokestroke-width 等渲染属性)在 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 图形元素
可继承
百分比 不可用
计算值 按指定值
规范顺序按语法
动画类型 离散 (discrete)
媒体视觉

clip-rule 属性指示用于确定给定点是否位于使用 图形元素 创建的 裁剪区域 内的算法。算法和 clip-rule 值的定义遵循 fill-rule 属性的定义。参见 SVG 1.1 [SVG11] 中的 “Fill Properties” 一节。

nonzero

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

evenodd

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

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

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

下图演示了 nonzero 规则

Shape with nonzero rule.

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

下图演示了 evenodd 规则

Shape with even-odd rule.

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

下面的代码片段将导致 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>
规范顺序按语法
动画类型 离散 (discrete)
媒体视觉

此属性设置元素的 遮罩层图像。其中

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

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

none(无)

none 被视为透明的黑色图像层。

计算值除 none 外,会导致创建一个 层叠上下文 [CSS21],方式与 CSS opacity [CSS3COLOR] 在值不为 1 时相同。

为空图像(零宽度或零高度)、下载失败、不是对 mask 元素的引用、不存在或无法显示(例如因为它不是受支持的图像格式)的遮罩引用,仍被视为透明黑色的图像层。

参见 “遮罩处理” 一节,了解如何处理 遮罩层图像

注意: <mask-reference> 列表中的 none 值可能会影响遮罩操作,具体取决于 mask-composite 指定的合成运算符。

注意: <mask-source> 被视为遮罩层,可以在可重复的 <mask-reference> 列表中与 <image> 或更多 <mask-source> 列表项组合使用。

注意: 元素也可以使用 mask-border-source 进行遮罩。参见 mask-border-source,了解该属性与 mask-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 元素
可继承
百分比 不可用
计算值 按指定值
规范顺序按语法
动画类型 离散 (discrete)
媒体视觉

mask-mode 属性指示 <mask-reference> 是作为亮度遮罩还是 Alpha 遮罩处理。(参见 遮罩处理。)

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

值的含义如下:

alpha

alpha 指示应将 遮罩层图像 的 Alpha 值用作遮罩值。参见 计算遮罩值

亮度 (Luminance)

luminance 指示应将 遮罩层图像 的亮度值用作遮罩值。参见 计算遮罩值

match-source

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

如果 mask-image 属性的 <mask-reference> 类型为 <image>,则应将 遮罩层图像 的 Alpha 值用作遮罩值。

在以下示例中,mask-type 属性将 mask 元素的遮罩类型值设置为 alphamask-image 属性引用了此 mask 元素,而 mask-mode 属性的值为 luminancemask-mode 属性将覆盖 mask-typeluminance 的定义。

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 元素
可继承
百分比 不可用
计算值 由两个关键字组成,每个维度一个
规范顺序按语法
动画类型 离散 (discrete)
媒体视觉

指定 遮罩层图像调整大小定位 后如何进行平铺。

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

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

Image of an element with a dotted mask.

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 元素
可继承
百分比 不可用
计算值 按指定值
规范顺序按语法
动画类型 离散 (discrete)
媒体视觉

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

mask-clip 属性对引用 mask 元素的 遮罩层图像 没有影响。xywidthheightmaskUnits 属性在 mask 元素上,确定了遮罩引用的 遮罩绘制区域

值的含义如下:

content-box

绘制的内容被限制(裁剪)到 内容盒

padding-box

绘制的内容被限制(裁剪)到 内边距盒

border-box

绘制的内容被限制(裁剪)到 边框盒

fill-box

绘制的内容被限制(裁剪)到 对象边界框

stroke-box

绘制的内容被限制(裁剪)到 笔触边界框

view-box

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

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

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

  • 参考框的维度被设置为 viewBox 属性的 widthheight 值。

no-clip

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

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

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

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

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

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

对于渲染为单个盒子的元素,指定 遮罩定位区域。对于渲染为多个盒子的元素(例如多行上的内联盒子,多个页面上的盒子),指定 box-decoration-break 作用于哪些盒子以确定遮罩定位区域。

content-box

该位置相对于 内容盒

padding-box

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

border-box

该位置相对于 边框盒

fill-box

该位置是相对于 对象外框(object bounding box)的。

stroke-box

该位置是相对于 描边外框(stroke bounding box)的。

view-box

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

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

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

  • 参考框的尺寸被设置为 viewBox 属性的 widthheight 值。

对于没有关联 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 元素以外的 容器元素 以及所有 图形元素
可继承
百分比 不可用
计算值 按指定值
规范顺序按语法
动画类型 离散 (discrete)
媒体视觉
<compositing-operator> = add | subtract | intersect | exclude

每个关键字代表一个 Porter-Duff 合成运算符 [COMPOSITING-1],用于定义当前遮罩层与其下方遮罩层的合成操作。

在下文中,当前遮罩层称为 源(source),其下方所有遮罩层(应用了相应的合成运算符)称为 目标(destination)

add

放置在 目标 之上。(详情请参阅 Porter-Duff 合成运算符 source over。)

subtract

仅保留其位于 目标 之外的部分。(详情请参阅 Porter-Duff 合成运算符 source out。)

交集 (intersect)

目标 重叠的部分将替换 目标。(详情请参阅 Porter-Duff 合成运算符 source in。)

exclude

目标 的非重叠区域将被合并。(详情请参阅 Porter-Duff 合成运算符 XOR。)

如果没有后续的遮罩层,合成运算符将被忽略。遮罩层不得与元素的内容或元素背后的内容进行合成,它们必须表现为如同被渲染到一个孤立的组中一样。

在应用当前遮罩层的合成操作之前,必须先合成当前遮罩层之下的所有遮罩层。

此示例使用了两个 遮罩层图像circle.svgrect.svg Example of source-over compositing of mask layers

这两个 遮罩层图像 均通过 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 被忽略。

这是一个包含 3 个遮罩层且具有不同合成运算符的示例。
mask-image: trapeze.svg, circle.svg, rect.svg;
mask-composite: subtract, add;

首先,circle.svg 被“添加”到 rect.svg。在第二步中,仅显示 trapeze.svg 中不与前两层合成结果重叠的部分。

Example of source-over compositing of mask layers

关于 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-clipmask-clip 设置为该值。

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

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

如果 <mask-reference> 引用了一个 mask 元素,则 mask-repeatmask-positionmask-clipmask-originmask-size 属性的 使用值(used value) 必须不起作用。在这种情况下,该元素定义了 遮罩层图像 的位置、尺寸和裁剪。

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

7.10. 遮罩图像渲染模型

对于使用 CSS 盒模型格式化的元素,应用值非 nonemask-image 属性会像 CSS opacity [CSS3COLOR] 一样建立一个 堆叠上下文(stacking context),且该元素的所有后代作为一个整体进行渲染,并将遮罩应用于整个组。

mask-image 属性对任何元素的 CSS 盒的几何结构或点击测试(hit-testing)没有影响。

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

7.10.1. 遮罩处理

在以下章节中,遮罩图像 指的是 遮罩层图像遮罩边框图像

遮罩图像的解释可以采用两种不同的方法,具体取决于计算将与目标 alpha 值相乘的遮罩值的方式。

计算遮罩值的第一种也是最简单的方法是使用 遮罩图像 的 alpha 通道。在这种情况下,给定点的遮罩值就是该点 alpha 通道的值。颜色通道不会对遮罩值产生贡献。

计算遮罩值的第二种方法是使用遮罩图像的亮度。在这种情况下,给定点的遮罩值是使用以下过程,根据颜色通道值和 alpha 通道值计算得出的。

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

    • 如果 mask 元素上 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. 边框盒遮罩(Border-Box Mask)

使用 mask-border,图像可以被分割成九个部分:四个角、四个边缘和中间部分,如下图所示。

pieces of a mask border image

遮罩边框图像 的部分。

这些部分可以以各种方式进行切片、缩放和拉伸,以适应 遮罩边框图像区域 的大小。这种变形后的图像随后被用作遮罩。mask-border 的语法对应于 CSS 背景和边框 [CSS3BG] 中的 border-image 属性。

下例中的 遮罩边框图像 被分割为四个 75 像素的角、四个边缘和一个被拉伸和缩放的中间部分。 Example for 'mask-border'

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>
规范顺序按语法
动画类型 离散 (discrete)
媒体视觉

指定用作 遮罩边框图像 的图像。

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

请参阅 “遮罩处理” 以了解如何处理 遮罩边框图像

计算值非 none 会像 CSS opacity [CSS3COLOR] 在值不为 1 时一样,建立一个 堆叠上下文 [CSS21]

mask-border-sourcemask-image 可以独立指定。如果两个属性的值均非 none,则元素将依次被两种遮罩操作遮罩。

注:无论 mask-image 是否在 mask-border-source 之前应用于元素,都没有关系。两种操作顺序都会产生相同的渲染结果。

8.2. 遮罩边框图像解释:mask-border-mode 属性

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

mask-border-mode 属性指示 mask-border-source<image> 值是被视为亮度遮罩还是 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 元素
可继承
百分比 参考 遮罩边框图像 的大小
计算值 按指定值
规范顺序按语法
动画类型 离散 (discrete)
媒体视觉

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

有关属性值的定义,请参阅 border-image-slice 属性 [CSS3BG]

8.4. 遮罩区域:mask-border-width 属性

名称mask-border-width
[ <length-percentage> | <number> | auto ]{1,4}
初始值 auto
应用于所有元素。在 SVG 中,它适用于除 defs 元素以外的 容器元素、所有 图形元素 以及 use 元素
可继承
百分比 相对于 遮罩边框图像区域 的宽度/高度
计算值 所有 <length> 单位均已绝对化,否则按指定处理
规范顺序按语法
动画类型 离散 (discrete)
媒体视觉

遮罩边框图像 绘制在一个名为 遮罩边框图像区域 的区域内。该区域的边界默认对应于边框盒,请参阅 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> 单位均已绝对化,否则按指定处理
规范顺序按语法
动画类型 离散 (discrete)
媒体视觉

这些值指定了 遮罩边框图像区域 超出边框盒的范围。如果包含四个值,它们将依次设置上、右、下、左侧的外部距离。如果缺少左值,则与右值相同;如果缺少下值,则与上值相同;如果缺少右值,则与上值相同。

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 元素
可继承
百分比 不可用
计算值 按指定值
规范顺序按语法
动画类型 离散 (discrete)
媒体视觉

此属性指定如何缩放和平铺 遮罩边框图像 的侧面和中间部分。第一个关键字适用于水平侧,第二个适用于垂直侧。如果缺少第二个关键字,则假定其与第一个相同。

有关属性值的定义,请参阅 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-sourcemask-border-slicemask-border-widthmask-border-outsetmask-border-repeatmask-border-mode 的简写属性。省略的值将设置为其初始值。

注:mask 简写属性会重置属性 mask-bordermask-border-sourcemask-border-slicemask-border-widthmask-border-outsetmask-border-repeatmask-border-mode

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

mask-border-source 给出的 遮罩边框图像mask-border-slice 值切片后,所得的九个图像将在四个步骤中被缩放、定位和平铺到其对应的 遮罩边框图像 区域中,详见 绘制边框图像 [CSS3BG] 一节。

对于使用 CSS 盒模型格式化的元素,应用 mask-border-source 属性会像 CSS opacity [CSS3COLOR] 一样建立一个 堆叠上下文,且该元素的所有后代作为一个整体进行渲染,并将遮罩应用于整个组。

mask-border-source 属性对任何元素的 CSS 盒的几何结构或点击测试没有影响。

9. SVG 遮罩源

9.1. mask 元素

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

属性定义

maskUnits = "userSpaceOnUse | objectBoundingBox"

定义属性 xywidthheight 的坐标系。

userSpaceOnUse(用户空间使用)

xywidthheight 表示 mask 元素被引用时(即通过 mask 属性引用该 mask 元素的元素所处的)当前 用户坐标系 [CSS3-TRANSFORMS] 中的值。

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 元素也不会被直接渲染,并且即使 mask 元素或其任何祖先上的 display 属性设置为 nonemask 元素仍然可供引用。

9.2. 遮罩源解释:mask-type 属性

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

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;"> This is the masked content. </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;">
 This is the masked content.
lt;/p>

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

10. 隐私与安全考虑

遮罩操作的时序独立于源像素和目标像素非常重要。遮罩操作必须以无论像素值如何都始终花费相同时间的方式实现。如果不遵循此规则,攻击者可能会推断出信息并进行时序攻击。

时序攻击是一种基于研究操作发生所需的时间长度来获取本受保护内容信息的方法。例如,如果红色像素的绘制时间比绿色像素长,那么在从未访问过元素内容的情况下,就可能重构出正在渲染的元素的大致图像。

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

用户代理必须对 mask-imagemask-border-sourceclip-path 属性上的所有 <mask-source><clip-source><image> 值,使用 [FETCH] 规范中定义的 潜在 CORS 支持的 fetch 方法。在获取时,用户代理必须使用“匿名(Anonymous)”模式,将引用源(referrer source)设置为样式表的 URL,并将来源(origin)设置为包含文档的 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 值意味着裁剪区域的给定边缘将与元素生成的边框盒边缘相同(即,对于 <top><left>auto 的含义与 0 相同;对于 <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 元素均为 50 x 55 像素,将分别创建由以下插图中的虚线所界定的矩形裁剪区域

Values for rect shape

此图说明了两个块级盒子,一个并排着另一个,具有不同尺寸的矩形裁剪区域。(参见 详细描述。)

附录 B:计算描边边界盒

计算 描边边界盒(stroke bounding box) 的算法如下,具体取决于 element 的类型

一个没有 useimage图形元素
具有 文本内容元素a 元素
  1. box 为初始化为 element对象边界盒 的矩形。

  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 元素的影子树(shadow tree)根节点。

  2. 对于 parent 的每个子元素 child

    1. 调用带有 child 的描边边界盒算法。

    2. childBox 为所调用算法返回的盒值。

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

  3. box 为所有 childBox 的并集。

  4. 返回 box

image
  1. 返回 element对象边界盒

注意:SVG 规范的未来版本可能会覆盖此章节。

附录 C:DOM 接口

Interface SVGClipPathElement

SVGClipPathElement 接口对应 clipPath 元素。

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

对应于给定 clipPath 元素上的 clipPathUnits 属性。取 SVGUnitTypes 中定义的常量之一。

transform, 类型为 SVGAnimatedTransformList,只读

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

Interface 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 日的候选推荐标准(Candidate Recommendation)以来,进行了以下更改。

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

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

2013 年 10 月 29 日的最后通牒工作草案(Last Call Working Draft)以来,进行了以下更改。

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

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

请参阅 ChangeLog 中的详细变更列表。

致谢

感谢 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" 与规范性文本隔开,如下所示

这是一个说明性示例。

说明性注释以“Note”一词开头,并使用 class="note" 与规范性文本隔开,如下所示

注意,这是一个说明性注释。

建议(Advisements)是规范性章节,旨在引起特别注意,并使用 <strong class="advisement"> 与其他规范性文本区分开来,如下所示: 用户代理必须提供可访问的替代方案。

一致性类别

本规范为三类一致性定义了一致性要求。

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

如果样式表包含的所有使用本模块定义语法的语句,根据通用 CSS 语法及本模块定义的各功能语法均有效,则该样式表符合本规范。

如果渲染器除了按相应规范解释样式表外,还通过正确解析本规范定义的所有功能并相应地渲染文档来支持这些功能,则该渲染器符合本规范。然而,由于设备限制导致 UA 无法正确渲染文档,并不意味着该 UA 不符合规范。(例如,UA 无需在单色显示器上渲染颜色。)

如果创作工具编写的样式表根据通用 CSS 语法及本模块中各功能的语法是句法正确的,并符合本模块中描述的所有其他样式表一致性要求,则该创作工具符合本规范。

部分实现

为了使作者能够利用前向兼容的解析规则来指定后备值,CSS 渲染器 **必须** 将其无法使用支持级别的任何 @规则、属性、属性值、关键字和其他语法结构视为无效(并 适当忽略)。特别地,用户代理 **不得** 在单一多值属性声明中选择性地忽略不支持的组件值而保留支持的值:如果任何值被视为无效(因为不支持的值必须如此),CSS 要求忽略整个声明。

不稳定和专有特性的实现

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

非实验性实现

一旦规范达到候选推荐阶段,非实验性实现即可成为可能,实现者应发布他们能够证明根据规范正确实现的任何 CR 级别特性的无前缀实现。

为建立并保持 CSS 在不同实现间的互操作性,CSS 工作组请求非实验性的 CSS 渲染器在发布任何 CSS 功能的无前缀实现之前,向 W3C 提交一份实现报告(并在必要时提交用于该实现报告的测试用例)。提交给 W3C 的测试用例需经 CSS 工作组审阅和修正。

有关提交测试用例和实现报告的详细信息,请访问 CSS 工作组网站 https://w3org.cn/Style/CSS/Test/。问题可发送至 public-css-testsuite@w3.org 邮件列表。

候选推荐标准 (CR) 退出标准

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

independent
每个实现必须由不同的方开发,并且不能共享、重用或派生自另一个合格实现所使用的代码。对本规范实现无影响的代码段不受此要求限制。
可互操作
通过官方 CSS 测试套件中的相应测试用例,或者如果实现不是 Web 浏览器,则通过等效测试。如果此类用户代理 (UA) 用于声明互操作性,则测试套件中的每个相关测试都应创建等效测试。此外,如果此类 UA 用于声明互操作性,则必须有一个或多个额外的 UA,它们也可以以相同的方式通过这些等效测试,以实现互操作性的目的。等效测试必须公开,以供同行评审。
实现
用户代理,即
  1. 实现了该规范。
  2. 对公众可用。该实现可以是出货产品或其他公开可用的版本(即测试版、预览发布版或“每日构建版”)。非出货产品发布版必须已实现该功能至少一个月,以证明其稳定性。
  3. 不是实验性的(即,专门为通过测试套件设计且不打算用于正常使用的版本)。

该规范将保持候选推荐标准状态至少六个月。

索引

本规范定义的术语

通过引用定义的术语

引用

规范性引用

[COMPOSITING-1]
Rik Cabanier; Nikos Andronikos. Compositing and Blending Level 1. 2015年1月13日. CR. URL: https://w3org.cn/TR/compositing-1/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 2018年12月18日. WD. URL: https://w3org.cn/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS 层叠与继承第 5 级. 2021 年 6 月 8 日. WD. URL: https://w3org.cn/TR/css-cascade-5/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley. CSS 颜色模块第 4 级. 2021 年 6 月 1 日. WD. URL: https://w3org.cn/TR/css-color-4/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS 显示模块第 3 级. 2020 年 12 月 18 日. CR. URL: https://w3org.cn/TR/css-display-3/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS 字体模块第 4 级. 2021 年 7 月 29 日. WD. URL: https://w3org.cn/TR/css-fonts-4/
[CSS-FONTS-5]
Myles Maxfield; Chris Lilley. CSS 字体模块第 5 级. 2021 年 7 月 29 日. WD. URL: https://w3org.cn/TR/css-fonts-5/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS 图像模块第 3 级. 2020年12月17日. CR. URL: https://w3org.cn/TR/css-images-3/
[CSS-INLINE-3]
Dave Cramer; Elika Etemad; Steve Zilles. CSS Inline Layout Module Level 3. 2020年8月27日. WD. URL: https://w3org.cn/TR/css-inline-3/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS 溢出模块第 3 级. 2020 年 6 月 3 日. WD. URL: https://w3org.cn/TR/css-overflow-3/
[CSS-SHAPES]
Vincent Hardy; Rossen Atanassov; Alan Stearns. CSS 形状模块第 1 级. 2014 年 3 月 20 日. CR. URL: https://w3org.cn/TR/css-shapes-1/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2021年4月22日. CR. URL: https://w3org.cn/TR/css-text-3/
[CSS-TEXT-DECOR-3]
Elika Etemad; Koji Ishii. CSS 文字装饰模块 Level 3. 2019 年 8 月 13 日. CR. URL: https://w3org.cn/TR/css-text-decor-3/
[CSS-UI-3]
Tantek Çelik; Florian Rivoal. CSS 基础用户界面模块 Level 3 (CSS3 UI)。2018 年 6 月 21 日。REC。URL: https://w3org.cn/TR/css-ui-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块第 4 级. 2021 年 7 月 15 日. WD. URL: https://w3org.cn/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2019年12月10日. REC. URL: https://w3org.cn/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://w3org.cn/TR/css-writing-modes-4/
[CSS21]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://w3org.cn/TR/CSS21/
[CSS3-TRANSFORMS]
Simon Fraser; et al. CSS Transforms Module Level 1. 2019年2月14日. CR. URL: https://w3org.cn/TR/css-transforms-1/
[CSS3BG]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2021年7月26日. CR. URL: https://w3org.cn/TR/css-backgrounds-3/
[CSS3VAL]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块 Level 3. 2019 年 6 月 6 日. CR. URL: https://w3org.cn/TR/css-values-3/
[FETCH]
Anne van Kesteren. 提取标准 (Fetch Standard). 生活标准. URL: https://fetch.spec.whatwg.org/
[FILL-STROKE-3]
Elika Etemad; Tab Atkins Jr.. CSS Fill and Stroke Module Level 3. 2017年4月13日. WD. URL: https://w3org.cn/TR/fill-stroke-3/
[FILTER-EFFECTS]
Dirk Schulze; Dean Jackson. 滤镜效果模块 1 级 (Filter Effects Module Level 1). 2018年12月18日. WD. URL: https://w3org.cn/TR/filter-effects-1/
[RFC2119]
S. Bradner. RFC 中用于指示要求级别的关键词. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SVG11]
Erik Dahlström; et al. 可缩放矢量图形 (SVG) 1.1 (第二版). 2011 年 8 月 16 日. REC. URL: https://w3org.cn/TR/SVG11/
[SVG2]
Amelia Bellamy-Royds; et al. Scalable Vector Graphics (SVG) 2. 2018年10月4日. CR. URL: https://w3org.cn/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://w3org.cn/TR/css-color-3/

属性索引

名称初始值应用于继承百分比动画类型 (Animation type)规范顺序计算值媒体
clip rect() | autoauto绝对定位元素。在 SVG 中,它适用于建立新视口的元素、pattern 元素和 mask 元素。不可用按计算值按语法按指定值视觉
clip-path <clip-source> | [ <basic-shape> || <geometry-box> ] | nonenone(无)所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素不可用按计算值按语法按指定,但 <url> 值已绝对化视觉
clip-rule nonzero | evenoddnonzero适用于 SVG 图形元素不可用离散 (discrete)按语法按指定值视觉
蒙版 (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'>参见各个属性参见各个属性不可用参见各个属性按语法参见各个属性视觉
mask-border-mode luminance | alphaalpha所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素不可用离散 (discrete)按语法按指定值视觉
mask-border-outset [ <length> | <number> ]{1,4}0 所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素不可用离散 (discrete)按语法所有 <length> 均已绝对化,否则按指定视觉
mask-border-repeat [ stretch | repeat | round | space ]{1,2}stretch所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素不可用离散 (discrete)按语法按指定值视觉
mask-border-slice <number-percentage>{1,4} fill?0 所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素参考遮罩边框图像的大小离散 (discrete)按语法按指定值视觉
mask-border-source none | <image>none(无)所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素不可用离散 (discrete)按语法关键字 none 或计算后的 <image>视觉
mask-border-width [ <length-percentage> | <number> | auto ]{1,4}auto所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素相对于遮罩边框图像区域的宽度/高度离散 (discrete)按语法所有 <length> 均已绝对化,否则按指定视觉
mask-clip [ <geometry-box> | no-clip ]#border-box所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素不可用离散 (discrete)按语法按指定值视觉
mask-composite <compositing-operator>#add所有元素。在 SVG 中,它适用于没有 defs 元素的容器元素和所有图形元素不可用离散 (discrete)按语法按指定值视觉
mask-image <mask-reference>#none(无)所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素不可用离散 (discrete)按语法关键字 none、计算后的 <image> 或计算后的 <url>视觉
mask-mode <masking-mode>#match-source所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素不可用离散 (discrete)按语法按指定值视觉
mask-origin <geometry-box>#border-box所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素不可用离散 (discrete)按语法按指定值视觉
mask-position <position>#0% 0% 所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素参考遮罩绘制区域减去遮罩层图像的大小;参见文本 background-position [CSS3BG]可重复列表按语法由以下组成:表示原点的两个关键字和从该原点的两个偏移量,每个偏移量都作为绝对长度(如果是 <length>)给出,否则作为百分比。视觉
mask-repeat <repeat-style>#repeat所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素不可用离散 (discrete)按语法由两个关键字组成,每个维度一个视觉
mask-size <bg-size>#auto所有元素。在 SVG 中,它适用于除 defs 元素之外的容器元素、所有图形元素和 use 元素不可用可重复列表按语法按照规定,但长度单位需绝对化视觉
mask-type luminance | alpha亮度 (Luminance)mask 元素不可用离散 (discrete)按语法按指定值视觉

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 禁止渲染引用了违反内容模型(content model)的 clipPath 的元素。没有任何浏览器在间接引用时忽略 use 上的 clipPath。<https://github.com/w3c/csswg-drafts/issues/17>
根据影响它的 CSS 属性定义原始几何形状。特别是在文本上。<https://github.com/w3c/csswg-drafts/issues/170>