所有 SVG 内容均绘制在 SVG 视口内。 每个 SVG 视口定义了一个绘图区域,其特征包括大小 (宽度、高度)和原点,单位为抽象的 用户单位。
请注意,SVG 视口一词与 CSS 中的 "视口" 一词是不同的。
初始视口是一个顶级 SVG 视口,它在包含环境(例如,Web 浏览器中的 CSS 像素)和 用户单位之间建立映射。建立初始视口的详细信息在 初始视口中描述。
SVG 视口仅由元素建立。有关哪些元素生成视口的信息,请参见 建立新的 SVG 视口。
每个 SVG 视口生成一个 视口坐标系统 和一个 用户坐标系统, 初始时是相同的。 在视口元素上提供 ‘viewBox’ 会相对于视口坐标系统转换用户坐标系统,具体描述见 ‘viewBox’ 属性。 视口的子元素可以进一步修改 用户坐标系统,例如通过指定 transform 属性。
SVG 视口可以嵌套。百分比单位是相对于最近的祖先 SVG 视口的宽度和高度来解析的。 因此,嵌套 SVG 视口提供了重新定义百分比单位含义的机会,并为“适应”相对于特定矩形区域的图形提供了新的参考矩形。
SVG 视口的宽度、高度和原点由生成 SVG 视口的 SVG 文档片段与该片段的父元素(无论是真实的还是隐式的)之间的协商过程确定。 有关该协商过程的描述,请参见 建立新的 SVG 视口。
默认情况下,嵌套 SVG 视口的 视口坐标系统 等价于父元素的局部坐标系统,由 SVG 视口元素的原点进行平移。然而,SVG 视口元素上的 transform 属性将修改 视口坐标系统,相对于父元素的用户坐标系统。
抽象而言,所有 SVG 视口都嵌入在 画布中, 这是一个在所有相关维度上无限大的绘图区域。
该过程将 viewBox 属性的 min-x、min-y、宽度和高度值、定义 viewBox 属性的元素的位置和大小,以及该元素的 preserveAspectRatio 属性值转换为应用于该元素包含的内容的平移和缩放。
应用于该元素包含的内容的变换为 translate(translate-x, translate-y) scale(scale-x, scale-y)。
初始视口的宽度必须是 width 呈现属性在 最外层 svg 元素 上的值,除非满足以下条件:
在这些条件下,视口的宽度必须通过定位属性来建立。
同样,如果在引用元素或 最外层 svg 元素 上指定了足够的 定位属性 来确定视口的高度,则这些定位属性必须建立视口的高度;否则,初始视口的高度必须是 height 呈现属性在 最外层 svg 元素 上的值。
如果 width 或 height 呈现属性在 最外层 svg 元素 上是以 用户单位 为单位(即没有提供单位标识符),则该值被认为等同于相同数量的 "px" 单位(见 单位)。
在以下示例中,一个 SVG 图形被内嵌在一个使用 CSS 布局规则格式化的父 XML 文档中。由于在 最外层 svg 元素 上未提供 CSS 定位属性, 因此 width="100px" 和 height="200px" 属性 决定了初始视口的大小:
<?xml version="1.0" standalone="yes"?> <parent xmlns="http://some.url"> <!-- SVG graphic --> <svg xmlns='http://www.w3.org/2000/svg' width="100px" height="200px"> <path d="M100,100 Q200,400,300,100"> <!-- 其余的 SVG 图形将在此处 --> </svg> </parent>
对于 最外层 svg 元素,SVG 用户代理必须确定一个初始 视口坐标系统 和一个初始 用户坐标系统,使得这两个坐标系统是相同的。两个坐标系统的原点必须位于 SVG 视口的原点,并且初始坐标系统中的一个单位必须等于一个 CSS 2.1 px ([CSS2], 第 4.3.2 节)在 SVG 视口中。
在独立的 SVG 文档和嵌入在父文档中的 SVG 文档片段(通过引用或内嵌)中,父文档的布局由 CSS [CSS2] 确定,初始视口 坐标系统(因此初始用户坐标系统)的原点必须位于视口的顶部/左侧,正 x 轴指向右侧,正 y 轴指向下方,文本以“直立”方向呈现,这意味着字形的顶部边缘朝上,右边缘朝右。
如果 SVG 实现是支持使用 CSS 2.1 兼容 px 单位样式文档的用户代理的一部分,则 SVG 用户代理应将其 px 单位的初始值设置为与其他样式操作使用的值匹配;否则,如果用户代理可以从其环境中确定 px 单位的大小,则应使用该值;否则,应该选择一个适合的 px 单位大小。在所有情况下,px 的大小必须符合 CSS 2.1 中描述的规则 ([CSS2], 第 4.3.2 节)。
示例 InitialCoords 显示初始坐标系统的原点位于顶部/左侧,x 轴指向右侧,y 轴指向下方。初始用户坐标系统中的一个用户单位等于父(隐式或显式)用户代理的“像素”。
<?xml version="1.0" standalone="no"?> <svg width="300px" height="100px" version="1.1" xmlns="http://www.w3.org/2000/svg"> <desc>示例 InitialCoords - SVG 的初始坐标系统</desc> <g fill="none" stroke="black" stroke-width="3" > <line x1="0" y1="1.5" x2="300" y2="1.5" /> <line x1="1.5" y1="0" x2="1.5" y2="100" /> </g> <g fill="red" stroke="none" > <rect x="0" y="0" width="3" height="3" /> <rect x="297" y="0" width="3" height="3" /> <rect x="0" y="97" width="3" height="3" /> </g> <g font-size="14" font-family="Verdana" > <text x="10" y="20">(0,0)</text> <text x="240" y="20">(300,0)</text> <text x="10" y="90">(0,100)</text> </g> </svg>
示例 InitialCoords
用户代理必须支持 transform 属性和 呈现属性,如 [css-transforms-1] 中定义的那样。
名称 | 值 | 初始值 | 可动画 |
---|---|---|---|
viewBox | [<min-x>,? <min-y>,? <width>,? <height>] | 未指定的情况。 | 是 |
<min-x>, <min-y>, <width>, <height> = <number>
对‘svg’元素的变换有点特殊,因为‘viewBox’属性。变换应当应用于‘svg’仿佛其有一个设置了该变换的父元素。
决议:变换属性在概念上适用于'`svg`'元素外部,且在视觉效果上没有展示属性和样式属性的区别。
与‘viewBox’ 属性结合使用的‘preserveAspectRatio’属性, 提供了将SVG视口拉伸以适应特定容器元素的能力。
‘viewBox’ 属性的值是一个由四个数字<min-x>、<min-y>、<width>和<height>组成的列表,数字之间用空格和/或逗号分隔,指定一个用户空间中的矩形,该矩形应映射到给定元素建立的SVG视口的边界,考虑到‘preserveAspectRatio’属性。 ‘viewBox’属性的存在导致对视口坐标系统应用变换,具体描述见计算SVG视口的等效变换。
<width>或 <height>的负值是错误的,会使‘viewBox’属性无效。零值禁用元素的渲染。
示例 ViewBox 说明了在最外层svg元素上使用‘viewBox’属性来指定SVG内容应拉伸以适应SVG视口的边界。
<?xml version="1.0" standalone="no"?> <svg width="300px" height="200px" viewBox="0 0 1500 1000" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg"> <desc>示例 ViewBox - 使用 viewBox 属性自动创建一个初始用户坐标系统,使得图形无论SVG视口的大小如何,都能缩放以适应SVG视口。</desc> <!-- 该矩形在用户坐标系统中从(0,0)到(1500,1000)。 因为上面的viewBox属性,该矩形将填充为SVG内容保留的整个区域。 --> <rect x="0" y="0" width="1500" height="1000" fill="yellow" stroke="blue" stroke-width="12" /> <!-- 一个大型红色三角形 --> <path fill="red" d="M 750,100 L 250,900 L 1250,900 z"> <!-- 一串跨越大部分SVG视口的文本 --> <text x="100" y="600" font-size="200" font-family="Verdana" > 拉伸以适应 </text> </svg>
渲染到 SVG视口, 宽度=300px, 高度=200px |
渲染到 SVG视口, 宽度=150px, 高度=200px |
|
---|---|---|
![]() |
![]() |
‘viewBox’属性的效果是用户代理自动提供适当的变换矩阵,将指定的用户坐标系统中的矩形映射到指定区域的边界(通常是SVG视口)。为了实现左侧示例的效果,SVG视口尺寸为300x200像素,用户代理需要自动插入一个将X和Y均缩放0.2的变换。这个效果等同于有一个300px宽和200px高的SVG视口,以及以下补充变换:
<?xml version="1.0" standalone="no"?> <svg width="300px" height="200px" xmlns="http://www.w3.org/2000/svg"> <g transform="scale(0.2)"> <!-- 其余文档内容在此 --> </g> </svg>
为了实现右侧示例的效果,SVG视口尺寸为150x200像素,用户代理需要自动插入一个将X缩放0.1和Y缩放0.2的变换。这个效果等同于有一个150px宽和200px高的SVG视口,以及以下补充变换:
<?xml version="1.0" standalone="no"?> <svg width="150px" height="200px" xmlns="http://www.w3.org/2000/svg"> <g transform="scale(0.1 0.2)"> <!-- 其余文档内容在此 --> </g> </svg>
请注意,在某些情况下,用户代理需要提供一个 translate 变换,除了 scale 变换。例如,在一个 最外层 svg 元素上,如果 ‘viewBox’ 属性 指定了非零的 <min-x> 或 <min-y> 值,则需要 translate 变换。
如果同时应用了 transform(或 ‘patternTransform’) 和 ‘viewBox’, 则会建立两个新的坐标系统。transform 为元素建立第一个新的 坐标系统。‘viewBox’ 为该元素的所有后代建立第二个坐标系统。第一个坐标系统会被第二个坐标系统后乘。
与 transform 属性不同, 由于 ‘viewBox’ 创建的自动变换 不会影响 ‘x’、‘y’、‘width’ 和 ‘height’ 属性(或在 ‘marker’ 元素的情况下, ‘markerWidth’ 和 ‘markerHeight’ 属性)在具有 ‘viewBox’ 属性的元素上。因此,在上面的示例中,展示了一个 ‘svg’ 元素,其具有 width 和 height 表现属性,以及一个 ‘viewBox’ 属性, width 和 height 表示在 应用 ‘viewBox’ 变换之前 存在的坐标系统中的值。另一方面,像 transform 属性一样,它确实为所有其他属性和 后代元素建立了一个新的坐标系统。
名称 | 值 | 初始值 | 可动画 |
---|---|---|---|
preserveAspectRatio | <align> <meetOrSlice>? | xMidYMid meet | 是 |
<align> = none | xMinYMin | xMidYMin | xMaxYMin | xMinYMid | xMidYMid | xMaxYMid | xMinYMax | xMidYMax | xMaxYMax
<meetOrSlice> = meet | slice
指示是否强制均匀缩放。适用于所有建立新SVG视口的元素(参见建立SVG视口的元素),以及 ‘image’、 ‘marker’、 ‘pattern’和 ‘view’元素
在某些情况下,通常在使用‘viewBox’属性时,希望图形伸展以不均匀地填充整个SVG视口。在其他情况下,希望使用均匀缩放,以保持图形的宽高比。
对于建立新SVG视口的元素(参见建立SVG视口的元素),以及 ‘marker’、 ‘pattern’和 ‘view’元素, ‘preserveAspectRatio’仅在同一元素的‘viewBox’上提供值时适用。对于这些元素,如果未提供‘viewBox’属性,则‘preserveAspectRatio’将被忽略。
对于‘image’元素, ‘preserveAspectRatio’指示参考图像应如何根据参考矩形进行适配,以及是否应保持参考图像相对于当前用户坐标系统的宽高比。
参数<align>指示是否强制均匀缩放,以及如果强制,则在宽高比不匹配SVG视口时使用的对齐方法。参数<align>必须是以下字符串之一:
<meetOrSlice> 参数是可选的,如果提供,它与<align>值之间用一个或多个空格分隔,然后必须是以下字符串之一:
meet(默认值) - 以如下方式缩放图形:
在这种情况下,如果图形的纵横比与SVG视口不匹配,某些SVG视口将超出‘viewBox’的边界(即,‘viewBox’将绘制的区域将小于SVG视口)。
slice - 以如下方式缩放图形:
在这种情况下,如果‘viewBox’的纵横比与SVG视口不匹配,部分‘viewBox’将超出SVG视口的边界(即,‘viewBox’将绘制的区域大于SVG视口)。
示例 PreserveAspectRatio 说明了‘preserveAspectRatio’的各种选项。示例通过在最外层svg元素内部嵌入‘svg’子元素创建几个新的SVG视口(参见建立新的SVG视口)。
<svg width="450px" height="300px" xmlns="http://www.w3.org/2000/svg"> <desc>示例 PreserveAspectRatio - 说明preserveAspectRatio属性</desc> <style type="text/css"> text { font-size: 9; } rect { fill: none; stroke: blue; } </style> <defs> <g id="smile"> <rect x='.5' y='.5' width='29' height='39' style="fill:black;stroke:red"> <circle cx='15' cy='20' r='10' fill='yellow'/> <circle cx='12' cy='17' r='1.5' fill='black'/> <circle cx='17' cy='17' r='1.5' fill='black'/> <path d='M 10 24 A 8 8 0 0 0 20 24' stroke='black' stroke-width='2'/> </g> </defs> <rect x="1" y="1" width="448" height="298"> <text x="10" y="30">SVG to fit</text> <g transform="translate(20,40)"><use href="#smile" /></g> <text x="10" y="110">Viewport 1</text> <g transform="translate(10,120)"><rect x='.5' y='.5' width='49' height='29'/></g> <text x="10" y="180">Viewport 2</text> <g transform="translate(20,190)"><rect x='.5' y='.5' width='29' height='59'/></g> <g id="meet-group-1" transform="translate(100, 60)"> <text x="0" y="-30">--------------- meet ---------------</text> <g> <text y="-10">xMin*</text> <rect x='.5' y='.5' width='49' height='29'/> <svg preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 40" width="50" height="30"> <use href="#smile" /> </svg> </g> <g transform="translate(70,0)"> <text y="-10">xMid*</text> <rect x='.5' y='.5' width='49' height='29'/> <svg preserveAspectRatio="xMidYMid meet" viewBox="0 0 30 40" width="50" height="30"> <use href="#smile" /> </svg> </g> <g transform="translate(0,70)"> <text y="-10">xMax*</text> <rect x='.5' y='.5' width='49' height='29'/> <svg preserveAspectRatio="xMaxYMax meet" viewBox="0 0 30 40" width="50" height="30"> <use href="#smile" /> </svg> </g> </g> <g id="meet-group-2" transform="translate(250, 60)"> <text x="0" y="-30">---------- meet ----------</text> <g> <text y="-10">*YMin</text> <rect x='.5' y='.5' width='29' height='59'/> <svg preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 40" width="30" height="60"> <use href="#smile" /> </svg> </g> <g transform="translate(50, 0)"> <text y="-10">*YMid</text> <rect x='.5' y='.5' width='29' height='59'/> <svg preserveAspectRatio="xMidYMid meet" viewBox="0 0 30 40" width="30" height="60"> <use href="#smile" /> </svg> </g> <g transform="translate(100, 0)"> <text y="-10">*YMax</text> <rect x='.5' y='.5' width='29' height='59'/> <svg preserveAspectRatio="xMaxYMax meet" viewBox="0 0 30 40" width="30" height="60"> <use href="#smile" /> </svg> </g> </g> <g id="slice-group-1" transform="translate(100, 220)"> <text x="0" y="-30">---------- slice ----------</text> <g> <text y="-10">xMin*</text> <rect x='.5' y='.5' width='29' height='59'/> <svg preserveAspectRatio="xMinYMin slice" viewBox="0 0 30 40" width="30" height="60"> <use href="#smile" /> </svg> </g> <g transform="translate(50,0)"> <text y="-10">xMid*</text> <rect x='.5' y='.5' width='29' height='59'/> <svg preserveAspectRatio="xMidYMid slice" viewBox="0 0 30 40" width="30" height="60"> <use href="#smile" /> </svg> </g> <g transform="translate(100,0)"> <text y="-10">xMax*</text> <rect x='.5' y='.5' width='29' height='59'/> <svg preserveAspectRatio="xMaxYMax slice" viewBox="0 0 30 40" width="30" height="60"> <use href="#smile" /> </svg> </g> </g> <g id="slice-group-2" transform="translate(250, 220)"> <text x="0" y="-30">--------------- slice ---------------</text> <g> <text y="-10">*YMin</text> <rect x='.5' y='.5' width='49' height='29'/> <svg preserveAspectRatio="xMinYMin slice" viewBox="0 0 30 40" width="50" height="30"> <use href="#smile" /> </svg> </g> <g transform="translate(70,0)"> <text y="-10">*YMid</text> <rect x='.5' y='.5' width='49' height='29'/> <svg preserveAspectRatio="xMidYMid slice" viewBox="0 0 30 40" width="50" height="30"> <use href="#smile" /> </svg> </g> <g transform="translate(140,0)"> <text y="-10">*YMax</text> <rect x='.5' y='.5' width='49' height='29'/> <svg preserveAspectRatio="xMaxYMax slice" viewBox="0 0 30 40" width="50" height="30"> <use href="#smile" /> </svg> </g> </g> </svg>
示例 PreserveAspectRatio
在SVG内容中包含一个‘svg’元素 将创建一个新的SVG视口,所有包含的图形将在此视口中绘制;这隐式地建立了一个新的视口坐标系统和一个新的用户坐标系统。 此外,由于建立了一个新的SVG视口,因此其中的百分比单位也有了新的含义(参见单位)。
新的SVG视口的边界由建立新SVG视口的元素上的‘x’、‘y’、‘width’和‘height’属性定义,例如一个‘svg’元素。新的视口坐标系统和新的用户坐标系统 的原点位于(‘x’,‘y’),其中‘x’和‘y’表示建立SVG视口的元素上相应属性的值。新的 视口坐标系统和新的用户坐标系统的方向与建立SVG视口的元素的当前用户坐标系统的方向相对应。 在新的视口坐标系统和新的用户坐标系统中,一个单位的大小与建立SVG视口的元素的当前用户坐标系统中一个单位的大小相同。
以下是一个示例:
<?xml version="1.0" standalone="no"?> <svg width="4in" height="3in" xmlns="http://www.w3.org/2000/svg"> <desc>此SVG绘图嵌入另一个,从而建立新的SVG视口 </desc> <!-- 以下语句建立新的SVG视口 并将SVG绘图B渲染到该SVG视口 --> <svg x="25%" y="25%" width="50%" height="50%"> <!-- 绘图B在这里 --> </svg> </svg>
有关创建新SVG视口的详细示例,请参见示例 PreserveAspectRatio.
以下元素建立新的SVG视口:
出于历史原因,‘pattern’和‘marker’元素 不会创建新的视口,尽管接受‘viewBox’属性。 ‘clipPath’或‘mask’ 元素也不例外。 这些元素内容中的百分比长度与图形效果区域的尺寸不成比例。
‘foreignObject’元素为其子内容建立一个新的 CSS包含块。 当其回退内容被渲染时,‘video’、‘audio’或‘canvas’元素也是如此。 这对布局子内容的范围有类似于新视口的效果。 然而,为了渲染作为‘foreignObject’后代的SVG元素, 必须有一个新的‘svg’元素 来建立SVG文档片段和SVG视口。
‘image’或‘iframe’元素创建一个新的 文档视口 用于引用的文档。 如果引用的文档是SVG文件,它当然会建立自己的SVG视口。
新的SVG视口是否也建立了新的额外裁剪路径取决于在建立新SVG视口的元素上的overflow属性的值。
SVG 遵循 CSS 值和单位模块 [css-values] 中对属性、呈现属性和 CSS 属性的常见值和单位的描述和定义。每个属性和属性必须指定使用的组件值类型。随后或扩展的由 CSS 工作组或 SVG 工作组发布的规范可以扩展基本数据类型或添加新数据类型。
对于被定义为相对于 SVG 视口大小的 <percentage> 值:
sqrt((width)**2 + (height)**2)/sqrt(2)
计算。示例单位 下面说明了不同类型单位的一些处理规则。
<?xml version="1.0" standalone="no"?> <svg width="400px" height="200px" viewBox="0 0 4000 2000" xmlns="http://www.w3.org/2000/svg"> <title>示例单位</title> <desc>说明各种单位选项</desc> <!-- 框架 --> <rect x="5" y="5" width="3990" height="1990" fill="none" stroke="blue" stroke-width="10"> <g fill="blue" stroke="red" font-family="Verdana" font-size="150"> <!-- 绝对单位标识符 --> <g transform="translate(400,0)"> <text x="-50" y="300" fill="black" stroke="none">绝对单位:</text> <rect x="0" y="400" width="4in" height="2in" stroke-width=".4in"> <rect x="0" y="750" width="384" height="192" stroke-width="38.4"> <g transform="scale(2)"> <rect x="0" y="600" width="4in" height="2in" stroke-width=".4in"> </g> </g> <!-- 相对单位标识符 --> <g transform="translate(1600,0)"> <text x="-50" y="300" fill="black" stroke="none">相对单位:</text> <rect x="0" y="400" width="2.5em" height="1.25em" stroke-width=".25em"> <rect x="0" y="750" width="375" height="187.5" stroke-width="37.5"> <g transform="scale(2)"> <rect x="0" y="600" width="2.5em" height="1.25em" stroke-width=".25em"> </g> </g> <!-- 百分比 --> <g transform="translate(2800,0)"> <text x="-50" y="300" fill="black" stroke="none">百分比:</text> <rect x="0" y="400" width="10%" height="10%" stroke-width="1%"> <rect x="0" y="750" width="400" height="200" stroke-width="31.62"> <g transform="scale(2)"> <rect x="0" y="600" width="10%" height="10%" stroke-width="1%"> </g> </g> </g> </svg>
示例单位
左侧的三个矩形演示了使用绝对单位标识符之一,“in”单位(英寸)。CSS 定义 1 英寸等于 96 像素。因此,最上面的矩形(以英寸为单位)与中间的矩形(以用户单位指定,使得每对应英寸有 96 用户单位)完全相同。该组底部矩形说明了当以英寸指定的值被缩放时会发生什么。
中间的三个矩形演示了使用相对单位标识符之一,“em”单位。由于外部 ‘g’ 元素的 font-size 属性被设置为 150,每个“em”单位等于 150 用户单位。顶部矩形(以“em”单位指定)与中间矩形(以用户单位指定,使得每个“em”单位有 150 用户单位)完全相同。该组底部矩形说明了当以“em”单位指定的值被缩放时会发生什么。
右侧的三个矩形演示了使用百分比。请注意,SVG 视口的用户坐标系统中的宽度和高度(在这种情况下为 最外层 svg
元素)分别为 4000 和 2000,因为处理 ‘viewBox’
属性会导致用户坐标系统的变换。顶部矩形(以百分比单位指定)与中间矩形(以等效用户单位指定)完全相同。特别注意,中间矩形的 stroke-width 属性设置为实际宽度的 1% 的
sqrt((actual-width)**2 + (actual-height)**2) / sqrt(2)
,在这种情况下是
.01*sqrt(4000*4000+2000*2000)/sqrt(2),或 31.62。该组底部矩形说明了当以百分比单位指定的值被缩放时会发生什么。
元素的边界框(或“bbox”)是与该元素用户坐标系统的轴对齐的最紧密的矩形,完全包含该元素及其后代。
可以为一个元素计算三种类型的边界框:
请注意,元素上的不透明度、可见性、填充、填充不透明度、填充规则、描边虚线数组和描边虚线偏移属性对元素的边界框没有影响。
对于曲线形状,边界框必须包含形状边缘的所有部分,而不仅仅是端点。请注意,曲线的控制点如果未被定义为位于结果曲线的线条上(例如,立方贝塞尔命令的第二个坐标对)不得对边界框的维度产生影响(尽管这些点可能落在边界框的区域内,如果它们位于形状内部,或者靠近曲线)。例如,距离曲线边缘的非包围侧的控制点必须从边界框中排除。
路径'M20,50 L35,100 H120 V50 Q70,10 20,50'以浅蓝色显示。左侧显示了路径的正确对象边界框。请注意,它不包括曲线的最上方控制点,但它包括了所有蓝色形状,甚至是那些位于控制点的凸包外的部分。
即使元素不在渲染树中——因为它被设置为'display: none'、位于‘defs’元素中、不通常渲染的‘symbol’元素,或不在文档树中——它仍然有一个边界框。对元素的getBBox调用将返回与元素被渲染时相同的矩形。然而,不在渲染树中的元素不会对任何祖先元素的边界框产生贡献。
以下示例定义了多个元素。每个具有ID的元素的预期对象边界框如下所示。
<svg xmlns="http://www.w3.org/2000/svg"> <title>边界框计算</title> <desc>根据上下文显示不同边界框结果的元素示例。</desc> <defs id="defs-1"> <rect id="rect-1" x="20" y="20" width="40" height="40" fill="blue" /> </defs> <g id="group-1"> <use id="use-1" href="#rect-1" x="10" y="10" /> <g id="group-2" display="none"> <rect id="rect-2" x="10" y="10" width="100" height="100" fill="red" /> </g> </g> </svg>
元素ID | 边界框结果 |
---|---|
"defs-1 " |
{0, 0, 0, 0} |
"rect-1 " |
{20, 20, 40, 40} |
"group-1 " |
{30, 30, 40, 40} |
"use-1 " |
{30, 30, 40, 40} |
"group-2 " |
{10, 10, 100, 100} |
"rect-2 " |
{10, 10, 100, 100} |
对于文本内容元素,为了边界框计算的目的,每个字形必须被视为一个单独的图形元素。计算必须假设所有字形占用完整字形单元。完整字形单元的宽度必须等于水平推进,且高度等于水平文本的EM框。对于侧排的垂直文本,完整字形单元必须具有等于EM框的宽度和等于水平推进的高度。对于其他垂直文本,完整字形单元的宽度必须等于EM框,高度必须等于垂直推进,或者如果字体中未定义垂直推进,则高度等于EM框的高度。例如,对于水平文本,计算必须假设每个字形垂直延伸到字体的完整升高和降落值。
因为声明式或脚本化的动画可以改变元素的形状、大小和位置,边界框是可变的。因此,元素的边界框应反映在请求边界框时元素的当前值,无论是通过脚本调用,还是作为声明式或链接语法的一部分。
具有零宽度、零高度或两者的元素(例如一个垂直或水平线,或具有零宽度或高度的‘rect’元素)仍然具有边界框,对于正维度,边界框的值为正维度,或者如果未指定正维度,则宽度和高度均为'0'。类似地,具有零宽度和高度的‘path’元素的子路径段必须包含在该元素的几何形状中,以便于边界框的计算。
没有指定位置的元素(例如‘path’元素,其d属性值为none)在计算边界框时位置为(0,0)。
注意,DOM对象不是SVGGraphicsElement(如渐变元素)的元素没有边界框,因此没有请求边界框的接口。
在渲染树中的元素引用未解析的资源仍然具有边界框,由其属性中指定的位置和维度定义,或者如果未提供值,则由这些属性的初始值定义。例如,元素<use href="#bad" x="10" y="10">
将具有x和y为10,宽度和高度为0的边界框。
以下算法定义了如何计算给定元素的边界框。算法的输入为:
根据element的类型,计算边界框的算法如下:
属性 fill、fill-opacity 和 fill-rule 的值不影响 fill-shape。
属性 stroke-opacity、stroke-dasharray 和 stroke-dashoffset 的值不影响对 stroke 形状的计算。
与值为 (0, 0, 0, 0) 和空形状的 box 的并集是 box。
对象边界框、描边边界框 或 装饰边界框 是通过调用上述边界框计算算法得到的,参数如下: element 为元素本身;space 为元素的用户坐标系统;fill 为 true; stroke 为 true 如果我们正在计算 描边边界框 或 装饰边界框,否则为 false;markers 为 true 如果我们正在计算 装饰边界框,否则为 false;clipped 为 false。
以下元素提供将坐标值和长度表示为 对象边界框 的分数(在某些情况下为百分比)的选项,通过在给定元素上设置指定属性为 'objectBoundingBox':
元素 | 属性 | 效果 |
---|---|---|
‘linearGradient’ | ‘gradientUnits’ | 指示指定梯度向量的属性(‘x1’, ‘y1’, ‘x2’, ‘y2’) 代表与应用梯度的元素的边界框的分数或百分比。 |
‘radialGradient’ | ‘gradientUnits’ | 指示指定中心的属性(‘cx’, ‘cy’), 半径(‘r’)和焦点 (‘fx’, ‘fy’) 代表与应用梯度的元素的边界框的分数或百分比。 |
‘pattern’ | ‘patternUnits’ | 指示定义如何平铺图案的属性(‘x’, ‘y’, ‘width’, ‘height’) 是 使用应用图案的元素的边界框建立的。 |
‘pattern’ | ‘patternContentUnits’ | 指示图案内容的用户坐标系统是使用应用图案的元素的边界框建立的。 |
‘clipPath’ | ‘clipPathUnits’ | 指示clipPath 元素内容的用户坐标系统是使用应用裁剪路径的元素的边界框建立的。
|
‘mask’ | ‘maskUnits’ | 指示定义遮罩区域的属性(‘x’, ‘y’, ‘width’, ‘height’) 是 使用应用遮罩的元素的边界框建立的。 |
‘mask’ | ‘maskContentUnits’ | 指示mask 元素内容的用户坐标系统是使用应用遮罩的元素的边界框建立的。 |
‘filter’ | ‘filterUnits’ | 指示定义 滤镜效果区域 的属性 (‘x’, ‘y’, ‘width’, ‘height’) 代表与应用滤镜的元素的边界框的分数或百分比。 |
‘filter’ | ‘primitiveUnits’ | 指示滤镜原语内的各种长度值代表与应用滤镜的元素的边界框的分数或百分比。 |
在接下来的讨论中,术语 适用元素 是指应用特定效果的元素。对于梯度和图案,适用元素是具有其 填充 或 描边 属性引用给定梯度或图案的 图形元素。(有关 文本元素 的特殊规则,请参见 对象边界框单位和文本元素 的讨论。)对于裁剪路径、遮罩和滤镜,适用元素可以是 容器元素 或 图形元素。
当使用关键字 objectBoundingBox 时,效果就像在嵌套变换矩阵列表中插入一个补充变换矩阵,以创建一个新的用户坐标系统。
首先,通过确定适用元素的 对象边界框 的范围来获得(minx,miny)和(maxx,maxy)坐标。
然后,在新的用户坐标系统中,坐标(0,0)映射到适用元素的用户坐标系统中紧密边界框的(minx,miny)角落,坐标(1,1)映射到适用元素的紧密边界框的(maxx,maxy)角落。在大多数情况下,以下变换矩阵产生正确的效果:
[ (maxx-minx) 0 0 (maxy-miny) minx miny ]
当使用百分比与定义梯度向量、图案瓷砖、滤镜区域或遮罩区域的属性时,百分比表示与相应的十进制值相同的值(例如,50% 表示与 0.5 相同)。如果在 ‘pattern’、‘clipPath’、‘mask’ 或 ‘filter’ 元素中使用百分比,这些 值根据 单位 中定义的百分比处理规则进行处理。
可以为以对象边界框单位的分数或百分比表示的值指定任何数值。特别是,可以指定小于零或大于一的分数,以及小于 0% 或大于 100% 的百分比。
当适用元素的几何形状没有宽度或高度时,例如水平或垂直线,即使线由于具有非零的描边宽度而在观察时具有实际厚度,也不应使用关键字 objectBoundingBox,因为描边宽度在边界框计算中被忽略。当适用元素的几何形状没有宽度或高度且指定了 objectBoundingBox 时,给定效果(例如,梯度或滤镜)将被忽略。
为了在使用 CSS 格式化的主机文档中包含 SVG,必须计算 具体对象大小。 具体对象大小 必须使用 默认大小算法 计算,该算法在 CSS Images 3 中定义 [css-images-3], 输入如下:
指定大小 必须根据 宽度 和 高度 属性的使用值确定,属于 ‘svg’ 元素。
固有尺寸 也必须根据 宽度 和 高度 属性确定。如果未指定 宽度 或 高度,则使用值为初始值 'auto'。 'auto' 和百分比长度不得用于确定 固有宽度 或 固有高度。
对于位图图像格式,固有尺寸 是固定在 图像文件中的,指定大小根据需要在主机文档中定义以缩放图像。 SVG 由于具有可伸缩性,会调整 固有宽度 和 固有高度 为 指定大小。 因此,当指定为长度时,宽度 和 高度 属性控制 SVG 图像的 固有尺寸 和 指定大小,该大小用于在主机文档中放置 SVG 图像。
固有宽高比 必须使用以下 算法计算。如果算法返回 null,则没有固有宽高比。
本节中定义的行为特定于 CSS,但可以适应其他主机上下文。在所有主机上下文中,固有宽高比, 在可用时,必须在调整 SVG 视口大小时予以尊重。
示例:
<svg xmlns="http://www.w3.org/2000/svg" width="10cm" height="5cm"> ... </svg>
在这个示例中,SVG 视口 的固有宽高比为 2:1。 固有宽度为 10cm,固有高度为 5cm。
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="50%" viewBox="0 0 200 200"> ... </svg>
在这个示例中,最外层的 SVG 视口 的固有宽高比为 1:1。 在这种情况下,宽高比计算允许嵌入在一个仅在一个方向上受限的包含块中的对象。
<svg xmlns="http://www.w3.org/2000/svg" width="10cm" viewBox="0 0 200 200"> ... </svg>
在这种情况下,固有宽高比为 1:1。
<svg xmlns="http://www.w3.org/2000/svg" width="75%" height="10cm" viewBox="0 0 200 200"> ... </svg>
在这个示例中,固有宽高比为 1:1。
添加更多关于新自动值的示例?例如,David Vest 提供的示例。
SVG 2 要求: | SVG 2 将基于 SVG 1.2 Tiny 实现受限的变换。 |
---|---|
解决方案: | 将向量效果扩展提案添加到 SVG 2 规范中。 |
目的: | 包含非缩放特性(对象的非缩放部分和非缩放整个对象) |
负责人: | Satoru Takagi (ACTION-3619) |
有时,保持对象的轮廓宽度不变或让对象的位置固定是很重要的,无论对其应用了什么变换。例如,在一幅表示道路的 2px 宽的地图中,保持道路在用户缩放地图时仍然是 2px 宽是很有意义的,或者在图形图表的引导说明中,可能会发生平移。
为了提供与特殊坐标变换和图形绘制相关的此类效果,SVG Tiny 1.2 引入了 vector-effect 属性。 尽管 SVG Tiny 1.2 仅引入了非缩放描边行为,但该版本引入了许多附加效果。此外,由于这些效果可以组合指定,它们展现出更为多样的效果。未来版本的 SVG 语言将通过此属性允许更强大的向量效果。
除了 non-scaling-stroke 和 none 之外的 vector-effect 值由于缺乏实现,面临被从 SVG 2 中删除的风险。 在实施期间,欢迎实施者反馈当前规范实施它们的实际性。
名称: | vector-effect |
---|---|
值: | none | [ non-scaling-stroke | non-scaling-size | non-rotation | fixed-position ]+ [ viewport | screen ]? |
初始: | none |
适用于: | 图形元素 和 ‘use’ |
继承: | 否 |
百分比: | 不适用 |
媒体: | 视觉 |
计算值: | 如指定 |
可动画化: | 是 |
这些值可以枚举。因此,可以同时指定具有这些特征的效果。
以下两个值辅助上述值。它们显示受限变换的主坐标空间。特别是在嵌套视口坐标系统中,像嵌套内容或嵌套的 ‘svg’ 元素,具有有效性。如果未指定,初始值为 viewport。
注意:未来版本的 SVG 可能会允许指定设备坐标系统的方式。
本节显示了关于值组合的变换公式列表,以澄清向量效果的行为,排除具有明确含义的 non-scaling-stroke。
vector-effect 属性对在 3D 渲染上下文 中执行的变换没有影响。
从 用户坐标系统 到 视口坐标系统 的正常坐标变换公式如下。
<circle vector-effect="veValue" transform="translate(xo yo)" cx="xf" cy="yf" r="..">
当 vector-effect 添加到上述元素时,从用户坐标到设备坐标的变换公式如下变化。这里,xf 和 yf 是相应元素及其后代的用户坐标。而 xo 和 yo 是相应元素的变换属性中的矩阵元素 e 和 f。此外,|det(CTM)| 是 CTM 的行列式的绝对值。当该值变为 0 且指定 non-scaling-size 时,vector-effect 变为无效,即 none。
veValue | 公式 |
---|---|
non-scaling-size |
|
non-rotation |
|
non-scaling-size non-rotation |
|
fixed-position |
|
fixed-position non-scaling-size |
|
fixed-position non-rotation |
|
fixed-position non-scaling-size non-rotation |
|
以下是没有向量效果的嵌套视口坐标系统的正常坐标转换公式。 xviewport(UA) 和 yviewport(UA) 是由用户代理直接控制的坐标。 CTMthis 是从目标图形的用户坐标系统到其所属的视口坐标系统的转换矩阵的CTM。 CTMparent 是从前述视口坐标系统到其父级的视口坐标系统的转换矩阵的CTM。并且,CTMroot 是根视口坐标系统 (UA) 的CTM。
当将前一节的七个公式应用于嵌套视口坐标系统时,这些公式的应用方式会根据vector-effect的附加值是viewport还是screen而有所不同。
当指定viewport值时,用户代理通过结合前一章的七个公式和以下公式来计算坐标。
当指定screen值时,用户代理通过结合前一章的七个公式和以下公式来计算坐标。
下面是non-scaling-stroke 向量效果的示例。
<?xml version="1.0"?> <svg xmlns="http://www.w3.org/2000/svg" width="6cm" height="4cm" viewBox="0 0 600 400" viewport-fill="rgb(255,150,200)"> <desc>示例非缩放笔画</desc> <rect x="1" y="1" width="598" height="398" fill="none" stroke="black"> <g transform="scale(9,1)"> <line stroke="black" stroke-width="5" x1="10" y1="50" x2="10" y2="350"> <line vector-effect="non-scaling-stroke" stroke="black" stroke-width="5" x1="32" y1="50" x2="32" y2="350"> <line vector-effect="none" stroke="black" stroke-width="5" x1="55" y1="50" x2="55" y2="350"> </g> </svg>
下面是none 向量效果(无向量效果)的示例。
更改CTM之前 | 更改CTM之后 |
源代码
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-50,-50,500,500" height="500" width="500"> <rect x="-50" y="-50" width="500" height="500" stroke="orange" stroke-width="3" fill="none"> <!-- 嵌套用户坐标系统由此变换属性变换 --> <g transform="matrix(2.1169438081370817,0.3576047954311102,-0.3576047954311102,1.4700998667618626,0,0) translate(-50,-50)"> <svg viewBox="-50,-50,500,500" height="500" width="500"> <!-- 这个SVG基础用户坐标系统上的图纸 --> <g stroke="green" stroke-width="1" fill="none"> <circle cx="0" cy="0" r="10"> <circle cx="150" cy="150" r="7"> <path fill="green" stroke="none" d="M0,-3 L30,-3 25,-10 50,0 25,10 30,3 0,3z"> <line x1="-100" y1="-100" x2="600" y2="-100" stroke-dasharray="5,5"> <line x1="-100" y1="000" x2="600" y2="000"> <line x1="-100" y1="100" x2="600" y2="100" stroke-dasharray="5,5"> <line x1="-100" y1="200" x2="600" y2="200" stroke-dasharray="5,5"> <line x1="-100" y1="300" x2="600" y2="300" stroke-dasharray="5,5"> <line x1="-100" y1="400" x2="600" y2="400" stroke-dasharray="5,5"> <line x1="-100" y1="500" x2="600" y2="500" stroke-dasharray="5,5"> <line y1="-100" x1="-100" y2="600" x2="-100" stroke-dasharray="5,5"> <line y1="-100" x1="000" y2="600" x2="000"> <line y1="-100" x1="100" y2="600" x2="100" stroke-dasharray="5,5"> <line y1="-100" x1="200" y2="600" x2="200" stroke-dasharray="5,5"> <line y1="-100" x1="300" y2="600" x2="300" stroke-dasharray="5,5"> <line y1="-100" x1="400" y2="600" x2="400" stroke-dasharray="5,5"> <line y1="-100" x1="500" y2="600" x2="500" stroke-dasharray="5,5"> </g> <!-- 具有向量效果的图形 --> <!-- 这个图形的嵌套用户坐标系统原点上的粗红色右箭头和小矩形 --> <path id="ve" vector-effect="none" stroke="red" stroke-width="3" fill="none" transform="matrix(1,0,0,1,150,150)" d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"> </svg> </g> </svg>
下面是non-scaling-size的示例。
更改CTM之前 | 更改CTM之后 |
<path id="ve" vector-effect="non-scaling-size" stroke="red" stroke-width="3" fill="none" transform="matrix(1,0,0,1,150,150)" d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z">
下面是non-rotation的示例。
更改CTM之前 | 更改CTM之后 |
<path id="ve" vector-effect="non-rotation" stroke="red" stroke-width="3" fill="none" transform="matrix(1,0,0,1,150,150)" d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z">
以下是非缩放大小 非旋转的示例。
改变CTM之前 | 改变CTM之后 |
<path id="ve" vector-effect="non-scaling-size non-rotation" stroke="red" stroke-width="3" fill="none" transform="matrix(1,0,0,1,150,150)" d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z">
以下是固定位置的示例。
改变CTM之前 | 改变CTM之后 |
<path id="ve" vector-effect="fixed-position" stroke="red" stroke-width="3" fill="none" transform="matrix(1,0,0,1,150,150)" d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z">
以下是非缩放大小 固定位置的示例。
改变CTM之前 | 改变CTM之后 |
<path id="ve" vector-effect="non-scaling-size fixed-position" stroke="red" stroke-width="3" fill="none" transform="matrix(1,0,0,1,150,150)" d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z">
以下是非旋转 固定位置的示例。
改变CTM之前 | 改变CTM之后 |
<path id="ve" vector-effect="non-rotation fixed-position" stroke="red" stroke-width="3" fill="none" transform="matrix(1,0,0,1,150,150)" d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z">
以下是非缩放大小 非旋转 固定位置的示例。
改变CTM之前 | 改变CTM之后 |
<path id="ve" vector-effect="non-scaling-size non-rotation fixed-position" stroke="red" stroke-width="3" fill="none" transform="matrix(1,0,0,1,150,150)" d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z">
SVGTransform 接口用于表示出现在 <transform-function> 属性值,这些值在transform 属性及其展示属性 ‘transform’、‘gradientTransform’ 和 ‘patternTransform’ 中出现。SVGTransform 表示变换列表中的单个组件,如单个 scale(…) 或 matrix(…) 值。
SVGTransform 对象可以被指定为 只读,这意味着尝试修改该对象将导致抛出异常,如下所述。
SVGTransform 对象可以与特定元素 关联。关联的元素用于确定如果该对象反映该属性,将更新哪个元素的 ‘transform’ 展示属性。除非另有说明,SVGTransform 对象默认不与任何元素关联。
每个 SVGTransform 对象在两种模式之一下操作。它可以:
SVGTransform 对象维护一个内部 <transform-function> 值,称为其 值。它还维护一个 DOMMatrix 对象,称为其 矩阵对象,这是从 matrix IDL 属性返回的对象。SVGTransform 对象的 矩阵对象 始终与其 值 保持同步。
[Exposed=Window] interface SVGTransform { // 变换类型 const unsigned short SVG_TRANSFORM_UNKNOWN = 0; const unsigned short SVG_TRANSFORM_MATRIX = 1; const unsigned short SVG_TRANSFORM_TRANSLATE = 2; const unsigned short SVG_TRANSFORM_SCALE = 3; const unsigned short SVG_TRANSFORM_ROTATE = 4; const unsigned short SVG_TRANSFORM_SKEWX = 5; const unsigned short SVG_TRANSFORM_SKEWY = 6; readonly attribute unsigned short type; [SameObject] readonly attribute DOMMatrix matrix; readonly attribute float angle; void setMatrix(DOMMatrixReadOnly matrix); void setTranslate(float tx, float ty); void setScale(float sx, float sy); void setRotate(float angle, float cx, float cy); void setSkewX(float angle); void setSkewY(float angle); };
在SVGTransform上定义的数字变换类型常量用于表示SVGTransform的值的类型。它们的含义如下:
常量 | 含义 |
---|---|
SVG_TRANSFORM_MATRIX | 一个matrix(…)值。 |
SVG_TRANSFORM_TRANSLATE | 一个translate(…)值。 |
SVG_TRANSFORM_SCALE | 一个scale(…)值。 |
SVG_TRANSFORM_ROTATE | 一个rotate(…)值。 |
SVG_TRANSFORM_SKEWX | 一个skewX(…)值。 |
SVG_TRANSFORM_SKEWY | 一个skewY(…)值。 |
SVG_TRANSFORM_UNKNOWN | 其他类型的值。 |
使用数字变换类型常量是一种反模式,不会引入任何新常量值来支持SVGTransform所支持的变换类型。如果支持并使用其他类型的变换,则SVGTransform将使用SVG_TRANSFORM_UNKNOWN类型。有关这些类型的变换的其他属性如何操作的详细信息,请参见下文。
type IDL属性表示SVGTransform的值的变换项类型。在获取type时,将执行以下步骤:
例如,对于scaleX(…)或translate3d(…)变换,将返回SVG_TRANSFORM_UNKNOWN。
matrix IDL属性表示变换为4x4齐次矩阵,在获取时返回SVGTransform的矩阵对象。当首次创建矩阵对象时,其值设置为与SVGTransform的变换函数值匹配,并设置为反映SVGTransform。
请参阅CSS变换规范,以获取不同变换函数类型与特定矩阵值对应的描述。
angle IDL属性表示rotate(…)、skewX(…)或skewY(…)变换函数的角度参数。在获取时,将执行以下步骤:
setMatrix方法用于将SVGTransform设置为给定的矩阵值。当调用setMatrix(matrix)时,将执行以下步骤:
这些 setTranslate,setScale,setRotate,setSkewX 和 setSkewY 方法用于将 SVGTransform 设置为一个新的变换函数值。当调用这些方法之一时,将执行以下步骤:
本规范对 DOMMatrix 对象的行为施加了额外的要求,这些要求超出了 几何接口 规范中所描述的内容,以便它们可以用于反映采用变换值的演示属性。
每个 DOMMatrix 对象在两种模式之一下运行。它可以:
一个 DOMMatrix 可以被指定为 只读,这意味着尝试修改该对象将导致抛出异常。当分配给任何只读 DOMMatrix 的 IDL 属性时,或者当调用其任何可变变换方法时,将抛出 NoModificationAllowedError 异常,而不是更新内部值。
请注意,这仅适用于可读写的 DOMMatrix 接口; DOMMatrixReadOnly 接口在未反映 transform 时,如果尝试修改它,将已经抛出异常。
在分配给任何可写的 DOMMatrix 的 IDL 属性时,或者在调用其任何可变变换方法时,在更新内部矩阵值后执行以下步骤:
SVGTransformList 接口是一个 列表接口,其元素为 SVGTransform 对象。 SVGTransformList 代表一个值,transform 属性可以取这个值,即 要么是一个 <transform-list> 或者关键字 none。
[Exposed=Window] interface SVGTransformList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; void clear(); SVGTransform initialize(SVGTransform newItem); getter SVGTransform getItem(unsigned long index); SVGTransform insertItemBefore(SVGTransform newItem, unsigned long index); SVGTransform replaceItem(SVGTransform newItem, unsigned long index); SVGTransform removeItem(unsigned long index); SVGTransform appendItem(SVGTransform newItem); setter void (unsigned long index, SVGTransform newItem); // 其他列表接口不常见的附加方法。 SVGTransform createSVGTransformFromMatrix(DOMMatrixReadOnly matrix); SVGTransform? consolidate(); };
createSVGTransformFromMatrix 方法用于从矩阵对象创建一个新的 SVGTransform 对象。当调用 createSVGTransformFromMatrix(matrix) 方法时,执行以下步骤:
consolidate 方法用于将变换列表转换为等效的单个变换函数。当调用 consolidate() 方法时,执行以下步骤:
所有其他接口成员的行为 SVGLengthList 在 列表接口 中定义。
一个 SVGAnimatedTransformList 对象用于 反映 transform 属性及其对应的呈现属性 (这取决于元素,可能是 ‘transform’, ‘gradientTransform’ 或 ‘patternTransform’)。
[Exposed=Window] interface SVGAnimatedTransformList { [SameObject] readonly attribute SVGTransformList baseVal; [SameObject] readonly attribute SVGTransformList animVal; };
属性 baseVal 和 animVal 的 IDL 属性 代表反映的呈现属性的值。 获取 baseVal 或 animVal 时,将返回一个 SVGTransformList 对象,反映给定的 呈现属性。
SVGPreserveAspectRatio 接口用于表示 ‘preserveAspectRatio’ 属性的值。
一个 SVGPreserveAspectRatio 对象可以被指定为 只读, 这意味着尝试修改该对象将导致抛出异常,如下所述。
每个 SVGPreserveAspectRatio 对象 反映基值 的 反射 ‘preserveAspectRatio’ 属性(通过 baseVal 或 animVal 成员的方法暴露)。
[Exposed=Window] interface SVGPreserveAspectRatio { /// 对齐类型 const unsigned short SVG_PRESERVEASPECTRATIO_UNKNOWN = 0; const unsigned short SVG_PRESERVEASPECTRATIO_NONE = 1; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMIN = 2; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMID = 5; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMID = 6; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMID = 7; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMAX = 8; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10; // 相遇或切割类型 const unsigned short SVG_MEETORSLICE_UNKNOWN = 0; const unsigned short SVG_MEETORSLICE_MEET = 1; const unsigned short SVG_MEETORSLICE_SLICE = 2; attribute unsigned short align; attribute unsigned short meetOrSlice; };
在SVGPreserveAspectRatio上定义的数值对齐类型常量用于表示‘preserveAspectRatio’属性可以取的对齐关键字值。它们的含义如下:
常量 | 含义 |
---|---|
SVG_PRESERVEASPECTRATIO_NONE | none关键字。 |
SVG_PRESERVEASPECTRATIO_XMINYMIN | xMinYMin关键字。 |
SVG_PRESERVEASPECTRATIO_XMIDYMIN | xMidYMin关键字。 |
SVG_PRESERVEASPECTRATIO_XMAXYMIN | xMaxYMin关键字。 |
SVG_PRESERVEASPECTRATIO_XMINYMID | xMinYMid关键字。 |
SVG_PRESERVEASPECTRATIO_XMIDYMID | xMidYMid关键字。 |
SVG_PRESERVEASPECTRATIO_XMAXYMID | xMaxYMid关键字。 |
SVG_PRESERVEASPECTRATIO_XMINYMAX | xMinYMax关键字。 |
SVG_PRESERVEASPECTRATIO_XMIDYMAX | xMidYMax关键字。 |
SVG_PRESERVEASPECTRATIO_XMAXYMAX | xMaxYMax关键字。 |
SVG_PRESERVEASPECTRATIO_UNKNOWN | 其他类型的值。 |
同样,在SVGPreserveAspectRatio上定义的数值相遇或切割类型常量用于表示‘preserveAspectRatio’属性可以取的相遇或切割关键字值。它们的含义如下:
常量 | 含义 |
---|---|
SVG_MEETORSLICE_MEET | meet关键字。 |
SVG_MEETORSLICE_SLICE | slice关键字。 |
SVG_MEETORSLICE_UNKNOWN | 其他类型的值。 |
align IDL属性表示‘preserveAspectRatio’值的对齐关键字部分。获取时,将执行以下步骤:
设置 align 时,将执行以下步骤:
meetOrSlice IDL 属性表示 ‘preserveAspectRatio’ 值的对齐关键字部分。获取时执行以下步骤:
设置 meetOrSlice 时,将执行以下步骤:
SVGAnimatedPreserveAspectRatio 对象用于 反映 ‘preserveAspectRatio’ 属性。
[Exposed=Window] interface SVGAnimatedPreserveAspectRatio { [SameObject] readonly attribute SVGPreserveAspectRatio baseVal; [SameObject] readonly attribute SVGPreserveAspectRatio animVal; };
属性 baseVal 和 animVal IDL 属性表示反映的 ‘preserveAspectRatio’ 属性的当前非动画值。获取 baseVal 或 animVal 时,返回一个 SVGPreserveAspectRatio 对象,该对象反映该属性的基础值。