第10章:基本形状

10.1. 介绍和定义

基本形状
形状
形状元素
由直线和曲线的组合定义的图形元素。具体包括: circleellipselinepathpolygonpolylinerect

SVG 包含以下基本形状元素:

在数学上,这些形状元素等同于一个 path 元素,该元素 将构造相同的形状。基本形状可以被描边、填充,并用作裁剪路径。所有适用于 path 元素的属性也适用于基本形状。

每个形状的 等效路径 和计算描边的算法 在下面的形状部分中定义。

10.2. ‘rect’ 元素

rect 元素定义了一个与当前 用户坐标系统 对齐的矩形。通过设置非零值的 rxry 几何属性,可以实现圆角矩形。

rect
类别:
图形元素可渲染元素形状 元素
内容模型:
以下元素的任意数量,可以按任意顺序:clipPathmarkermaskscriptstyle
属性:
几何属性:
DOM 接口:

属性 xy 坐标分别表示矩形的左边和上边,在当前用户坐标系统中。

属性 widthheight 定义矩形的整体宽度和高度。对于任一属性的负值都是不合法的,必须被视为解析错误。如果任一维度的计算值为零,则禁用该元素的渲染。

对于圆角矩形,属性 rxry 的计算值定义了用于圆化矩形角落的椭圆弧的 x 轴和 y 轴半径。弧始终在水平和垂直轴上对称;要创建一个具有不均匀圆角的矩形,请使用 path 显式定义形状。对于任一属性的负值都是不合法的,必须被视为解析错误。如果任一维度的计算值为零,或两者的计算值为 auto,则结果是没有圆角的矩形。

x 轴和 y 轴圆角半径的使用值可能会通过其他维度隐式确定(使用 auto 值),并且也受到限制,以确保矩形的直线段长度永远不会为负。rxry 的使用值根据计算值通过以下步骤确定:

  1. 如果 rxry 的计算值均为 auto (由于 auto 是这两个属性的初始值,因此如果作者未指定它们或所有作者提供的值均无效,这种情况也会发生), 则 rxry 的使用值为 0。(这将导致矩形角落为直角。)
  2. 否则,将指定值转换为绝对值,如下所示:
    1. 如果 rx 设置为长度值或百分比, 但 ryauto, 则计算 rx 的绝对长度值, 以矩形的使用 width 进行百分比解析; ry 的绝对值相同。
    2. 如果 ry 设置为长度值或百分比, 但 rxauto, 则计算 ry 的绝对长度值, 以矩形的使用 height 进行百分比解析; rx 的绝对值相同。
    3. 如果 rxry 均设置为长度或百分比, 则分别生成绝对值, 将 rx 的百分比与使用的 width 进行解析, 将 ry 的百分比与使用的 height 进行解析。
  3. 最后,应用限制以生成使用值:
    1. 如果绝对 rx(经过上述步骤)大于使用的 width 的一半, 则 rx 的使用值为使用的 width 的一半。
    2. 如果绝对 ry(经过上述步骤)大于使用的 height 的一半, 则 ry 的使用值为使用的 height 的一半。
    3. 否则,rxry 的使用值为先前计算的绝对值。

在数学上,rect 元素被映射到等效的 path 元素,如下所示, 在为用户坐标系统生成绝对使用值 xywidthheightrxry 之后,针对每个等效的几何属性, 遵循上述规则和 单位 中的规则:

  1. 执行绝对 moveto 操作到位置 (x+rx,y);
  2. 执行绝对水平 lineto 参数 x+width-rx
  3. 如果 rxry 均大于零, 执行绝对 椭圆弧 操作到坐标 (x+width,y+ry), 其中 rxry 作为等效参数用于 椭圆弧 命令, x-axis-rotationlarge-arc-flag 设置为零, sweep-flag 设置为一;
  4. 执行绝对垂直 lineto 参数 y+height-ry
  5. 如果 rxry 均大于零, 执行绝对 椭圆弧 操作到坐标 (x+width-rx,y+height), 使用与之前相同的参数;
  6. 执行绝对水平 lineto 参数 x+rx
  7. 如果 rxry 均大于零, 执行绝对 椭圆弧 操作到坐标 (x,y+height-ry), 使用与之前相同的参数;
  8. 执行绝对垂直 lineto 参数 y+ry
  9. 如果 rxry 均大于零, 执行绝对 椭圆弧 操作与 段完成闭合路径 操作, 使用与之前相同的参数。

路径分解在 2013年6月3日 的电话会议中解决。

示例 rect01 显示了一个具有锐角的矩形。rect 元素填充为黄色并以海军蓝描边。

