一个SVG 文档片段由包含在‘svg’元素中的任意数量的 SVG 元素组成。
一个 SVG 文档片段可以是一个空片段(即,‘svg’元素内没有内容),也可以是包含单个 SVG 图形元素(如‘rect’)的非常简单的 SVG 文档片段,或者是包含容器元素和图形元素的复杂深层嵌套集合。
一个 SVG 文档片段可以作为独立的文件或资源存在,此时它是一个SVG 文档,也可以作为片段嵌入父 HTML 或 XML 文档中。
以下示例显示了简单的 SVG 内容作为片段嵌入父 XML 文档中。注意使用 XML 命名空间来指示‘svg’和‘ellipse’元素属于SVG 命名空间:
<?xml version="1.0" standalone="yes"?> <parent xmlns="http://example.org" xmlns:svg="http://www.w3.org/2000/svg"> <!-- 父内容在这里 --> <svg:svg width="4cm" height="8cm"> <svg:ellipse cx="2cm" cy="4cm" rx="2cm" ry="1cm"> </svg:svg> <!-- ... --> </parent>
这个例子显示了一个稍微复杂一点(即,包含多个矩形)的独立自包含 SVG 文档:
<?xml version="1.0" standalone="no"?> <svg width="5cm" height="4cm" version="1.1" xmlns="http://www.w3.org/2000/svg"> <desc>四个独立的矩形 </desc> <rect x="0.5cm" y="0.5cm" width="2cm" height="1cm"> <rect x="0.5cm" y="2cm" width="1cm" height="1.5cm"> <rect x="3cm" y="0.5cm" width="1.5cm" height="2cm"> <rect x="3.5cm" y="3cm" width="1cm" height="0.5cm"> <!-- 使用 'rect' 元素显示视口轮廓 --> <rect x=".01cm" y=".01cm" width="4.98cm" height="3.98cm" fill="none" stroke="blue" stroke-width=".02cm"> </svg>
‘svg’元素可以出现在 SVG 内容中间。这是 SVG 文档片段可以嵌入其他 SVG 文档片段的机制。
在 SVG 内容中间使用‘svg’元素的另一个用途是建立新的 SVG 视口。(参见建立新 SVG 视口。)
当 SVG 被解析为 XML 时,为了符合XML 中的命名空间推荐[xml-names],必须提供 SVG 命名空间声明,以便将所有 SVG 元素标识为属于 SVG 命名空间。
使用 HTML 语法时,命名空间由 HTML 解析器自动提供。
<html> <svg viewBox="0 0 100 100"> <circle cx="50" cy="50" r="50" fill="green"> </svg> </html>
如示例所示,使用 HTML 解析器时不需要有‘xmlns’属性声明该元素在 SVG 命名空间中。HTML 解析器会自动在正确的命名空间中创建 SVG 元素。
本节应讨论如何根据 DOM 定义文档的行为,并解释 HTML 解析器如何创建 SVG 片段。
SVG 2 的命名空间是http://www.w3.org/2000/svg
,与早期版本的 SVG 相同。
以下是在 SVG 作为 XML 被解析时提供命名空间声明的可能方式。可以在‘svg’元素上指定一个不带命名空间前缀的‘xmlns’属性,这意味着 SVG 是在带有‘xmlns’属性的元素范围内的默认命名空间:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> <rect x="10" y="10" width="80" height="80" fill="green"> </svg>
如果在‘xmlns’属性上指定了命名空间前缀(例如,xmlns:svg="http://www.w3.org/2000/svg"
),则相应的命名空间就不是默认命名空间,因此必须为元素分配显式命名空间前缀:
<svg:svg xmlns:svg="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> <svg:rect x="10" y="10" width="80" height="80" fill="green"> </svg:svg>
命名空间前缀可以在祖先元素上指定(如上例所示)。有关更多信息,请参阅XML 中的命名空间推荐[xml-names]。
SVG 2 要求: | 支持转换 ‘svg’ 元素。 |
---|---|
决议: | 我们将在 SVG 2 中允许在 ‘svg’ 元素上使用 ‘transform’。 |
目的: | 允许在嵌套的 ‘svg’ 元素上进行变换,以符合作者的预期。 |
负责人: | Dirk (无操作) |
状态: | 已完成 |
x 和 y 属性指定嵌入的 ‘svg’ 元素的矩形区域的左上角。在 最外层的 svg 元素 上,这些属性没有效果。
对于 最外层的 svg 元素, width 和 height 属性指定 SVG 文档片段的固有尺寸。 对于嵌入的 ‘svg’ 元素,它们指定放置 ‘svg’ 元素的矩形区域的大小。 在任何情况下,样式 auto 的计算结果都等同于 100%。
属性定义:
名称 | 值 | 初始值 | 可动画 |
---|---|---|---|
zoomAndPan | disable | magnify | magnify | no |
指定用户代理是否应提供缩放和移动 SVG 内容的方式。详见 ‘zoomAndPan’ 的定义。
如果 SVG 文档可能作为其他文档的组件引用,作者通常会希望在引用文档的 最外层的 svg 元素 上包含 ‘viewBox’ 属性。此属性提供了一种方便的方法,可以将 SVG 文档设计为适合任意 SVG 视口的比例。
‘svg’ 元素将 事件处理程序内容属性 和许多 事件处理程序暴露为 Window 对象,并反映它们的 事件处理程序 IDL 属性。
onblur、‘onerror’、onfocus、‘onload’ 和 ‘onscroll’ 事件处理程序由 事件处理程序 暴露在 Window 对象上,并替换了通常由 SVG 元素 支持的具有相同名称的通用事件处理程序。
‘g’ 元素是一个 容器元素,用于将相关的图形元素分组在一起。
可以使用 ‘id’ 属性为元素组和单独的对象命名。命名组在动画和可重用对象等多个用途中是必需的。
一个例子:
<?xml version="1.0" standalone="no"?> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="5cm" height="5cm"> <desc>两个组,每个包含两个矩形</desc> <g id="group1" fill="red"> <rect x="1cm" y="1cm" width="1cm" height="1cm"> <rect x="3cm" y="1cm" width="1cm" height="1cm"> </g> <g id="group2" fill="blue"> <rect x="1cm" y="3cm" width="1cm" height="1cm"> <rect x="3cm" y="3cm" width="1cm" height="1cm"> </g> <!-- 使用 'rect' 元素显示视口的轮廓 --> <rect x=".01cm" y=".01cm" width="4.98cm" height="4.98cm" fill="none" stroke="blue" stroke-width=".02cm"> </svg>
将未知元素视为通用容器元素, 渲染其子树,并将 SVGUnknownElement 接口分配给未知元素的做法仍存在风险,目前没有已知的实现。
未知元素是指所有在 SVG 命名空间中但未由本规范或任何 SVG 模块定义的元素。对于未知元素,必须使用 SVGUnknownElement 接口。
在 SVG 命名空间中的未知元素是 可渲染元素 和 容器元素。它们的渲染行为如同将未知元素替换为 ‘g’ 元素或 ‘tspan’ 元素,具体取决于上下文。 任何在 SVG 图形元素上有效的全局属性或样式也必须对未知元素有效,并且应正常处理。 这包括条件处理属性、ARIA 属性、数据属性,‘lang’, ‘id’,‘class’ 和 ‘style’。指定在未知元素上的样式必须根据每个样式属性的继承规则继承给子元素。
在任意 SVG 元素(‘foreignObject’ 除外)的子元素中出现的其他命名空间中的已知和未知元素,除非本规范另有明确说明,否则不得渲染。
在 SVG 命名空间中的已知元素在 SVG 内容模型中未明确允许的情况下出现,除非本规范另有明确说明,否则不得渲染。
因此,在以下示例中:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 200"> <rect x=".1" y=".1" width="699.8" height="199.8" fill="none" stroke="blue" stroke-width=".2"> <mysteryElement> <path d="M0 0h600v200h-600z" fill="darkkhaki"> </mysteryElement> <hideElement xmlns="http://www.example.com/invisibleML"> nothing to see here <path d="M0 0h300v100h-300z" fill="whitesmoke"> </hideElement> <text y="2em" font-size="20"><text>This text must not be visible</text></text> <linearGradient> <gradientExtension> <path d="M300 0h100v200h-100z" fill="fuchsia"> </gradientExtension> </linearGradient> <div xmlns="http://www.w3.org/1999/xhtml">This must not be visible</div> </svg>
SVG 允许定义图形对象以供后续重复使用。 为此,SVG 大量使用了 URL 引用 结构 [rfc3987]。 例如,要使用线性渐变填充矩形,可以定义一个带有 ‘linearGradient’ 元素,并带有 ‘id’ 属性,该属性可以在矩形的 fill 属性值中引用,如下所示:
<linearGradient id="MyGradient">...</linearGradient> <rect style="fill:url(#MyGradient)">
某些类型的元素(如渐变)本身不会产生图形结果,因此它们可以放置在任何方便的位置。但有时需要定义图形对象并阻止其直接渲染,仅供其他地方引用。为此,SVG 提供了 ‘defs’ 元素,以便方便地定义和分组内容。
建议尽可能在文档顺序中,先定义被引用的元素。 将所有引用的元素收集在文件顶部附近的单个 ‘defs’ 元素内,可以使标记更易于阅读和理解。
‘defs’ 元素是一个用于 引用元素的容器。为了便于理解和 可访问性的原因,建议尽可能将引用的元素放在 ‘defs’中。
‘defs’ 的内容模型与 ‘g’元素相同;因此,任何可以成为 ‘g’ 子元素的元素也可以成为 ‘defs’ 的子元素,反之亦然。
属于 ‘defs’ 的后代元素不会直接呈现; display 属性对于 ‘defs’ 元素 必须始终由 用户代理样式表 设置为 none, 并且该声明必须具有比其他 CSS 规则或呈现属性更高的优先级。 然而请注意,属于 ‘defs’ 的后代元素始终存在于源树中,因此可以被 其他元素引用;因此,‘defs’ 元素上的 display 属性不会阻止这些元素被其他元素引用。
‘symbol’ 元素用于定义图形模板, 可以通过 ‘use’ 元素实例化, 但不会直接渲染。
‘symbol’ 为其包含的图形建立嵌套坐标系统。 当 symbol 作为 ‘use’ 元素的 引用元素实例化时,其渲染效果与嵌套的 ‘svg’ 元素非常相似。
x、y、宽度 和 高度 几何属性 在 ‘svg’ 元素上具有相同的效果, 当‘symbol’ 被 ‘use’ 元素实例化时。 特别是,如果宽度和高度 计算为 auto (并且未被实例化的‘use’元素上的值覆盖), 那么它们将被视为100%的值。
在 SVG 2 中新增。 允许在符号上指定几何属性 提供了更一致的渲染模型, 并允许作者为每个符号设置默认大小 (仍然可以通过‘use’元素上的属性进行覆盖)。
名称 | 值 | 初始值 | 可动画 |
---|---|---|---|
refX | <length> | left | center | right | (无) | 是 |
refY | <length> | top | center | bottom | (无) | 是 |
在 SVG 2 中新增。添加此属性使对齐符号到特定点更加容易,正如在地图中常做的那样。与‘marker’上的匹配属性类似。
将 refX/refY 添加到符号元素。已在莱比锡面对面会议中解决。 状态:完成。
我们将为标记/符号上的 refX/refY 添加 top/center/bottom 和 left/center/right 关键字。已在伦敦面对面会议中解决。值的灵感来自'background-position'。 状态:完成。
‘refX’ 和 ‘refY’ 属性定义了 符号的参考点,该点应精确放置在符号的 x,y 定位坐标上, 由x和y 属性及其变换定义的累积效应。
关键字值与‘refX’ 和 ‘refY’ 属性在 ‘marker’ 元素上的含义相同, 在适用方向上解析为 0%、50% 或 100%。
与其他定位属性不同, ‘refX’ 和 ‘refY’ 被解释为在符号内容的坐标系统中,应用了‘viewBox’ 和‘preserveAspectRatio’ 属性后。 如果未指定其中一个或两个属性, 则在相应维度上不进行调整, 符号的矩形视口区域的顶部或左侧 (无论‘viewBox’坐标如何) 将位于x,y 点。
为了向后兼容, 当‘refX’ 和 ‘refY’ 在‘symbol’上未指定时的行为, 与指定为0时的行为不同, 因此与在‘marker’上未指定的等效属性的行为不同。
使用‘symbol’ 元素来表示在同一文档中多次使用的图形,增加了结构和语义。 与‘symbol’元素密切相关的是 ‘marker’和‘pattern’元素; 这三者都定义了一个图形内容的容器,可以在SVG中以不同位置和比例重复渲染。 然而,虽然模式和标记中的重用图形 为另一个元素提供了图形效果, ‘symbol’中的内容将被嵌入 作为完全交互的内容,放在使用元素阴影树 中。
用户代理样式表将 ‘symbol’元素的 overflow属性设置为 hidden,这导致在符号的SVG视口边界处创建一个矩形裁剪路径。 除非覆盖overflow属性, 否则任何位于符号内的图形如果超出符号的SVG视口将会被裁剪。
‘symbol’元素 绝不能直接渲染; 它们的唯一用法是作为可以通过‘use’元素引用的内容。 用户代理必须将‘symbol’元素的 display属性设置为none, 作为用户代理样式表的一部分, 并且此声明必须高于任何其他CSS规则或呈现属性。
生成的实例的‘symbol’ 作为‘use’元素的直接引用元素 必须始终具有inline的计算值 对于display属性。 换句话说,每当宿主‘use’元素被渲染时,必须进行渲染。 用户代理样式表再次定义此声明 必须高于任何其他CSS规则或呈现属性。 任何其他‘symbol’ 被克隆以在使用元素阴影树中创建元素实例 的行为类似于符号定义,且不得被渲染。
SVG 2 要求: | 允许‘use’ 通过省略片段来引用外部文档的根元素。 |
---|---|
解决方案: | 我们将放宽对特定元素的引用要求,以允许省略片段来表示引用根元素,这在SVG 2中是合理的,例如使用。 |
目的: | 避免要求作者修改引用文档以向根元素添加ID。 |
负责人: | Cameron (ACTION-3417) |
状态: | 完成 |
‘use’ 元素引用了另一个元素,其副本将替换文档中的 ‘use’ 元素进行渲染。引用的元素可以是 容器元素,在这种情况下,将使用以该元素为根的完整 SVG 文档子树的副本。
克隆的内容继承了 ‘use’ 元素的样式,并且可以成为用户事件的目标。但是,这些克隆的元素实例仍然链接到引用的源,并反映原始 DOM 的变更。此外,引用元素作用域中的所有样式规则也适用于克隆的 shadow tree。
x、y、宽度和 高度几何属性指定了引用元素的位置。如果 引用元素定义了视口(例如,它是 ‘svg’ 或 ‘symbol’),那么除了 auto 之外的值会覆盖该元素上相应的几何属性值。
负值的 宽度或高度将被视为非法值。如果 宽度或 高度 为零,且这些属性对 引用元素 有影响,则该元素的渲染将被禁用。
x 和 y 属性会影响该元素的用户坐标系。有关实现详细信息,请参见 布局部分。
名称 | 值 | 初始值 | 是否可动画 |
---|---|---|---|
href | URL [URL] | (无) | 是 |
URL 引用指向要克隆以供渲染的 SVG 文档中的元素/片段。
‘use’ 元素可以通过指定没有片段的 ‘href’ 值来引用整个 SVG 文档。这种引用被认为是指向引用文档的根元素。
请参考URL 引用属性和 已弃用的 XLink 属性的常见处理方式。SVG 2 中的新特性:一个没有片段的 ‘href’ 允许引用整个 SVG 文档,而不必确保其根元素上有一个 ID。
用户代理可以出于安全原因限制外部资源文档的使用。特别是,本规范不允许 ‘use’ 中的跨域资源请求。未来的版本或其他规范可能会提供一种安全地启用跨域资源重用的方法。
当设置了 ‘href’ 属性(或在没有 ‘href’ 属性的情况下,设置了 ‘xlink:href’ 属性)时,用户代理必须 处理 URL。通过 URL 处理得到的目标元素就是 ‘use’ 元素的 引用元素。
如果通过解析 URL 得到的 引用元素 既不是 SVG 元素,也不是可以包含在 SVG 容器元素中的 HTML 命名空间中的元素,那么该引用是 无效的,‘use’ 元素有误。
如果引用元素是 ‘use’ 元素的(包含影子树的)祖先,则这是一个 无效的循环引用,‘use’ 元素有误。
否则,用户代理必须生成 影子树 的 重用图形 作为 ‘use’ 元素的内容,正如下一节中描述的那样,use 元素的影子树。
一个拥有未解析或无效 URL 引用的 ‘use’ 不会被渲染。对于边界框计算,它等同于一个空的容器元素。
‘use’ 元素生成的 重用图形 是通过 影子树定义的。从交互性和样式继承的角度来看,它们与 SVG 中其他类型的 重用图形(例如 ‘pattern’ 和 ‘marker’ 的内容)有很大不同。
影子树中的元素会像 ‘use’ 元素是一个容器并且它们是其子元素一样进行渲染。然而,SVG 文档对象模型(DOM)只包含 ‘use’ 元素及其属性。SVG DOM 并不包括作为 ‘use’ 元素子元素的元素实例。
支持脚本和文档对象模型的用户代理必须按照本节所述并符合 DOM 规范或其未来替代方案,来实现 use 元素的影子树。相比之下,不支持动态交互处理模式的用户代理可能不需要实现影子 DOM 的所有细节。然而,所有用户代理必须确保重用图形的布局、样式继承、多媒体和声明动画(如果适用)像实现了影子 DOM 一样进行渲染。
在讨论 ‘use’ 元素及其影子树时,适用以下定义:
当用户代理成功解析一个 ‘use’ 元素以识别 引用元素 时,必须创建一个宿主为该 ‘use’ 元素本身的 use 元素影子树。即使该 ‘use’ 元素因是 永不渲染的元素的后代、条件处理或其祖先元素上的 display 属性被设置为 none 而未被渲染,也必须创建该影子树。
影子树中的每个节点都是从 引用文档子树中的对应节点克隆生成的 实例。影子节点都从 实例根节点开始,实例根节点是 引用元素的实例,并且它本身是影子根节点的直接子元素。
影子树是开放的(可通过脚本检查),但只读。任何直接修改影子树中元素、属性和其他节点的尝试都会抛出 NoModificationAllowedError
。
在 use 元素影子树 中,‘script’ 元素是无效的(不会执行);‘audio’ 和 ‘video’ 元素受 多媒体部分的限制。
以前的 SVG 版本将影子树的内容限制为 SVG 图形元素。本规范允许克隆任何有效的 SVG 文档子树。然而,克隆非图形内容通常不会有任何可见的效果。
如果引用的元素位于外部文件中,那么属性和样式属性中的所有 URL 引用必须如 生成绝对 URL 中所述那样变为绝对路径,然后将值复制到 元素实例。影子树本身使用包含它的文档相同的文档基本 URL。
用户代理必须确保对 引用文档子树的所有更改都反映在影子树中,包括对元素、属性、文本和其他节点的更改。此外,对引用图形生效的样式表的更改必须反映在影子树范围内的样式表更改中,如 样式继承 部分中进一步描述的那样。
如果 ‘use’ 元素或 引用元素 以某种方式被修改,导致 ‘use’ 元素的 URL 引用再次变为 未解析状态,那么该 use 元素的整个影子树将被丢弃。
当 ‘use’ 引用的另一个元素也是 ‘use’ 元素,或者其内容包含 ‘use’ 元素时,上述影子 DOM 克隆方法是递归的。然而,一组直接或间接引用一个元素以创建循环依赖的引用是一个无效的循环引用。用户代理不得渲染该 ‘use’ 元素或其影子树。
x、y、宽度 和 高度 属性的值 在 ‘use’ 元素 上用于定位重用的图形 并设置视口大小, 如果 引用元素 定义了嵌套视口。 这些属性在 ‘use’ 元素上的效果 与其在 图形元素 上的效果显著不同, 或与其在 CSS 框模型中的效果不同。
x 和 y 属性定义了 一个附加变换 (translate(x,y), 其中 x 和 y 表示对应属性的计算值) 应用于 ‘use’ 元素, 在任何由其他属性指定的变换之后 (即附加到变换列表的右侧)。
出于历史原因, 补充变换应用于 ‘use’ 元素本身, 而不仅仅是应用于影子树中的重用内容。 这影响了用于 应用于 ‘use’ 元素的任何遮罩、剪切路径或过滤器的坐标系统 ,并以 userSpaceOnUse 单位计算。
要在未变换的坐标空间中应用 userSpaceOnUse 图形效果, 同时使用 x 和 y 来定位图形, 作者可以将 ‘use’ 元素嵌套在 ‘g’ 中, 并将图形效果应用于 ‘g’ 元素。
宽度 和 高度 属性 在 ‘use’ 元素 上覆盖引用的 ‘svg’ 或 ‘symbol’ 元素 上的对应属性值 在确定该属性在 实例根 元素上的使用值时。 然而,如果 ‘use’ 元素上的属性计算值为 auto, 则该属性将按照元素实例的正常计算方式计算。
因此,这些属性可以用于缩放定义其自身坐标系统的图形, 每次重用时。 因为 auto 是初始值, 如果在 ‘use’ 元素上未显式设置尺寸, 则将使用在 ‘svg’ 或 ‘symbol’ 上设置的值作为默认值。
宽度 和 高度 属性 在 ‘use’ 元素 上没有效果 如果 引用元素 不 建立新的视口。 特别是,‘use’ 元素本身并不建立新的视口, 因此不影响重用图形中百分比的解释。
在所有其他方面, 使用元素影子树 中的元素的渲染和布局 的发生方式就像 ‘use’ 元素是其影子内容的容器。 特别是,除非影子树中的元素建立新的视口, 否则它们必须在 ‘use’ 元素定义的坐标系统中绘制 (包括任何累积的变换)。 这影响了百分比长度的解释, 以及具有 userSpaceOnUse 单位的图形效果。
使用元素阴影树,像其他阴影树一样,表现出样式封装,正如在CSS 作用域模块[css-scoping-1]中定义的那样。这意味着阴影树中的元素从其宿主 ‘use’元素继承样式,但外部文档中定义的样式规则不会匹配阴影树中的元素。相反,阴影树维护自己的一组样式表,其CSS规则与阴影树中的元素匹配。
呈现属性和‘style’属性从引用的图形中克隆到元素实例中,方式与其他属性相同。
当引用元素来自与‘use’元素相同的文档时,来自同一文档的样式表将在原始文档和阴影树文档片段中同时应用。主文档中的样式表的任何更改也会影响阴影树;通过文档和阴影根文档片段的styleSheets
属性访问的StyleSheetList
对象必须是相同的。如果‘style’元素在引用文档子树中重复,则元素实例上的styleSheet
属性指向与对应元素相同的对象。
当引用元素来自外部文档时,处理该文档时生成的样式表对象适用于阴影树,并且是只读的。样式表中的所有URL引用,包括仅片段引用,必须相对于包含引用元素的文档的URL进行绝对引用。用户代理可以重用同一样式表对象用于任何引用该外部文档的阴影树。
作用于阴影树的样式规则通常不能影响主文档中的任何元素。同样,主文档中的样式规则只能通过更改继承值来影响阴影树元素。然而,CSS 作用域定义了从阴影树内部样式化宿主元素的特殊选择器,或者根据宿主上下文的变化调整阴影树内的样式[css-scoping-1]。
阴影树作用域内的CSS媒体查询使用与对应的“光”文档相同的设备特征和尺寸进行评估(即,包含阴影树的对应使用元素的文档,在递归退出所有嵌套阴影树后)。
在大多数情况下,阴影树中的元素实例将与原始文档中的对应元素匹配相同的样式规则。然而,如果CSS规则使用复杂选择器根据其祖先或兄弟匹配元素,并且那些祖先或兄弟没有被克隆作为阴影树的一部分,则该规则将不再匹配元素实例。同样,像nth-of-type
和nth-child
这样的子索引伪类可能适用于一个元素但不适用于另一个元素。这代表了与SVG早期版本中定义的样式克隆有所变化。
以下示例演示了样式匹配规则的一致性和变化。左侧的圆形被重用来绘制右侧的圆形。原始圆形以各种方式设置样式:
special
的元素的后代的圆形。
在SVG 1.1样式克隆模型中,指定样式值将从原始元素克隆到元素实例。重用的圆形将具有与原始圆形相同的样式,除了填充值将从‘use’(橙色)而不是从‘g’(蓝色)继承。
在SVG 2要求的阴影DOM模型中,重用圆形的样式计算如下:
special
的元素的后代;相反,圆形上的描边颜色从宿主‘use’元素继承(紫色)。因此,重用的圆形在填充颜色(因为它从不同元素继承)和描边颜色(因为复杂选择器不再匹配)上与原始圆形不同。
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="100" viewBox="0 0 200 100"> <title>样式继承和使用元素</title> <desc> 两个圆形,其中一个是另一个的重新样式克隆。 此文件演示了在SVG 2中, 阴影DOM样式匹配规则与SVG 1.1样式克隆规则不同的一个情况。 左侧的原始圆形 应该有蓝色填充 和绿色描边。 在符合SVG 1.1的用户代理中, 右侧的重用圆形 应该有橙色填充和绿色描边。 在符合SVG 2的用户代理中, 重用圆形应具有橙色填充和紫色描边。 在所有情况下, 描边应部分透明 并宽20个单位, 相对于总直径为100个单位的圆形。 </desc> <style type="text/css"> circle { stroke-opacity: 0.7; } .special circle { stroke: green; } use { stroke: purple; fill: orange; } </style> <g class="special" style="fill: blue"> <circle id="c" cy="50" cx="50" r="40" stroke-width="20"> </g> <use xlink:href="#c" x="100"> </svg>
示例 使用改变样式
之前的SVG版本
对于动态伪类
(如:hover
)
应如何应用于元素实例并不明确。
阴影树模型要求所有此类伪类
独立于
元素实例或其 对应元素进行匹配,
具体取决于用户与哪个元素交互。
在‘use’
元素上指定'visibility:hidden'并不能保证
被引用的内容不会被渲染。
与display或opacity属性不同,
visibility属性并不直接应用于容器元素,
因此也不直接应用于‘use’
元素。
由于visibility通常是继承的,
隐藏使用元素通常会隐藏子内容,
但不一定。
如果阴影树中的任何图形元素指定了
'visibility:visible',那么该
元素即使‘use’
元素指定了'visibility:hidden',也会可见。
在以下示例中,关键样式规则如下:
.dark { visibility: hidden; } .eyes { visibility: visible; } svg:hover .dark, svg:focus .dark { visibility: visible; }
"dark"类被设置在包含‘use’元素的组上, 因此重用图形的所有部分都继承了隐藏的可见性设置, 除了具有类"eyes"的子树,其中可见性被重置为可见。 在悬停或聚焦图形时,隐藏效果被移除。
示例 使用可见性隐藏,默认样式
示例 使用可见性隐藏,互动样式
该示例还演示了其他样式属性的继承 (填充和描边) 指定在‘use’元素上, 以及如何在符号内的任何元素指定显式值时(例如,粉色的鼻子和耳朵以及白色的尾巴)这些也不被使用。
当使用元素阴影树包含 ‘audio’或‘video’元素时, 必须执行以下行为:
Web 动画 API [web-animations-1] 和SVG 动画规范 [svg-animation] 定义了非 CSS 方法来动画化 目标元素的属性和样式,而不直接操作 DOM 属性 (详见动画附录)。 实现这些功能的用户代理 必须确保所有适用于引用文档子树中元素的动画 也适用于使用元素阴影树中的该元素实例, 如本节所述。
通过直接操作 引用图形中元素的属性创建的脚本动画 (包括‘style’属性或其 IDL 属性) 将以与其他 DOM 操作相同的方式传播到阴影树中的元素实例。
使用 CSS 应用的动画效果 将与其他样式表规则一起复制, 遵循样式作用域和继承部分中规定的程序。
在使用元素阴影树中的所有动画 与对应使用元素的文档时间线相同, 无论引用元素 是来自同一文档还是外部文档。
对于使用Web 动画 API方法 [web-animations-1]应用的动画效果, 如果动画的目标是阴影树中元素实例的对应元素, 用户代理必须构建一个ShadowAnimation ,其源为该Animation对象 ,其目标为元素实例。 如果该元素在不同树中有多个实例, 则会有多个阴影动画,每个实例一个。
用户代理必须为所有在阴影树生成时生效的Web 动画 API 动画 (包括待处理和冻结动画) 创建这样的ShadowAnimation, 并为阴影树存在时应用的任何新动画创建。 用户代理不得为 CSS 动画或动画元素创建 ShadowAnimation对象 (因为这些是单独复制的)。
作为接口定义的一部分, ShadowAnimation是只读的, 必须反映对其sourceAnimation的任何更改。
任何尝试直接将新动画应用于
元素实例(或
伪元素)
在使用元素阴影树中的目标
必须抛出NoModificationAllowedError
。
对于每个动画元素 [svg-animation] 其目标是引用文档子树中的元素, 用户代理必须确保在使用元素阴影树中 有一个等效的动画元素。 如果动画元素本身是引用文档子树的一部分, 则通过为动画元素创建 元素实例,这将自然而然地发生。 否则,用户代理必须为动画元素生成一个元素实例 ,其效果就像它是阴影树中的一个节点一样。 这些生成的动画元素的有效文档顺序 必须与其对应元素的文档顺序相同。
每个动画元素或实例只能影响 同一节点树(阴影或光), 无论目标是隐式(父元素) 还是显式(对元素的 URL 交叉引用‘id’)。 通过这种方式,动画元素和目标元素之间的一对一关系得以保留。
‘id’属性 像其他任何属性一样被克隆, 从对应元素到元素实例; 这不与‘id’的唯一性要求冲突, 因为克隆和原始在不同的节点树中。
所有在文档或阴影树中, 定时开始或结束以响应 另一个元素的事件 由其‘id’属性识别的动画元素, 也必须在任何带有该‘id’的元素的实例 接收到相同事件时开始或结束。 这与如何在引用元素上设置事件监听器也一致 监听该元素实例上的事件, 如使用元素阴影树中的事件处理部分所述。 此行为不适用于仅由事件定义的动画开始或结束时间, 而不是通过‘id’ (因此隐式地监听目标元素上的事件); 在这种情况下,每个动画元素仅由其自身目标触发。
在阴影树中生成动画元素实例时, 如果与对应元素相关联的活动动画 (包括冻结动画)存在, 并且触发该动画的计时事件也会触发该实例, 则该元素实例的动画必须启动, 其开始时间 在文档时间线上向后调整 以匹配对应元素的时机。
在许多情况下, 本节的要求意味着 元素实例及其对应元素 将会“同步”动画。 如果动画完全基于时间, 或者如果它在用户与通过其‘id’引用的元素交互时开始和结束, 情况就是这样。 然而,如果动画是通过目标元素上的用户交互事件(隐式)触发的, 则只有接收到交互事件的元素或元素实例会显示该动画。
这是与之前版本的 SVG 的变化, 之前要求所有在对应元素上的动画必须被镜像, 不论用户交互与否, 但并未提供针对元素实例的用户交互响应的明确指导。 此变化确保了使用动画元素声明的交互动画 行为与交互式 CSS 样式和 CSS 动画相同。
为了创建在任何实例或原始元素接收到事件时适用于所有实例的动画, 请明确指定元素的‘id’:
<set href="#target" begin="mouseover" ...>
<!-- 仅影响鼠标悬停的元素 -->
<set href="#target" begin="target.mouseover" ...>
<!-- 当任何实例的鼠标悬停时,
影响具有 id 'target' 的所有元素实例,
在所有光节点和阴影节点树中 -->
在使用元素阴影树中的元素 可以同时监听和成为 DOM 事件的目标。 事件重新目标提供了封装, 使得当事件从阴影树冒泡到光节点时,阴影 DOM 结构的细节被隐藏。
事件重新目标是 SVG 2 中的新特性。 它与 Shadow DOM 规范、 现有实现一致, 并符合仅关心主 DOM 中元素的作者的期望。
在引用图形中的元素上定义的任何事件监听器
也必须在每个元素实例中监听相同事件,并且在相同的捕获阶段
在使用元素阴影树中。
这包括使用事件属性(这将像其他任何 DOM 属性一样被重复分配)的事件监听器
以及使用addEventListener
方法分配的事件监听器。
用户代理必须确保每个元素实例的事件监听器列表
与其对应元素保持同步。
事件监听器不能直接分配给使用元素阴影树中的只读元素实例。
对此类元素添加事件监听器的任何尝试
必须抛出NoModificationAllowedError
。
在使用元素阴影树中的事件 根据阴影树的事件路径和事件重新目标算法进行调度和冒泡 [DOM]。
通常,使用元素阴影树的事件路径 是从事件目标元素的祖先构建的 直到阴影根, 然后是主机 ‘use’元素 及其通过文档窗口的事件路径。 这意味着在捕获阶段, 事件从窗口通过常规文档树传播 到‘use’元素 然后到阴影根对象 以及通过阴影树向下传播 (或递归通过多个阴影树) 到事件目标元素。 在冒泡阶段,事件以相反的方向传递, 从阴影树元素到阴影根, 然后到‘use’ 元素及其祖先。
事件重新目标算法确保
从事件监听器的角度
在‘use’元素
或其祖先上,
所有目标为阴影树中元素实例的事件
实际上是指向‘use’元素本身。
如果事件同时具有target
和relatedTarget
,
并且这两个属性都将重新目标
指向同一个‘use’元素,
则事件根本不在阴影树之外传播。
例如,这将发生在焦点从阴影树内的一个元素移动到另一个元素时。
某些其他事件类型被限制为
不在其创建的阴影树之外传播。
相比之下,处理事件的事件监听器
当事件在阴影树中传播时
(因为监听器已被添加到对应元素)
将接收到其target
指向阴影树中的只读元素实例的事件。
那个correspondingElement
和correspondingUseElement
属性可以用来将其连接到主 DOM 中可修改的元素。
SVG 包含一个‘switch’ 元素以及属性‘requiredExtensions’和‘systemLanguage’, 提供根据给定用户代理的能力或用户的语言指定备用视图的能力。
属性‘requiredExtensions’和‘systemLanguage’充当 测试并评估为真或假。‘switch’渲染其子元素中第一个所有这些属性测试为真的元素。 如果未指定给定属性,则假定其值为真。
当由于条件处理而排除一个元素时,
它被视为在display属性上具有使用值none
。
与display属性类似,条件处理
属性仅影响元素的直接渲染,并不阻止元素被其他元素成功引用(例如通过‘use’)。
因此:
SVG 的早期版本包含第三个条件处理属性,
requiredFeatures
。
这旨在允许作者为仅实现 SVG 规范部分的用户代理提供后备行为。
不幸的是,该属性的规范和实现不佳,使其作为功能支持测试不可靠。
‘switch’元素会评估 ‘requiredExtensions’和 ‘systemLanguage’ 属性,依次处理并渲染第一个这些属性评估为真的直接子元素。其他元素将被跳过,因此不会被渲染。如果子元素是一个容器元素,例如 ‘g’,则整个子树 要么被处理/渲染,要么被跳过/不渲染。
在 SVG 中,评估‘systemLanguage’属性时,‘switch’元素的后代元素的评估顺序必须如同 'allowReorder' 属性(在 SMIL 规范中定义)始终为“是”。
请注意,属性display和 visibility的值对‘switch’元素 的处理没有影响。特别是,将子元素的display 设置为none不会影响与‘switch’元素处理相关的真假测试。
‘switch’元素不会影响 ‘script’和 ‘style’元素的处理。
有关更多信息和示例,请参见 嵌入外部对象类型。
‘requiredExtensions’ 属性定义了一系列必需的语言扩展。 语言扩展是用户代理内的功能,超出了本规范中定义的特性集。每个扩展由一个URL 引用标识。
名称 | 值 | 初始值 | 可动画 |
---|---|---|---|
requiredExtensions | 空格分隔的标记集 [HTML] | (无) | 否 |
该值是一个URL 引用的列表, 标识所需的扩展,个别值以空格分隔。确定用户代理是否支持所有命名的扩展。如果所有给定的扩展都被支持,则该属性评估为真;否则,当前元素及其子元素将被跳过,因此不会被渲染。
如果给定的URL 引用本身包含空格,则该空格必须被转义。
如果属性不存在,则隐式评估为“真”。如果给属性‘requiredExtensions’提供了一个空字符串或空值,则 该属性评估为“假”。
‘requiredExtensions’通常与‘switch’元素结合使用。如果在其他情况下使用‘requiredExtensions’,则它代表对给定元素是否渲染的简单开关。
扩展的 URL 名称应包括版本信息,例如“http://example.org/SVGExtensionXYZ/1.0”,以便脚本编写者可以区分不同版本的给定扩展。
如果用户偏好指示的语言标签与该参数值中给出的语言标签之一不区分大小写地匹配,或者如果用户偏好指示的语言标签与该参数值中给出的语言标签之一不区分大小写地匹配且紧接着该前缀的第一个标签字符为“-”,则评估为“真”。
否则评估为“假”。
如果属性不存在,则隐式评估为“真”。如果给属性‘systemLanguage’提供了一个空字符串或空值,则 该属性评估为“假”。
注意:这种前缀匹配规则的使用并不意味着语言标签被分配给语言的方式总是如此:如果用户理解具有某个标签的语言,则该用户也将理解所有具有该标签为前缀的语言标签。
前缀规则仅允许在这种情况下使用前缀标签。
实施说明:在提供用户可用的语言偏好选择时,实施者应考虑到用户对上述语言匹配细节并不熟悉,并应提供适当的指导。例如,用户可能会假设在选择“en-gb”后,如果没有提供英国英语,他们将获得任何类型的英语文档。用户偏好的设置界面应引导用户添加“en”以获得最佳匹配行为。
可能列出多种语言,以便为多个受众提供内容。例如,同时以原始毛利语和英语版本呈现的内容,应调用:
<text systemLanguage="mi, en"><!-- 内容在这里 --></text>
然而,仅仅因为在‘systemLanguage’测试属性所放置的对象中存在多种语言,并不意味着它是为了多个语言受众而准备的。例如,一本初学者的语言入门书,如《拉丁语第一课》,显然是为懂英语的受众使用的。在这种情况下,‘systemLanguage’测试属性应仅包含“en”。
作者说明:作者应意识到,如果将多个替代语言对象封装在一个‘switch’中,并且没有一个匹配,这可能导致没有内容显示的情况。因此建议在这种‘switch’的末尾包含一个在所有情况下都可接受的“通用”选择。
‘systemLanguage’通常与‘switch’元素结合使用。如果在其他情况下使用‘systemLanguage’,则它代表对给定元素是否渲染的简单开关。
基于‘lang’属性的多语言描述文本选择被添加以允许‘desc’和‘title’元素的国际化。
在SVG 2中新增。添加'lang'在Rigi Kaltbad面对面会议上得到解决。移除了限制'desc'和'title'元素数量的文本。状态:已完成。
任何容器元素或图形元素在SVG文档中可以拥有零个或多个‘desc’和/或‘title’元素作为子元素,其内容为文本。‘desc’和‘title’元素不会作为图形的一部分进行视觉呈现。display值必须始终设置为none,由用户代理样式表控制,并且此声明必须优先于任何其他CSS规则或呈现属性。
多个兄弟‘desc’或‘title’元素必须具有不同的语言,通过在描述性元素或其祖先上定义的‘lang’属性(或xml:lang
属性)来确定。用户代理必须选择与用户设置的语言偏好最佳匹配的每种类型的元素。如果有多个同样有效的匹配,应该使用第一个匹配。如果'title'或'desc'没有匹配,则必须选择该类型的第一个元素。
以下示例显示在HTML文档中重用的星形图标上的替代语言标题。示例假设整个HTML文档的语言正确声明为en
(不指定国家代码的英语)。
<svg> <use href="#star"> <title>Favourite</title> <title lang="en-us">Favorite</title> <title lang="nl">Favoriet</title> <title lang="">★</title> </use> </svg>
第一个title
元素继承了文档的语言(en
);其他元素为每个元素显式声明了语言。如果用户的首选语言(在提供的语言中)是美式英语,则图标标题为美式拼写“Favorite”。如果用户的首选语言为荷兰语,则图标标题为“Favoriet”。如果用户的偏好列表中通用英语排名高于荷兰语,则标题为“Favourite”(英式拼写)。如果用户不理解荷兰语或英语,则标题将是星号字符——这并不是理想的(大多数屏幕阅读器会将其读作“黑星”的本地化版本),但总比没有文本替代品要好。
作者应注意,支持SVG 1.1的用户代理在尚未实现多语言描述文本时,通常会选择每种类型的第一个元素,而无论用户偏好如何。SVG
1.1用户代理可能还会未能识别不是其父元素第一个子元素的title
元素,或者是没有其他描述性元素的前兄弟的desc
元素。
使用多个‘title’或‘desc’元素提供本地化信息存在风险,目前没有已知的实现。
用户代理必须将所选'title'和'desc'元素的文本内容作为父元素名称和描述计算的一部分,提供给平台无障碍API,如SVG无障碍API映射[SVG-AAM]规范中所定义。
任何'title'或'desc'元素作为渲染元素的直接子元素的包含表示该渲染元素在图形中具有语义重要性。作者不应,也SVG生成器必须不,包含没有文本内容或仅包含空白文本内容的空'title'或'desc'元素,因为这将导致无名称对象呈现给辅助技术用户。
如果单个图形元素本身没有意义,则应为描述有意义对象的最近容器元素提供替代文本。作者应使用分组(‘g’)元素将其绘图元素结构化为有意义的对象,并使用‘title’命名这些组。相反,如果容器对象仅用于应用样式或布局,并且既不定义对象也不提供有意义的分组结构,则不需要替代文本。
父元素为未渲染的描述性文本元素可供作者或创作工具作为参考信息;作者被警告,此数据通常对通过辅助技术查看图形的最终用户不可用。尽管如此,未渲染元素可以作为渲染元素的可访问名称或描述的一部分被引用(如SVG-AAM中定义),递归计算将使用引用元素的描述性子元素。
描述和标题元素可以包含来自其他命名空间的标记文本,使用标准XML机制指示命名空间。然而,作者不应依赖此类标记为替代文本提供意义;目前,仅需要将纯文本内容暴露给辅助技术。
HTML解析器以与处理HTML片段中的标记相同的方式处理‘title’和‘desc’元素。通过在SVG文档中嵌套HTML元素,可以创建未定义元素的层次结构;这仅在内容合法时实现。作者不得混合使用HTML和SVG元素以避免意外的影响;具体来说,不得在描述元素中使用“<”或“>”作为文本的一部分。
用户代理可以在‘title’中使用标记来影响标题的视觉呈现(如工具提示),但不是必须这样做。
‘title’ 子元素表示元素的简短文本替代。
在链接上,这可以是目标资源的标题或描述;在图像或图形对象上,它可以是图形的简短描述;在交互内容上,它可以是元素的标签或使用说明,等等。
如果绘图元素有可见标签(例如,使用‘text’元素),作者不应在‘title’元素中提供冗余信息。相反,视觉标签应通过‘aria-labelledby’属性与绘图元素相关联。
交互用户代理应在用户交互时以与平台惯例一致的方式提供‘title’元素的纯文本内容;现有的用户代理通常在悬停父元素时将‘title’元素呈现为工具提示。
作者应在独立 SVG 文档的根 SVG 元素中提供‘title’子元素。由于用户经常在上下文之外查看文档,作者应提供丰富上下文的标题。因此,作者应提供诸如“中世纪养蜂导论”的标题,而不是“导论”,因为后者并没有提供太多上下文信息。出于可访问性的原因,用户代理应始终向用户提供根 SVG 元素的‘title’子元素的内容。然而,这通常是通过其他方式完成的,而不是用于嵌套 SVG 和图形元素的工具提示,例如,通过在浏览器标签中显示。
‘desc’元素 表示元素的更详细文本信息,例如描述。这通常对辅助技术可用,以提供更详细的信息,例如图形的视觉外观描述或帮助解释复杂小部件的功能。它通常对其他用户不可用,因此不应用于重要说明。
作者可以使用‘aria-describedby’ 属性(在描述的元素或父容器上)将详细信息(包括可见文本)与图形的部分关联, 其值为一个或多个包含描述的 SVG 或 HTML 元素的 ID 引用。‘aria-describedby’ 属性在提供描述时优先于子‘desc’ 元素。如果元素同时具有可见描述和提供补充信息的子‘desc’元素,作者应在其自己的‘aria-describedby’ 列表中明确包括该元素自身的‘id’,以便将两个描述连接在一起。
与 SVG 内容一起包含的元数据应在‘metadata’元素中指定。‘metadata’的内容应为来自其他 XML 命名空间的元素,这些命名空间的元素以符合XML 中的命名空间推荐的方式表达[xml-names].
SVG 2 删除了对以特定方式构造元数据元素的建议。
元数据内容不会直接渲染;display 属性值 对于‘metadata’ 元素必须始终设置为none,并且此声明必须优先于任何其他 CSS 规则或 表现属性。
以下是如何在 SVG 文档中包含元数据的示例。该示例使用都柏林核心版本 1.1 架构。 (也可以使用其他与 XML 兼容的元数据语言,包括不基于 RDF 的语言。)
<?xml version="1.0" standalone="yes"?> <svg width="4in" height="3in" xmlns = 'http://www.w3.org/2000/svg'> <desc xmlns:myfoo="http://example.org/myfoo"> <myfoo:title>这是财务报告</myfoo:title> <myfoo:descr>全局描述使用来自 <myfoo:emph>myfoo</myfoo:emph> 命名空间的标记。</myfoo:descr> <myfoo:scene><myfoo:what>小部件 $增长</myfoo:what> <myfoo:contains>$three $图表条</myfoo:contains> <myfoo:when>1998 $至 2000</myfoo:when> </myfoo:scene> </desc> <metadata> <rdf:RDF xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs = "http://www.w3.org/2000/01/rdf-schema#" xmlns:dc = "http://purl.org/dc/elements/1.1/" > <rdf:Description about="http://example.org/myfoo" dc:title="MyFoo 财务报告" dc:description="$three $条 $千 $美元 $从 1998 $至 2000" dc:publisher="示例组织" dc:date="2000-04-11" dc:format="image/svg+xml" dc:language="en" > <dc:creator> <rdf:Bag> <rdf:li>Irving Bird</rdf:li> <rdf:li>Mary Lambert</rdf:li> </rdf:Bag> </dc:creator> </rdf:Description> </rdf:RDF> </metadata> </svg>
对于支持 HTML 的用户代理,以下 HTML 元素(在 HTML 命名空间中)必须在 SVG 文档中得到支持:
注意,base
元素
将影响文档中的所有 URL 值,包括例如绘画服务器引用或 ‘use’ 元素引用。
然而,在处理 URL 引用以识别特定目标元素时,用户代理必须始终将生成的绝对 URL 与当前文档基础 URL 进行比较,以确定它是否为 同一文档 URL 引用。
通过这种方式,指向同一文档中元素的目标片段引用保持有效,无论文档基础 URL 发生了何种变化。
SVG 允许在 SVG 内容中随处包含外部命名空间的元素。 一般而言,SVG 用户代理必须在 DOM 中包含未知的外部命名空间元素, 但在渲染时将忽略并排除它们。
突出的例外在 嵌入内容章节 中描述, 包括 SVG 子树中的 HTML 元素 和 嵌入外部对象类型。 另请参见 未知元素 在 SVG 命名空间中的处理,这些元素的处理方式不同。
此外,SVG 允许在任何 SVG 元素上包含来自外部命名空间的属性。 SVG 用户代理必须在 DOM 中包含未知属性,但应忽略其他未知属性。
作者应当意识到,未知命名空间的元素和属性不会被 HTML 解析器解析为这样。 相反,命名空间前缀将包含在标签或属性名称中, 元素将被放置在父元素命名空间中,属性则在默认命名空间中。
为了以一种能够在 XML 和 HTML 文档中一致解析的方式添加自定义属性, 作者可以使用 ‘data-*’ 属性。 如果它们编码的信息与文档中的其他元素无关,这些属性可以添加到 SVG ‘metadata’ 元素中。
SVG 包含外部命名空间的能力可用于以下目的:
例如,一个商业图形创作应用程序可能希望在 SVG 文档中包含一些私有数据, 以便在重新读取时能够正确重新组装图表(在本例中是饼图):
<?xml version="1.0" standalone="yes"?> <svg width="4in" height="3in" xmlns = 'http://www.w3.org/2000/svg'> <defs> <myapp:piechart xmlns:myapp="http://example.org/myapp" title="按地区销售"> <myapp:pieslice label="北方地区" value="1.23"> <myapp:pieslice label="东方地区" value="2.53"> <myapp:pieslice label="南方地区" value="3.89"> <myapp:pieslice label="西方地区" value="2.04"> <!-- 其他私有数据在这里 --> </myapp:piechart> </defs> <desc>该图表包含另一个命名空间中的私有数据 </desc> <!-- 这里将是绘制饼图的实际 SVG 图形元素 --> </svg>
‘id’ 属性可用于所有 SVG 元素:
名称 | 值 | 初始值 | 可动画 |
---|---|---|---|
id | (见下文) | (无) | 否 |
必须反映 元素的 ID [DOM]。 ‘id’ 属性 必须在节点树中唯一, 不能是空字符串, 也不能包含任何空白字符。
为了使 ‘id’ 属性在 XML 文档中有效, 需要遵循其他要求, 如相关 XML 版本的规范所定义。 独立的 SVG 文档使用 XML 1.0 语法 [xml], 该语法规定有效的 ‘id’ 值是 XML 名称标记。 有效的 XML 1.0 名称仅包括指定的字符(字母、数字和少数标点符号), 并且不得以数字、句点 (.) 或连字符 (-) 开头。
用户代理应当处理 SVG 文件中的 ‘id’ 值,无论其是否符合 XML 有效性。
‘lang’ 属性(无命名空间)指定元素内容的主要语言以及 任何包含文本的元素属性的语言。
XML 命名空间中的 ‘lang’ 属性在 XML 中定义 [xml]。
如果这些属性在元素中被省略,则该元素的语言与其父元素(如果有)相同。
XML 命名空间中的 ‘lang’ 属性可用于 XML 文档中的 SVG 元素。 如果无命名空间的 ‘lang’ 属性和 XML 命名空间中的 ‘lang’ 属性在同一元素上被指定,它们在 ASCII 不区分大小写的比较中必须具有完全相同的值。
如果无命名空间的 ‘lang’ 属性和 XML 命名空间中的 ‘lang’ 属性都设置在一个元素上,用户代理必须使用 XML 命名空间中的 ‘lang’ 属性,而无命名空间的 ‘lang’ 属性 必须被忽略以确定元素的语言。
名称 | 值 | 初始值 | 可动画 |
---|---|---|---|
lang | 语言标签 [ABNF] | (无) | 否 |
‘lang’ 属性指定元素内容的主要语言以及 任何包含文本的元素属性的语言。其值必须是有效的 BCP 47 语言标签, 或者为空字符串。将属性设置为空字符串表示主要语言未知。 [BCP47]。
SVG 2 要求: | 弃用 ‘xml:space’ 影响文本布局,改用 ‘white-space’ 属性。 |
---|---|
决议: | 我们从 SVG 2 中删除 xml:space,并 移除与此相关的测试。 |
目的: | 与 CSS 对齐。 |
负责人: | Chris (ACTION-3004, 完成;以及 ACTION-3005, 完成) |
状态 | 完成。 |
名称 | 值 | 初始值 | 可动画 |
---|---|---|---|
xml:space | (见下文) | default | 否 |
已弃用的 XML 属性,用于指定字符数据中是否保留空白。 唯一可能的值是字符串 'default' 和 'preserve',没有空白。请参阅 可扩展标记语言 (XML) 1.0 推荐 [xml] 和讨论 空白 处理 在 SVG 中。
新内容应使用 white-space 属性替代。
名称 | 值 | 初始值 | 可动画 |
---|---|---|---|
tabindex | 有效整数 [HTML] | (无) | 否 |
该内容属性允许作者控制元素是否可聚焦,是否应通过 顺序聚焦导航 达到, 以及元素在顺序聚焦导航中的相对顺序。
“tab index”这个名称来源于使用“tab”键在可聚焦元素之间导航的常见用法。 “tabbing”这个术语指的是通过可顺序聚焦导航移动前进。
所有 SVG 元素支持 自定义数据 属性, 这些属性是在无命名空间中,其名称以字符串 “data-” 开头。 请参阅 HTML 规范中的自定义数据属性要求。
请注意,上述ARIA属性列表可能会在未来的WAI-ARIA规范中扩展。
任何可渲染元素都可以指定ARIA角色属性;角色属性在不可渲染元素上被忽略。该属性(如果指定)必须具有一个值,该值是一个空格分隔的令牌集,表示该元素所属于的各种WAI-ARIA角色。这些令牌是角色值,在角色定义([wai-aria], 第5.4节)和图形角色([graphics-aria-1.0], 第4节)中定义。
分配给SVG元素的WAI-ARIA角色是角色属性在空格处分割时找到的第一个有效角色。有效角色是被识别的、非抽象的角色,且允许该元素类型。
名称 | 值 | 初始值 | 可动画 |
---|---|---|---|
role | 空格分隔的令牌集 [HTML] | (见下文) | 否 |
‘role’属性必须是一个空格分隔的令牌集,其值在角色定义中定义([wai-aria], 第5.4节)。
角色值是一组空格分隔的可机器提取的语义信息,用于定义元素的用途。
初始值对于每个SVG元素的‘role’属性是相应的默认隐含的ARIA语义。
为了有效和有用,许多元素角色要求以可访问名称或明确的状态和属性值的形式提供附加信息。可访问名称可以通过SVG描述性元素或ARIA属性提供。每个角色的要求在角色定义的地方指示,例如在WAI-ARIA([WAI-ARIA])或WAI-ARIA图形模块([graphics-aria-1.0)中定义。
WAI-ARIA状态和特性属性可以在SVG元素上指定。这些属性由ARIA在状态和属性定义(所有aria-*属性)([wai-aria], 第6.6节)中定义。
这些属性(如果指定)必须具有WAI-ARIA值类型,映射到相应的SVG值类型,具体定义见将WAI-ARIA值类型映射到语言,使用SVG映射([wai-aria], 第10.2节)。
这些属性是可动画的;如果使用动画更改图形的状态,或以改变正确替代文本描述的方式更改其内容,则应使用相同的动画方法更新相应的ARIA状态或属性属性。
WAI-ARIA状态和特性属性可以用于任何元素。然而,它们并不总是有意义,在这种情况下,用户代理可能不会执行任何处理,仅将它们包含在DOM中。状态和特性属性根据ARIA和SVG可访问性API映射规范进行处理。[wai-aria] [svg-aam-1.0]
下表定义了适用于SVG元素的默认隐含ARIA语义。第一列中的每个语言特性(元素)暗示第二列中同一行的单元格中给出的ARIA语义(角色、状态和/或属性)。第三列定义了有关WAI-ARIA语义(角色、状态或属性)可能适用或不适用的限制。
对于许多图形元素,只有在作者提供指示语义重要性的信息时,才会分配隐含角色。可访问性树的完整包含标准由SVG可访问性API映射规范为用户代理定义[svg-aam-1.0]。对于作者,指示语义重要性的首选方法是为元素提供可访问名称。这可以通过直接子‘title’元素来完成,或通过‘aria-label’或‘aria-labelledby’属性。作者应使用这些方法之一为任何对理解SVG至关重要的内容提供可访问名称,尤其是对于任何交互内容。
语言特性 | 默认隐含的 ARIA 语义 | 允许的角色 |
---|---|---|
‘a’ | link 角色
如果元素具有有效的 href 或 xlink:href 属性。
对于不是链接的 a 元素,默认语义与
tspan 相同,如果 a 元素是 text 的后代,
否则与 g 相同。
|
无限制 |
‘audio’ | 平台特定的角色映射, 如 HTML 可访问性 API 映射 规范中定义的 | 如果指定,角色必须是 application |
‘canvas’ | 平台特定的角色映射, 如 HTML 可访问性 API 映射 规范中定义的 | 无限制 |
‘circle’ | graphics-symbol 角色
如果元素满足 包含标准,
否则 none |
无限制 |
‘clipPath’ | 无 | 无法应用角色 |
‘defs’ | 无 | 无法应用角色 |
‘desc’ | 无 | 无法应用角色 |
‘ellipse’ | graphics-symbol 角色
如果元素满足 包含标准,
否则 none |
无限制 |
‘feBlend’ | 无 | 无法应用角色 |
‘feColorMatrix’ | 无 | 无法应用角色 |
‘feComponentTransfer’ | 无 | 无法应用角色 |
‘feComposite’ | 无 | 无法应用角色 |
‘feConvolveMatrix’ | 无 | 无法应用角色 |
‘feDiffuseLighting’ | 无 | 无法应用角色 |
‘feDisplacementMap’ | 无 | 无法应用角色 |
‘feDistantLight’ | 无 | 无法应用角色 |
‘feDropShadow’ | 无 | 无法应用角色 |
‘feFlood’ | 无 | 无法应用角色 |
‘feFuncA’ | 无 | 无法应用角色 |
‘feFuncB’ | 无 | 无法应用角色 |
‘feFuncG’ | 无 | 无法应用角色 |
‘feFuncR’ | 无 | 无法应用角色 |
‘feGaussianBlur’ | 无 | 无法应用角色 |
‘feImage’ | 无 | 无法应用角色 |
‘feMerge’ | 无 | 无法应用角色 |
‘feMergeNode’ | 无 | 无法应用角色 |
‘feMorphology’ | 无 | 无法应用角色 |
‘feOffset’ | 无 | 无法应用角色 |
‘fePointLight’ | 无 | 不能应用角色 |
‘feSpecularLighting’ | 无 | 不能应用角色 |
‘feSpotLight’ | 无 | 不能应用角色 |
‘feTile’ | 无 | 不能应用角色 |
‘feTurbulence’ | 无 | 不能应用角色 |
‘filter’ | 无 | 不能应用角色 |
‘foreignObject’ | group 角色
如果元素符合 包含标准,
否则 无 |
没有限制 |
‘g’ | group 角色
如果元素符合 包含标准,
否则 无 |
没有限制 |
‘iframe’ | 平台特定角色映射, 如在 HTML 可访问性 API 映射 规范中定义 | 如果指定,角色必须是 application 、document 或 img
角色之一 |
‘image’ | img 角色 |
没有限制 |
‘line’ | graphics-symbol 角色
如果元素符合 包含标准,
否则 无 |
没有限制 |
‘linearGradient’ | 无 | 不能应用角色 |
‘marker’ | 无 | 不能应用角色 |
‘mask’ | 无 | 不能应用角色 |
‘metadata’ | 无 | 不能应用角色 |
‘mpath’ | 无 | 不能应用角色 |
‘path’ | graphics-symbol 角色
如果元素符合 包含标准,
否则 无 |
没有限制 |
‘pattern’ | 无 | 不能应用角色 |
‘polygon’ | graphics-symbol 角色
如果元素符合 包含标准,
否则 无 |
没有限制 |
‘polyline’ | graphics-symbol 角色
如果元素符合 包含标准,
否则 无 |
没有限制 |
‘radialGradient’ | 无 | 不能应用角色 |
‘rect’ | graphics-symbol 角色
如果元素符合 包含标准,
否则 无 |
没有限制 |
‘script’ | 无 | 不能应用角色 |
‘stop’ | 无 | 不能应用角色 |
‘style’ | 无 | 不能应用角色 |
‘svg’ | graphics-document 角色 |
没有限制 |
‘switch’ | 无 | 不能应用角色 |
‘symbol’ | graphics-object 角色
如果元素是渲染的 元素实例
且符合 包含标准,
否则 无 |
没有限制 |
‘text’ | group 角色,
具有平台特定角色映射,
如在 SVG 可访问性 API 映射
规范中定义 |
没有限制 |
‘textPath’ | group 角色
如果元素符合 包含标准,
否则 无 |
没有限制 |
‘title’ | 无 | 不能应用角色 |
‘tspan’ | group 角色
如果元素符合 包含标准,
否则 无 |
没有限制 |
‘use’ | graphics-object 角色
如果元素符合 包含标准,
否则 无 |
没有限制 |
‘video’ | 平台特定角色映射, 如在 HTML 可访问性 API 映射 规范中定义 | 如果指定,角色必须是 application |
‘view’ | 无 | 不能应用角色 |
DOM Core 规范定义了一个 Document 接口,该接口由本规范扩展。
如果 SVG 文档通过引用嵌入,例如当一个 HTML 文档有一个 ‘object’ 元素,其 ‘data’ 属性引用了一个 SVG 文档(即,MIME 类型为 "image/svg+xml" 且其根元素是一个 ‘svg’ 元素),将会存在两个不同的 DOM 层次结构。 第一个 DOM 层次结构是用于引用文档(例如,XHTML 文档)。第二个 DOM 层次结构是用于被引用的 SVG 文档。
partial interface Document { readonly attribute SVGSVGElement? rootElement; };
rootElement IDL 属性 表示根 ‘svg’ 元素。获取时 rootElement 返回文档的根元素, 如果它是一个 ‘svg’ 元素,则返回该元素,否则返回 null。
该属性已被弃用,并可能在未来的 SVG 规范中被移除。 建议作者使用 documentElement 属性 替代 Document。
实现 HTML 的 SVG 实现必须支持 document 接口的 HTML 扩展。 其他 SVG 实现必须支持以下 IDL 片段。
// 仅在某些实现中实现 partial interface Document { readonly attribute DOMString title; readonly attribute DOMString referrer; readonly attribute DOMString domain; readonly attribute Element? activeElement; };
title、referrer、domain 和 activeElement IDL 属性必须表现得与 HTML 中定义的对应 IDL 属性相同。
一个 SVGSVGElement 对象表示一个 ‘svg’ 元素 在 DOM 中。SVGSVGElement 接口还包含一些杂项工具方法,例如数据类型对象工厂方法。
一个 SVGSVGElement 对象维护一个内部 DOMPoint 对象,称为 其 当前平移点对象, 该对象是从 currentTranslate IDL 属性返回的对象。
[Exposed=Window] interface SVGSVGElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; attribute float currentScale; [SameObject] readonly attribute DOMPointReadOnly currentTranslate; NodeList getIntersectionList(DOMRectReadOnly rect, SVGElement? referenceElement); NodeList getEnclosureList(DOMRectReadOnly rect, SVGElement? referenceElement); boolean checkIntersection(SVGElement element, DOMRectReadOnly rect); boolean checkEnclosure(SVGElement element, DOMRectReadOnly rect); void deselectAll(); SVGNumber createSVGNumber(); SVGLength createSVGLength(); SVGAngle createSVGAngle(); DOMPoint createSVGPoint(); DOMMatrix createSVGMatrix(); DOMRect createSVGRect(); SVGTransform createSVGTransform(); SVGTransform createSVGTransformFromMatrix(DOMMatrixReadOnly matrix); Element getElementById(DOMString elementId); // Deprecated methods that have no effect when called, // but which are kept for compatibility reasons. unsigned long suspendRedraw(unsigned long maxWaitMilliseconds); void unsuspendRedraw(unsigned long suspendHandleID); void unsuspendRedrawAll(); void forceRedraw(); }; SVGSVGElement includes SVGFitToViewBox; SVGSVGElement includes SVGZoomAndPan; SVGSVGElement includes WindowEventHandlers;
这些 x、 y、 width 和 height IDL 属性 反映 x、y、width 和 height 属性的计算值及其对应的 表现属性。
currentScale 和 currentTranslate IDL 属性表示响应用户放大和平移操作而应用于文档的变换,如 放大和平移中所描述的。
文档的放大和平移 变换是一个形式为 [currentScale 0 0 currentScale currentTranslate.x currentTranslate.y] 的 2x3 矩阵。 ‘transform’ 属性的值不会影响 currentScale 或 currentTranslate。
获取 currentScale 时, 执行以下步骤:
设置 currentScale 时, 执行以下步骤:
获取 currentTranslate 时, SVGSVGElement 对象的 当前平移点对象 被返回。此对象 表示当前平移 对于 ‘svg’ 元素。当前平移点对象 必须在其 ‘svg’ 元素不是 最外层 svg 元素 时为 只读,否则为可写。
请参见 分配给 DOMPoint 的规则, 以了解修改 当前平移点对象 如何影响文档的放大和平移变换。
每当文档的放大和平移变换因用户交互而变化,或者每当 最外层 svg 元素 发生变化时,执行以下步骤:
在 最外层 svg 元素 变化时运行这些步骤将确保,如果文档元素被替换为不同的 ‘svg’ 元素, 其 currentTranslate 将立即更新以反映文档的放大和平移变换的平移分量。
每当 ‘svg’ 元素 不再是 最外层 svg 元素 时, 其 当前平移点对象 的 x 和 y 分量必须设置为 0。
请注意,‘zoomAndPan’ 属性的值 在 最外层 svg 元素 仅控制文档的 放大和平移变换是否可以通过用户交互更新。 无论该属性的值如何,当前比例和平移 都可以通过修改 currentScale 和 currentTranslate 来更改。
suspendRedraw、 unsuspendRedraw、 unsuspendRedrawAll 和 forceRedraw 方法均已弃用,定义为没有效果。当调用 suspendRedraw 方法时,必须返回 1。
getIntersectionList 和 getEnclosureList 方法的定义如同在 交集与包围中所述。
要查找给定元素element的交集或包含后代,使用给定的矩形rectangle,并将ancestor视为解释rectangle坐标空间的元素,执行以下步骤:
这意味着,尽管我们查看child的use-element影子树中的元素,但我们不将元素实例或它们的对应元素放入result列表中;只有‘use’元素本身被返回。
要查找给定元素element中的非容器图形元素,执行以下步骤:
当调用getIntersectionList(rect, referenceElement)或getEnclosureList(rect, referenceElement)时,执行以下步骤:
当调用checkIntersection(element, rect)或 checkEnclosure(element, rect)时,将执行以下步骤:
deselectAll方法用于从文档中移除任何选择。当调用deselectAll()时,文档的所有范围被移除,并且选择的方向被设置为前向。[DOM][EDITING] 此方法已被弃用,因为它重复了选择API的功能。
这等同于在此‘svg’元素所在的文档上调用document.getSelection().removeAllRanges()
。
createSVGNumber、 createSVGLength、 createSVGAngle、 createSVGPoint、 createSVGMatrix、 createSVGRect和 createSVGTransform方法都是工厂函数,用于创建特定类型的新数据类型对象。当调用这些方法之一时,将根据下表返回一个新对象:
方法 | 对象及详细信息 |
---|---|
createSVGNumber | 一个新的,分离的 SVGNumber对象,其值为0。 |
createSVGLength | 一个新的,分离的 SVGLength对象,其值为无单位的<number> 0。 |
createSVGAngle | 一个新的,分离的 SVGAngle对象,其值为无单位的<number> 0。 |
createSVGPoint | 一个新的,分离的 DOMPoint对象,其坐标均为0。 |
createSVGMatrix | 一个新的,分离的 DOMMatrix对象,表示单位矩阵。 |
createSVGRect | 一个新的,DOMRect对象,其x、y、宽度和高度均为0。 |
createSVGTransform | 一个新的,分离的 SVGTransform对象,其值为matrix(1, 0, 0, 1, 0, 0)。 |
createSVGPoint、 createSVGMatrix和 createSVGRect方法 都已被弃用,仅保留用于与遗留内容的兼容性。 建议作者使用DOMPoint、DOMMatrix和 DOMRect 构造函数。
createSVGTransformFromMatrix 方法用于根据矩阵对象创建新的SVGTransform对象。 其行为与createSVGTransformFromMatrix 方法在SVGTransformList上的行为相同。
SVGGElement对象表示一个‘g’元素在DOM中。
[Exposed=Window] interface SVGGElement : SVGGraphicsElement { };
SVGUnknownElement对象 表示SVG命名空间中的未知元素。
[Exposed=Window] interface SVGUnknownElement : SVGGraphicsElement { };
SVGDefsElement对象表示一个 ‘defs’元素在 DOM中。
[Exposed=Window] interface SVGDefsElement : SVGGraphicsElement { };
SVGDescElement对象表示一个 ‘desc’元素在 DOM中。
[Exposed=Window] interface SVGDescElement : SVGElement { };
SVGMetadataElement对象 表示一个 ‘metadata’元素在DOM中。
[Exposed=Window] interface SVGMetadataElement : SVGElement { };
SVGTitleElement对象表示 一个‘title’元素在 DOM中。
[Exposed=Window] interface SVGTitleElement : SVGElement { };
SVGSymbolElement对象 表示一个 ‘symbol’ 元素在DOM中。
[Exposed=Window] interface SVGSymbolElement : SVGGraphicsElement { }; SVGSymbolElement包括 SVGFitToViewBox;
在SVG 2中新增。 SVGSymbolElement接口现在 继承自 SVGGraphicsElement, 使得在阴影DOM中实例化的符号可以作为图形元素被查询。
一个 SVGUseElement 对象表示 DOM 中的 ‘use’ 元素。
[Exposed=Window] interface SVGUseElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; [SameObject] readonly attribute SVGElement? instanceRoot; [SameObject] readonly attribute SVGElement? animatedInstanceRoot; }; SVGUseElement 包含 SVGURIReference;
x, y, width 和 height IDL 属性 反映 了 x、 y、 width 和 height 属性及其对应的呈现属性。
instanceRoot 和
animatedInstanceRoot
IDL 属性均指向 实例根,
即是此元素的影子根节点的直接子元素的
SVGElementInstance
(u.instanceRoot
等同于获取 u.shadowRoot.firstChild
)。
如果此元素没有影子树
(例如,因其 URI 无效
或因被 条件处理 禁用),
则获取这些属性返回 null。
每个 use-element shadow tree 的根对象 实现 SVGUseElementShadowRoot 接口。 此接口目前未定义对 ShadowRoot 接口 和 DocumentOrShadowRoot 混合体定义的属性和方法的任何扩展。 但是,从作者脚本的角度来看,根植于此节点的树完全是只读的。
[Exposed=Window] interface SVGUseElementShadowRoot : ShadowRoot { };
SVGElementInstance 接口 定义对 SVGElement 接口的扩展, 这些扩展仅用于 use-element shadow tree 中的元素。
在早期版本的 SVG 中, SVG 元素实例被定义为有效的事件目标但不是完整的 DOM 节点的非元素对象。 本规范重新定义了 use-element shadow tree 以使其与影子 DOM 规范一致,这意味着实例实际上是 SVGElement 对象。 此接口为向后兼容添加了缺失的功能。 但是,作者应意识到兼容性并不完美, 并据此设计他们的脚本。 还要注意,这些属性在影子树中的 HTML 命名空间元素对象上不可用。
interface mixin SVGElementInstance { [SameObject] readonly attribute SVGElement? correspondingElement; [SameObject] readonly attribute SVGUseElement? correspondingUseElement; };
correspondingElement IDL 属性 如果此元素是 元素实例 在 use-element shadow tree 中,则指向 对应元素, 否则为 null。
当 引用的元素 在外部文件中时,
此指针的存在意味着必须在内存中维护外部文件的整个 DOM。
但是,按照目前的规范,外部 DOM 是只读的。
因此,它提供的功能有限,并可能对性能产生较大影响。
在等待实现者的反馈时,
作者应考虑将对外部文件引用的 correspondingElement
的使用视为风险。
correspondingUseElement IDL 属性 如果此元素是 元素实例 在 use-element shadow tree 中,则指向 对应的使用元素, 否则为 null。
ShadowAnimation 接口定义了 一个只读的 Animation 对象, 它镜像了从中构造的 sourceAnimation 对象的所有变化。 它们用于镜像在 use-element shadow tree 中 作者发起的动画对象。
[Constructor(Animation source, Animatable newTarget), Exposed=Window] interface ShadowAnimation : Animation { [SameObject] readonly attribute Animation sourceAnimation; };
sourceAnimation IDL 属性 指向构造函数中传入的 Animation 对象。
构造函数生成一个新的 ShadowAnimation 对象,
它反映了 sourceAnimation 上的所有属性,
但其 effect
是通过构造一个新的
KeyframeEffectReadOnly
来创建的,使用 sourceAnimation 的关键帧效果作为其源,
然后将其 target
修改为匹配 newTarget
参数。
ShadowAnimation 是只读的。
任何尝试设置任何继承的 IDL 属性或调用任何 Animation 方法以改变
其状态的操作,
必须抛出 NoModificationAllowedError
。
但是,用户代理必须确保对
sourceAnimation 的任何属性或状态的变化
都会反映在 ShadowAnimation 的变化中。
一个 SVGSwitchElement 对象 表示 DOM 中的 ‘switch’ 元素。
[Exposed=Window] interface SVGSwitchElement : SVGGraphicsElement { };
此接口提供对嵌入的 SVG 文档的访问,该文档通过引用嵌入在另一个基于 DOM 的语言中。 期望此接口在允许此类 SVG 文档引用的 DOM 对象上实现。
此接口已被弃用,可能会在未来的 SVG 规范版本中删除。要访问
嵌入在 ‘iframe’ 或
‘object’ 元素中的 SVG 文档,
建议作者分别使用 contentDocument
属性在 HTMLIFrameElement
或 HTMLObjectElement
接口。
HTMLIFrameElement、 HTMLEmbedElement 和 HTMLObjectElement 接口都定义了自己的 getSVGDocument 方法, 提供以与 GetSVGDocument 相同的方式访问 SVG 文档。因此,这三个 接口无需实现 GetSVGDocument。 仍然,强烈建议作者使用 contentDocument。
interface mixin GetSVGDocument { Document getSVGDocument(); };
getSVGDocument 方法 用于返回引用的 SVG 文档。当调用 getSVGDocument() 时, 必须返回嵌入元素引用的 Document 对象 实现 GetSVGDocument 接口;如果没有文档,则返回 null。
请注意,这不会检查引用的文档是否确实是 SVG 文档。 相反,返回任何文档。