<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <desc>示例 rect01 - 具有锐角的矩形</desc>

  <!-- 使用 'rect' 元素显示视口轮廓 -->
  <rect x="1" y="1" width="1198" height="398"
        fill="none" stroke="blue" stroke-width="2">

  <rect x="400" y="100" width="400" height="200"
        fill="yellow" stroke="navy" stroke-width="10"  />
</svg>
示例 rect01 — 具有锐角的矩形

示例 rect01

以 SVG 查看此示例(仅限支持 SVG 的浏览器)

示例 rect02 显示了两个圆角矩形。rx 指定如何圆化 矩形的角。请注意,由于未为 ry 属性指定值,使用的值将源自 rx 属性。

<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <desc>示例 rect02 - 圆角矩形</desc>

  <!-- 使用 'rect' 元素显示视口轮廓 -->
  <rect x="1" y="1" width="1198" height="398"
        fill="none" stroke="blue" stroke-width="2">

  <rect x="100" y="100" width="400" height="200" rx="50"
        fill="green" />

  <g transform="translate(700 210) rotate(-30)">
    <rect x="0" y="0" width="400" height="200" rx="50"
          fill="none" stroke="purple" stroke-width="30" />
  </g>
</svg>
示例 rect02 — 以用户坐标表达的圆角矩形

示例 rect02

以 SVG 查看此示例(仅限支持 SVG 的浏览器)

10.3. ‘circle’ 元素

circle 元素定义了 一个基于中心点和半径的圆。

circle
类别:
图形元素可渲染元素形状 元素
内容模型:
以下元素的任意数量,可以是任意顺序:clipPathmarkermaskscriptstyle
属性:
几何属性:
DOM 接口:

cxcy 属性定义了圆心的坐标。

r 属性定义了圆的半径。 任何属性的负值都是非法的,并且 必须被视为解析错误

在数学上,circle 元素映射到一个等效的 path 元素,该元素 由四个 椭圆弧段组成,每段覆盖圆的四分之一。路径 从半径的“3点钟”位置开始,并以顺时针方向进行(在任何变换之前)。 弧命令的 rxry 参数 都等于 r 属性的使用值,在转换为本地用户单位后, 而 x-axis-rotationlarge-arc-flag、 和 sweep-flag 都设置为零。 坐标计算如下, 其中 cxcyr 是等效属性的使用值,转换为 用户单位:

  1. 移动到命令到点 cx+r,cy
  2. 弧到 cx,cy+r;
  3. 弧到 cx-r,cy;
  4. 弧到 cx,cy-r;
  5. 弧与 段完成闭合路径 操作。

路径分解在 2013年6月3日的电话会议上得到解决。

示例 circle01 包含一个 circle 元素,该元素填充为红色并用蓝色描边。

<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <desc>示例 circle01 - 圆形填充红色并描边蓝色</desc>

  <!-- 使用 'rect' 元素显示视口轮廓 -->
  <rect x="1" y="1" width="1198" height="398"
        fill="none" stroke="blue" stroke-width="2">

  <circle cx="600" cy="200" r="100"
        fill="red" stroke="blue" stroke-width="10"  />
</svg>
示例 circle01 — 圆形填充红色并描边蓝色

示例 circle01

在 SVG 中查看此示例(仅限 SVG 支持的浏览器)

10.4. ‘ellipse’ 元素

ellipse 元素 定义了一个与当前 用户坐标系统 对齐的椭圆,基于一个中心点和两个半径。

ellipse
类别:
图形元素可渲染元素形状元素
内容模型:
以下任意数量的元素,可以按任意顺序出现:clipPath, marker, mask, script, style
属性:
几何属性:
DOM 接口:

cxcy 坐标定义了椭圆的中心。

rxry 属性定义了椭圆的 x 轴和 y 轴半径。 这两个属性的负值是非法的,必须作为解析错误被忽略。 任一维度的计算值为零或两个维度的计算值为 auto, 会禁用该元素的渲染。

任一 rxryauto 值 会被转换为使用值,遵循上述矩形的规则 (但不基于 宽度高度 进行任何夹紧)。 实际上,auto 值创建了一个圆形, 其半径由仅在一个维度中表达的值定义; 这允许创建一个半径在以下方面定义的圆:

新增于 SVG 2。 auto 值用于 rxry 是为了允许对这两个属性进行一致的解析, 适用于椭圆和矩形。 之前,如果未指定 rxry,椭圆将不会渲染。

从数学上讲,ellipse 元素被映射到一个 等效的 path 元素, 由四个 椭圆弧 段组成,每个覆盖椭圆的四分之一。 路径从半径的 "3 点钟" 位置开始,顺时针方向进行(在任何变换之前)。 弧命令的 rxry 参数 是转换为局部用户单位后的等效属性的使用值, 而 x-axis-rotationlarge-arc-flagsweep-flag 都设置为零。 坐标的计算如下, 其中 cxcyrxry 是转换为用户单位的等效属性的使用值:

  1. 移动到命令到点 cx+rx,cy;
  2. 弧到 cx,cy+ry;
  3. 弧到 cx-rx,cy;
  4. 弧到 cx,cy-ry;
  5. 弧与 段完成关闭路径 操作。

路径分解在 2013年6月3日的电话会议中解决。

示例 ellipse01 下面指定了 在由 viewBox 属性和 transform 属性 在 svg 元素上的用户坐标系统中两个椭圆的坐标。 两个椭圆都使用零的默认值 作为 cxcy 属性(椭圆的中心)。 第二个椭圆被旋转。

<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <desc>示例 ellipse01 - 椭圆示例</desc>

  <!-- 使用 'rect' 元素显示视口轮廓 -->
  <rect x="1" y="1" width="1198" height="398"
        fill="none" stroke="blue" stroke-width="2" />

  <g transform="translate(300 200)">
    <ellipse rx="250" ry="100"
          fill="red"  />
  </g>

  <ellipse transform="translate(900 200) rotate(-30)" 
        rx="250" ry="100"
        fill="none" stroke="blue" stroke-width="20"  />

</svg>
示例 ellipse01 — 在用户坐标中表达的椭圆

示例 ellipse01

以 SVG 查看此示例(仅限 SVG 支持的浏览器)

10.5. The ‘line’ element

The line element defines a line segment that starts at one point and ends at another.

line
Categories:
图形元素, 可渲染元素, 形状 元素
Content model:
任何数量的以下元素,按任意顺序:clipPath, marker, mask, script, style
Attributes:
DOM 接口:

属性定义:

名称 初始值 可动画
x1y1 <length-percentage> | <number> 0
线的起始点的 x 和 y 坐标。
名称 初始值 可动画
x2y2 <length-percentage> | <number> 0
线的结束点的 x 和 y 坐标。

未来的规范可能会将x1y1x2y2属性转换为几何属性。 目前,它们只能通过元素属性指定,而不能使用 CSS。

从数学上讲,line 元素可以映射到等效的path 元素,具体如下: 在根据单位转换坐标到用户坐标系统用户单位后 生成值x1y1x2y2

由于line元素是 单一线条,因此在几何上是一维的,它们没有内部;因此,line元素从不被填充(参见填充属性)。

示例 line01 下面指定了五条线在由viewBox 属性在svg元素上建立的用户坐标系统中的坐标。 这些线有不同的粗细。

<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <desc>示例 line01 - 在用户坐标中表示的线</desc>

  <!-- 使用 'rect' 元素显示视口轮廓 -->
  <rect x="1" y="1" width="1198" height="398"
        fill="none" stroke="blue" stroke-width="2" />

  <g stroke="green" >
    <line x1="100" y1="300" x2="300" y2="100"
            stroke-width="5"  />
    <line x1="300" y1="300" x2="500" y2="100"
            stroke-width="10"  />
    <line x1="500" y1="300" x2="700" y2="100"
            stroke-width="15"  />
    <line x1="700" y1="300" x2="900" y2="100"
            stroke-width="20"  />
    <line x1="900" y1="300" x2="1100" y2="100"
            stroke-width="25"  />
  </g>
</svg>
示例 line01 — 在用户坐标中表示的线

示例 line01

将此示例视为 SVG(仅限支持 SVG 的浏览器)

10.6. ‘polyline’ 元素

polyline 元素 定义了一组连接的直线段。通常,‘polyline 元素定义开放形状。

polyline
类别:
图形元素可渲染元素形状 元素
内容模型:
以下任意数量的元素,顺序不限:裁剪路径标记遮罩脚本样式
属性:
DOM 接口:

属性定义:

名称 初始值 可动画
points <points> (none)

其中:

<points> =
[ <number>+ ]#

组成polyline的点。所有坐标值均使用用户坐标系统。

如果提供的坐标数为奇数,则元素会出错,用户代理的行为与错误指定的 path 元素相同。在这种错误情况下,用户代理将丢弃最后一个奇数坐标,并其他渲染形状。

初始值(none)表示polyline元素有效但不渲染。

未来的规范可能将 points 属性转换为几何属性。 目前只能通过元素属性指定,而不能通过 CSS 指定。

从数学上讲,polyline 元素可以映射到等效的 path 元素,如下所示:

示例 polyline01 下指定了用户坐标系统中由 viewBox 属性在 svg 元素上建立的polyline。

<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <desc>示例 polyline01 - 日益增大的条形</desc>

  <!-- 使用 'rect' 元素显示视口轮廓 -->
  <rect x="1" y="1" width="1198" height="398"
        fill="none" stroke="blue" stroke-width="2" />

  <polyline fill="none" stroke="blue" stroke-width="10" 
            points="50,375
                    150,375 150,325 250,325 250,375
                    350,375 350,250 450,250 450,375
                    550,375 550,175 650,175 650,375
                    750,375 750,100 850,100 850,375
                    950,375 950,25 1050,25 1050,375
                    1150,375" />
</svg>
示例 polyline01 — 日益增大的条形

示例 polyline01

在 SVG 中查看此示例(仅限支持 SVG 的浏览器)

10.7. ‘polygon’ 元素

polygon 元素定义了一个封闭的形状,由一组连接的直线段组成。

polygon
类别:
图形元素可渲染元素形状元素
内容模型:
以下元素的任意数量,顺序无关: clipPathmarkermaskscriptstyle
属性:
DOM 接口:

属性定义:

名称 初始值 可动画
points <points> (无)

构成多边形的点。所有坐标值都在用户坐标系统中。

如果提供的坐标数为奇数,则元素出错,行为与不正确指定的 path 元素相同。

初始值 (无) 表示多边形元素有效,但不渲染。

未来的规范可能将 points 属性转换为几何属性。 目前只能通过元素属性指定,而不能通过 CSS。

从数学上讲,polygon 元素可以映射到等效的 path 元素,如下所示:

示例 polygon01 下方指定了两个多边形(一个星形和一个六边形)在由 viewBox 属性设定的用户坐标系统中 ,该属性位于 svg 元素上。

<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <desc>示例 polygon01 - 星形和六边形</desc>

  <!-- 使用 'rect' 元素显示视口轮廓 -->
  <rect x="1" y="1" width="1198" height="398"
        fill="none" stroke="blue" stroke-width="2" />

  <polygon fill="red" stroke="blue" stroke-width="10" 
            points="350,75  379,161 469,161 397,215
                    423,301 350,250 277,301 303,215
                    231,161 321,161" />
  <polygon fill="lime" stroke="blue" stroke-width="10" 
            points="850,75  958,137.5 958,262.5
                    850,325 742,262.6 742,137.5" />
</svg>
示例 polygon01 — 星形和六边形

示例 polygon01

以 SVG 查看此示例(仅支持 SVG 的浏览器)

10.8. DOM 接口

10.8.1. 接口 SVGRectElement

一个 SVGRectElement 对象表示 DOM 中的 rect 元素。

[Exposed=Window]
interface SVGRectElement : SVGGeometryElement {
  [SameObject] readonly attribute SVGAnimatedLength x;
  [SameObject] readonly attribute SVGAnimatedLength y;
  [SameObject] readonly attribute SVGAnimatedLength width;
  [SameObject] readonly attribute SVGAnimatedLength height;
  [SameObject] readonly attribute SVGAnimatedLength rx;
  [SameObject] readonly attribute SVGAnimatedLength ry;
};

这些 IDL 属性 xywidthheightrxry 反映了 xywidthheightrxry 属性及其对应的呈现属性。

10.8.2. 接口 SVGCircleElement

一个 SVGCircleElement 对象表示 DOM 中的 circle 元素。

[Exposed=Window]
interface SVGCircleElement : SVGGeometryElement {
  [SameObject] readonly attribute SVGAnimatedLength cx;
  [SameObject] readonly attribute SVGAnimatedLength cy;
  [SameObject] readonly attribute SVGAnimatedLength r;
};

这些 IDL 属性 cxcyr 反映了 cxcyy 属性及其对应的呈现属性。

10.8.3. 接口 SVGEllipseElement

一个 SVGEllipseElement 对象表示 DOM 中的 ellipse 元素。

[Exposed=Window]
interface SVGEllipseElement : SVGGeometryElement {
  [SameObject] readonly attribute SVGAnimatedLength cx;
  [SameObject] readonly attribute SVGAnimatedLength cy;
  [SameObject] readonly attribute SVGAnimatedLength rx;
  [SameObject] readonly attribute SVGAnimatedLength ry;
};

这些 IDL 属性 cxcyrxry 反映了 cxcyrxry 属性及其对应的呈现属性。

10.8.4. 接口 SVGLineElement

SVGLineElement 接口对应于 line 元素。

[Exposed=Window]
interface SVGLineElement : SVGGeometryElement {
  [SameObject] readonly attribute SVGAnimatedLength x1;
  [SameObject] readonly attribute SVGAnimatedLength y1;
  [SameObject] readonly attribute SVGAnimatedLength x2;
  [SameObject] readonly attribute SVGAnimatedLength y2;
};

这些 x1y1x2y2 IDL 属性 反映x1y1x2y2 内容属性,分别。

10.8.5. Mixin SVGAnimatedPoints

SVGAnimatedPoints 接口用于 反映 points 属性在 polygonpolyline 元素上。它混入到 SVGPolygonElementSVGPolylineElement 接口中。

注意:在 SVG 1.1 SE 中,animatedPoints 属性表示当前动画值。在这个版本的 SVG 中,它只是 points 的别名。

interface mixin SVGAnimatedPoints {
  [SameObject] readonly attribute SVGPointList points;
  [SameObject] readonly attribute SVGPointList animatedPoints;
};

这些 pointsanimatedPoints IDL 属性表示反映属性的当前非动画值。当获取 pointsanimatedPoints 时,返回一个 SVGPointList 对象,该对象反映反映属性的基本值。

10.8.6. 接口 SVGPointList

SVGPointList 接口是一个列表接口,其元素是DOMPoint 对象。 一个SVGPointList 对象表示一个点的列表。

[Exposed=Window]
  interface SVGPointList {
  
    readonly attribute unsigned long length;
    readonly attribute unsigned long numberOfItems;
  
    void clear();
    DOMPoint initialize(DOMPoint newItem);
    getter DOMPoint getItem(unsigned long index);
    DOMPoint insertItemBefore(DOMPoint newItem, unsigned long index);
    DOMPoint replaceItem(DOMPoint newItem, unsigned long index);
    DOMPoint removeItem(unsigned long index);
    DOMPoint appendItem(DOMPoint newItem);
    setter void (unsigned long index, DOMPoint newItem);
  };

所有SVGPointList 接口成员的行为在列表接口中定义。

该规范对DOMPoint 对象的行为施加了额外要求,这些要求超出了几何接口 规范中描述的内容,以便它们可以用于反映points属性。

每个DOMPoint 对象在三种模式中操作。 它可以:

  1. 反映一个可动画属性的基础值(通过points成员的方法暴露在 SVGAnimatedPoints中),
  2. 表示给定svg元素的当前平移 (通过currentTranslate 成员暴露在SVGSVGElement中),或
  3. 被分离,这是使用其构造函数或createSVGPoint创建的DOMPoint对象的情况。

一个DOMPoint对象可以与特定元素关联。关联元素用于确定如果对象反映一个属性,哪个元素的内容属性需要更新。除非另有描述,DOMPoint对象不会与任何元素关联。

一个DOMPoint 对象可以被指定为只读,这意味着尝试修改对象将导致抛出异常。当分配给只读DOMPointx, y, wz IDL 属性时,必须抛出NoModificationAllowedError,而不是更新内部坐标值。

注意,这仅适用于可读写的DOMPoint 接口;DOMPointReadOnly 接口在不用于反映 points 属性时,若尝试修改则会自动抛出异常。

在给可写的DOMPointx, y, wz IDL 属性分配时,在更新内部坐标值后,执行以下步骤:

  1. 如果DOMPoint 反映了基值的某个反射属性的元素, 则使用反映属性基值的SVGPointList重新序列化该反射属性。
  2. 否则,如果DOMPoint 表示某个元素的当前平移, 且该元素是最外层 svg 元素,则:
    1. 让 [a b c d e f] 为表示文档的放大和平移变换的 2x3 矩阵。
    2. xy分别为DOMPoint对象的 x 和 y 坐标。
    3. 将文档的放大和平移变换设置为 [a 0 0 d x y]。

10.8.7. 接口 SVGPolylineElement

SVGPolylineElement 对象 表示 DOM 中的一个多线段 元素。

[Exposed=Window]
interface SVGPolylineElement : SVGGeometryElement {
};

SVGPolylineElement 包含 SVGAnimatedPoints;

10.8.8. 接口 SVGPolygonElement

SVGPolygonElement 对象表示 DOM 中的一个多边形元素。

[Exposed=Window]
interface SVGPolygonElement : SVGGeometryElement {
};

SVGPolygonElement 包含 SVGAnimatedPoints;