CSS 形状模块第 1 级

W3C 候选推荐标准草案

关于此文档的更多细节
此版本
https://w3org.cn/TR/2025/CRD-css-shapes-1-20250612/
最新发布版本
https://w3org.cn/TR/css-shapes/
编辑草案
https://drafts.csswg.org/css-shapes/
历史版本
历史
https://w3org.cn/standards/history/css-shapes-1/
实现报告
https://wpt.fyi/results/css/css-shapes
反馈
CSS 工作组问题仓库
编辑
(Microsoft Corporation)
(Adobe)
Noam RosenthalGoogle
前任编辑
Vincent Hardy
建议编辑此规范
GitHub 编辑器
测试套件
https://wpt.fyi/results/css/css-shapes/

摘要

CSS 形状描述了用于 CSS 的几何形状。对于第 1 级,CSS 形状可以应用于浮动元素。浮动元素上的圆形形状将导致行内内容环绕该圆形形状,而不是浮动元素的边界框。

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

关于本文档

本节描述了本文档发布时的状态。当前的 W3C 出版物列表以及本技术报告的最新修订版,可在 W3C 标准和草案索引(https://w3org.cn/TR/)中找到。

本文档由 CSS 工作组候选推荐标准草案的形式发布,遵循 推荐标准轨道。作为候选推荐标准发布并不意味着 W3C 及其成员的认可。候选推荐标准草案整合了前一个候选推荐标准中的变更,工作组打算将其包含在随后的候选推荐标准快照中。

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

请通过在 GitHub 上提交问题(首选)发送反馈,标题中需包含规范代码“css-shapes”,例如:“[css-shapes] …评论摘要…”。所有问题和评论都会被存档。此外,也可以发送反馈到(存档的)公共邮件列表 www-style@w3.org

本文档受 2023 年 11 月 3 日版 W3C 流程文档管辖。

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

1. 简介

本节不具有规范性。

形状定义了可用作 CSS 值的任意几何体。本规范定义了用于控制元素浮动区域几何形状的属性。shape-outside 属性使用形状值来定义浮动元素的浮动区域

注意: 未来版本的 CSS 形状将允许在非浮动元素上使用形状。其他 CSS 模块也可以利用这些形状,例如 CSS 遮罩 [CSS-MASKING] 和 CSS 排除 [CSS3-EXCLUSIONS]。

注意: 如果用户代理同时实现了 CSS 形状和 CSS 排除,则 shape-outside 属性将定义排除元素的排除区域。

注意: 未来版本的 CSS 形状将定义 shape-inside 属性,用于定义元素内部内容的环绕形状。

1.1. 模块交互

本模块扩展了 [CSS2] 第 9 章中定义的浮动特性。

1.2.

本规范遵循 [CSS2] 中的 CSS 属性定义约定,并使用 [CSS-VALUES-3] 中的 值定义语法。本规范中未定义的值类型在 CSS Values & Units [CSS-VALUES-3] 中定义。与其他 CSS 模块的组合可能会扩展这些值类型的定义。

除了定义中列出的属性特定值外,本规范中定义的所有属性也都接受 CSS 全局关键字 作为其属性值。为了可读性,未明确重复列出。

1.3. 术语

折行

本规范使用术语环绕 (wrap) 来指代内容围绕 [CSS2] 第 9 章定义的浮动区域侧面流动的行为。内容在左浮动盒子的右侧环绕,在右浮动盒子的左侧环绕。这种环绕的结果是,浮动元素旁边的行框会根据需要缩短,以避免与浮动区域相交。

浮动区域

用于围绕浮动元素环绕内容的区域。浮动行为规则使用浮动区域的侧边来确定内容的流动位置。默认情况下,浮动区域是浮动元素的外边距框(注意,这可能不同于由 margin-box 值产生的浮动区域,后者包含边框半径曲率)。本规范的 shape-outsideshape-margin 属性可用于定义任意的、非矩形的浮动区域

与方向无关的尺寸 盒子的与方向无关的尺寸等于该盒子的对角线长度除以 sqrt(2)。

注意: 这是一种在某些情况下 SVG 使用的平均化盒子宽高的方法,当需要盒子尺寸的百分比但上下文不特别偏向宽度或高度时使用。对于正方形盒子,这等同于宽度/高度。

2. 与盒模型和浮动行为的关系

虽然用于环绕浮动元素外部行内流内容的边界可以使用形状来定义,但实际的盒模型不会改变。如果元素指定了外边距、边框或内边距,它们将根据 [CSS3BOX] 模块进行计算和渲染。此外,浮动定位和堆叠不受定义带有形状的浮动区域的影响。

当形状用于定义浮动区域时,该形状会被剪裁至浮动的 margin box。换句话说,形状只能缩小浮动区域,而不能增加它。缩小的浮动区域可能对某些本应受浮动影响的行框没有影响。如果形状不封闭任何区域,形状的边缘仍被用于定义浮动区域

由形状定义的浮动区域可以缩小所有侧面的正常浮动区域,但这并不允许内容在浮动的两侧环绕。左浮动且带有 shape-outside 的元素仍然只允许内容在右侧环绕,而右浮动元素则只允许在左侧环绕

在以下示例中,左右浮动的 img 元素使用 shape-outside 属性指定了一个三角形形状。

<img class="left" src="hand.svg"/>
<img class="right" src="hand.svg"/>
<p>
  Sometimes a web page’s text content appears to be
  funneling your attention towards a spot on the page
  to drive you to follow a particular link. Sometimes
  you don’t notice.
</p>

<style type="text/css">
  .left {
    shape-outside: polygon(0 0, 100% 100%, 0 100%);
    float: left;
    width: 40%;
    height: 12ex;
    transform: scaleX(-1);
  }

  .right {
    shape-outside: polygon(100% 0, 100% 100%, 0 100%);
    float: right;
    width: 40%;
    height: 12ex;
  }

  p {
    text-align: center;
  }
</style>

Using the shape-outside property with floats

由于形状会被剪裁至浮动的 margin box,向上述左浮动添加此形状将产生相同的渲染效果。

shape-outside: polygon(0 0, 500% 500%, 0 500%);

不封闭任何区域的形状仍然具有有助于定义浮动区域的边缘。

此嵌入形状是一条位于参考框中点的垂直线。此中点边缘被用作环绕内容的浮动区域边缘。

shape-outside: inset(0% 50% 0% 50%);

如果嵌入值总和超过了宽度,则使用 CSS 背景 3 § 4.5 重叠曲线 规则来确定矩形的边缘。此形状产生一个距离参考框左侧 25% 的垂直边缘。

shape-outside: inset(0% 150% 50% 0%);

如果该形状仅是一条水平线,则它是一个空的浮动区域,对环绕没有影响。注意在此示例中 shape-margin 必须为 0px(否则该线会扩展以封闭一个区域)。

shape-outside: inset(50% 0% 0% 50%);
shape-margin: 0px;

shape-outside 可以在浮动区域的左侧和右侧都创建开放区域。在这种情况下,内容仍然只在浮动的一侧环绕。在图中,形状以蓝色渲染,形状外部的内容区域以紫红色渲染。

shape-outside: polygon(50px 0px, 100px 100px, 0px 100px);

wrapping around right side of a left-float float area

以下样式创建了一个比浮动内容区域小得多的形状,并为浮动元素添加了 margin-top。在图中,形状以蓝色渲染,内容区域以紫红色渲染,浮动框的 margin 区域以黄色渲染。行内内容只环绕该形状,并在其他地方覆盖浮动 margin box 的其余部分。

.float-left {
  shape-outside: polygon(0% 50%, 50% 100%, 0 100%);
  float: left;
  width: 100px;
  height: 100px;
  margin-top: 20px;
}

Adding margin-top to a float with a small shape-outside

下一张图片展示了如果两个这样的浮动元素堆叠在一起时可能产生的结果。注意浮动元素是使用它们的 margin box 而不是浮动区域进行定位的。

Stacking two floats with a small shape-outside

3. 基本形状

<basic-shape> 类型可以使用基本形状函数来指定。当使用此语法定义形状时,参考框 (reference box) 由每个使用 <basic-shape> 值的属性定义。形状的坐标系原点位于参考框的左上角,x 轴向右延伸,y 轴向下延伸。所有以百分比表示的长度均基于参考框的使用尺寸进行解析。

3.1. 支持的形状

<basic-shape> 函数包括:

<inset()> = inset(
  <length-percentage>{1,4}
  [ round <'border-radius'> ]?
)

<xywh()> = xywh(
  <length-percentage>{2} <length-percentage [0,∞]>{2}
  [ round <'border-radius'> ]?
)

<rect()> = rect(
  [ <length-percentage> | auto ]{4}
  [ round <'border-radius'> ]?
)

<basic-shape-rect> = <inset()> | <rect()> | <xywh()>

<circle()> = circle(
  <radial-size>?
  [ at <position> ]?
)

<ellipse()> = ellipse(
  <radial-size>?
  [ at <position> ]?
)

<polygon()> = polygon(
  <'fill-rule'>? 
  [ round <length> ]? ,
  [<length-percentage> <length-percentage>]#
)

<path()> = path(
  <'fill-rule'>? ,
  <string>
)

<shape()> = shape(
  <'fill-rule'>?
  from <position>
  <shape-command>#
)
inset()
通过距参考框每个边缘的偏移量来定义一个内嵌矩形。如果提供的 <length-percentage> 值少于四个,省略的值将遵循 margin 速记属性的默认方式:省略的第二或第三个值默认为第一个值,省略的第四个值默认为第二个值。

这四个 <length-percentage> 分别定义了矩形顶部、右侧、底部和左侧边缘的位置,作为相对于参考框对应边缘的内嵌偏移量。

在任一维度上,如果一对内嵌偏移量的总和超过了使用尺寸(例如左右内嵌各为 75%),则使用 CSS 背景 3 § 4.5 重叠曲线 规则,将内嵌效果比例缩小至 100%。

例如,指定 inset(75% 0 50% 0) 会使顶部+底部边缘总和达到参考框高度的 125%。它们会被比例缩小至总和为 100%,这与指定 inset(60% 0 40% 0) 的效果相同。

可选的 <'border-radius'> 参数定义了矩形的圆角,使用 border-radius 速记语法。

测试
xywh()
通过相对于参考框顶部和左侧边缘的偏移量以及指定的宽度和高度来定义矩形。这四个 <length-percentage> 分别定义了相对于参考框左边缘的偏移量、相对于参考框顶边缘的偏移量、矩形的宽度以及矩形的高度。

注意: 此语法受 SVG 中 viewBox 属性的启发。

可选的 <'border-radius'> 参数定义了内嵌矩形的圆角,使用 border-radius 速记语法。

测试
rect() =
通过相对于参考框顶部和左侧边缘的内嵌偏移量来定义矩形。这四个 <length-percentage> 分别定义了矩形顶部、右侧、底部和左侧边缘的位置,作为相对于参考框顶部边缘(对于第一个和第三个值)或参考框左侧边缘(对于第二个和第四个值)的内嵌偏移量。

auto 值使盒子的边缘与参考框的相应边缘重合:它等同于作为第一个(顶部)或第四个(左侧)值的 0%,以及作为第二个(右侧)或第三个(底部)值的 100%

第二个(右侧)和第三个(底部)值会被第四个(左侧)和第二个(顶部)值下限约束。

例如,指定 rect(10px 0 0 20px) 会使底部边缘高于顶部边缘,右边缘位于左边缘的左侧,因此两者都会被修正为不跨越对方,这与指定 rect(10px 20px 10px 20px) 的效果相同。

注意: 此语法与仅由 clip 属性使用的旧版 rect() 函数类似,但不完全相同。

可选的 <'border-radius'> 参数定义了矩形的圆角,使用 border-radius 速记语法。

测试
circle()
测试
ellipse()
  • <radial-size> 参数定义了椭圆的水平和垂直半径。这些值不是指渐变框,而是相对于参考框进行解析。

  • <position> 参数定义了椭圆的圆心。除非另有说明,如果省略,默认为 center

测试
polygon()
  • <'fill-rule'> 指定用于确定内部的填充规则。如果省略,默认为 nonzero

  • round 关键字后的可选 <length> 定义了多边形每个顶点的圆角。该长度是一个圆的半径,其圆心位于顶点较小角度的平分线上,且与顶点的两条边相切。

    rounding concave and convex polygon vertices
    对既凸又凹的多边形顶点进行圆角处理。

    为了避免对任何线段超过一半的部分进行圆角处理,每个顶点的圆角半径必须分别被钳制,使得半径永远不会超过根据两个顶点线段评估出的 tan(angle/2) segment / 2 的较小值。

    visualization of clamp formula
    此图显示了钳制公式的意图。
  • 每对 <length-percentage> 指定了多边形的一个顶点,作为相对于参考框左侧和顶部边缘的水平和垂直偏移量。

用户代理必须通过连接最后一个顶点和列表中的第一个顶点来闭合多边形。

测试
path()
  • <'fill-rule'> 指定用于确定内部的填充规则。如果省略,默认为 nonzero,除非该函数被用于例如 SVG 形状等 fill-rule 属性相关的上下文中。在这种情况下,省略的值将使用 fill-rule 属性的计算值。

  • <string> 表示 SVG 路径数据字符串。不符合 SVG 1.1 语法和解析规则的路径数据字符串,或者符合但定义为空路径的字符串,是 无效的,并导致整个 path() 变为 无效

    初始位置由路径字符串中的第一个“移动到”参数定义。初始方向遵循 SVG 1.1。

对于需要闭合环的属性(例如 shape-outsideclip-path),如果字符串中不存在闭合路径命令(“z”或“Z”),用户代理必须以隐式闭合路径命令结束该路径。

测试
shape()
参见 shape() 函数 测试

    3.1.1. shape() 函数

    虽然 path() 函数允许重用 SVG 路径语法来定义比专用形状函数更随意的形状,但它要求将路径编写为单个字符串(例如,这与使用 var() 逐块构建路径不兼容),并且从 SVG 继承了许多限制,例如隐式仅允许 px 单位。

    shape() 函数使用的一组命令大致等同于 path() 所使用的命令,但使用了更标准的 CSS 语法,并允许完整的 CSS 功能范围,例如额外的单位和数学函数。shape() 使用的命令在用于渲染(例如,计算渲染的 clip-path 时)会动态转换为路径段。

    从这个意义上讲,shape()path() 的超集。path() 可以轻松转换为 shape(),但要将 shape() 转回 path() 或 SVG,则需要有关 CSS 环境的信息(例如 CSS 自定义属性的当前值、em 单位的当前字体大小等)。

    <'fill-rule'> 的解释与 path() 中的同名参数相同。

    其余参数定义了一系列路径数据命令,等同于该函数所代表的 SVG 路径

    from <coordinate-pair> 表示第一个形状命令的起点。它会在路径数据命令列表中添加一个初始的 绝对移动到 (absolute moveto) 命令。

    <shape-command> 序列表示进一步的 路径数据命令。每个命令的起点是前一个命令的终点。

    <shape-command> = <move-command> | <line-command> | close |
                      <horizontal-line-command> | <vertical-line-command> |
                      <curve-command> | <smooth-command> | <arc-command>
    
    <move-command> = move <command-end-point>
    <line-command> = line <command-end-point>
    <horizontal-line-command> = hline
            [ to [ <length-percentage> | left | center | right | x-start | x-end ]
            | by <length-percentage> ]
    <vertical-line-command> = vline
            [ to [ <length-percentage> | top | center | bottom | y-start | y-end ]
            | by <length-percentage> ]
    <curve-command> = curve
            [ [ to <position> with <control-point> [ / <control-point> ]? ]
            | [ by <coordinate-pair> with <relative-control-point> [ / <relative-control-point> ]? ] ]
    <smooth-command> = smooth
            [ [ to <position> [ with <control-point> ]? ]
            | [ by <coordinate-pair> [ with <relative-control-point> ]? ] ]
    <arc-command> = arc <command-end-point>
                [ [ of <length-percentage>{1,2} ]
                  && <arc-sweep>? && <arc-size>? && [rotate <angle>]? ]
    
    <command-end-point> = [ to <position> | by <coordinate-pair> ]
    <control-point> = [ <position> | <relative-control-point> ]
    <relative-control-point> = <coordinate-pair> [ from [ start | end | origin ] ]?
    <coordinate-pair> = <length-percentage>{2}
    <arc-sweep> = cw | ccw
    <arc-size> = large | small
    
    <coordinate-pair> = <length-percentage>{2}
    定义一对坐标,分别表示相对于指定参考点的向右和向下偏移量。百分比基于参考框的宽度或高度进行解析。
    <command-end-point> = [ to <position> | by <coordinate-pair> ]
    每个命令都可以以“绝对”或“相对”坐标指定,这由其 byto 组件决定。to 表示命令中的任何 <coordinate-pair> 都是相对于参考框的左上角,而 by 表示 <coordinate-pair> 是相对于命令的起点。<relative-control-point> 定义了曲线控制点如何解释 byto,而 <horizontal-line-command><vertical-line-command> 分别定义了如何为水平和垂直线解释 byto

    当使用 to 时,坐标可以指定为 <position> 而不是 <coordinate-pair>

    注意: 在这两种情况下,<coordinate-pair> 中的 <percentage> 值始终根据参考框的大小进行计算。

    <move-command> = move <command-end-point>
    向路径数据命令列表添加一个 moveto 命令,终点由 <coordinate-pair> 指定。这不会绘制任何东西,仅仅是为下一个命令“移动笔”。

    注意: 这会开始一个新的子路径,用于 close 命令。

    <line-command> = line <command-end-point>
    向路径数据命令列表添加一个 lineto 命令,终点由 <coordinate-pair> 指定。这会从命令的起点到其终点绘制一条直线。
    <horizontal-line-command> = hline [ to [ <length-percentage> | left | center | right | x-start | x-end ] | by <length-percentage> ]
    向路径数据命令列表添加一个水平 lineto 命令。这等同于一个 line 命令,其中 <length-percentage> 作为 <coordinate-pair> 的水平组件给出。指定 <position> 的水平组件而不是 <length-percentage>(left、center、right、x-start 或 x-end)将绘制一条到该 <position> 的线,其中 <position> 的垂直组件与起点相同。
    <vertical-line-command> = vline [ to [ <length-percentage> | top | center | bottom | y-start | y-end ] | by <length-percentage> ]
    向路径数据命令列表添加一个垂直 lineto 命令。这等同于一个 line 命令,其中 <length-percentage> 作为 <coordinate-pair> 的垂直组件给出。指定 <position> 的垂直组件(top、center、bottom、y-start 或 y-end)而不是 <length-percentage> 将绘制一条到该 <position> 的线,其中 <position> 的水平组件与起点相同。
    <curve-command> = curve [ [ to <position> with <control-point> [ / <control-point> ]? ] | [ by <coordinate-pair> with <relative-control-point> [ / <relative-control-point> ]? ] ]
    向路径数据命令列表添加一个贝塞尔曲线命令,终点由 to 关键字后的 <position>by 关键字后的 <coordinate-pair> 指定。with 组件指定曲线的控制点:如果提供一个 <control-point><relative-control-point>,则命令指定一个 二次曲线;如果提供两个控制点,则指定一个 三次曲线
    <smooth-command> = smooth [ [ to <position> [with <control-point> ]? ] | [ by <coordinate-pair> [ with <relative-control-point> ]? ] ]
    向路径数据命令列表添加一个平滑贝塞尔曲线命令,终点由 to 关键字后的 <position>by 关键字后的 <coordinate-pair> 指定。with 组件指定曲线的控制点:如果省略,命令指定一个 平滑二次曲线;如果提供,则指定一个 平滑三次曲线注意: smooth 命令等同于 curve 命令,其中第一个控制点自动指定为前一个曲线的第二个控制点围绕起点的反射点,或者如果前一个路径数据命令不是曲线,则为起点。这确保了与前一个命令的 G1 连续性,因此曲线看起来是从前一个命令平滑继续的,而不是突然改变方向。
    <control-point> = [ <position> | <relative-control-point> ]
    为二次或三次贝塞尔曲线提供控制点。
    <relative-control-point> = <coordinate-pair> [ from [ start | end | origin ] ]?
    为二次或三次贝塞尔曲线提供控制点。当指定 from 关键字后跟 startendorigin 时,给定的 <coordinate-pair> 分别相对于命令的起点、命令的终点或参考框。如果没有提供此类组件,则 <coordinate-pair> 相对于段的起点。
    <arc-command> = arc <command-end-point> [of <length-percentage>{1,2}] && <arc-sweep>? && <arc-size>? && rotate <angle>? ]
    向路径数据命令列表添加一个 椭圆弧 命令,终点为 <command-end-point>of 组件指定弧线所属椭圆的尺寸。第一个 <length-percentage> 提供椭圆的水平半径,第二个提供垂直半径。与 <coordinate-pair> 一样,<percentage> 值根据参考框的宽度或高度进行解析。

    如果仅提供一个 <length-percentage>,则两个半径均使用该值。在这种情况下,<percentage> 值根据参考框与方向无关的尺寸进行解析(类似于 circle() 函数)。

    注意 SVG 对椭圆半径有一些特定的错误处理
  • 如果终点与起点相同,则该命令不执行任何操作

  • 如果任一半径为零,则该命令等同于到终点的 <line-command>

  • 如果任一半径为负,则使用其绝对值

  • 如果半径描述的椭圆不足以同时通过起点和终点(在指定 <angle> 旋转后),它们将被均匀放大,直到椭圆刚好足够大。

  • 由指定半径描述的椭圆默认为轴对齐,但可以通过指定 <angle> 进行旋转。类似于 rotate() 变换函数,正角度指定顺时针旋转,负角度指定逆时针旋转。如果省略,默认为 0deg

    终点、半径和角度结合在一起,通常定义了两个通过起点和终点的可能椭圆,每个椭圆可以在任一方向上跟踪,总共四个可能的弧线。<arc-sweep><arc-size> 组件指定需要其中的哪一个弧线

    • <arc-sweep> 可以是 cwccw,分别表示必须选择围绕中心顺时针或逆时针跟踪的弧线。如果省略,默认为 ccw

      注意: 在 SVG 弧命令中,cw 对应于扫描标志 (sweep flag) 的值 1,而 ccw 对应于值 0。

    • <arc-size> 可以是 largesmall,分别表示必须选择两个可能的弧线中较大或较小的一个。如果省略,默认为 small

      注意: 在 SVG 弧命令中,large 对应于大标志 (large flag) 的值 1,而 small 对应于 0。

      注意: 如果起点和终点位于椭圆的正对面,则两个可能的弧线大小相同,但也只有一个可能的椭圆。在这种情况下,<arc-sweep> 区分选择哪一个可能的弧线,而 <arc-size> 不起作用。

    a depiction of four possible arcs given a start and end point
    两个可能椭圆的描绘,以及在两者之间可以选择的四个可能的弧线。
    关闭
    向路径数据命令列表添加一个 closepath 命令。注意: 这类似于一个 line 命令,其终点设置为子路径的起点。当指定原始形状时,它们是相同的,但如果路径被描边,close 命令的终点会与子路径的起点平滑连接,这会影响线连接和线帽的渲染方式。
    3.1.1.1. 使用 shape() 创建响应式、参数化的对话气泡
    shape() 函数支持响应式而非简单的可缩放形状。虽然 polygon() 形状也是响应式的,但它仅支持简单的圆角,不支持复杂的曲线。为了演示,让我们从一个对话气泡开始,如下所示

    A speech bubble shape

    将此形状与 clip-path 一起使用可以通过 path() 函数完成

    .bubble { clip-path: path("m 5 0 H 95 Q 100 0 100 5 V 92 Q 100 97 95 97 H 70 l -2 3 l -2 -3 H 5 Q 0 97 0 92 V 5 Q 0 0 5 0") };
    

    虽然此路径可以轻松缩放,但缩放后的结果并不总是理想的。例如,缩放到小气球时,箭头和圆角会缩放到几乎不可见

    scled-down speech bubble shape

    要使用 shape() 函数构建此形状,让我们首先将 path 函数中的所有像素值转换为百分比。注意 shape() 函数以 from 开头

    .bubble { clip-path: shape(  from 5% 0%,
                  hline to 95%,
                  curve to 100% 5% with 100% 0%,
                  vline to 92%,
                  curve to 95% 97% with 100% 97%,
                  hline to 70%,
                  line by -2% 3%,
                  line by -2% -3%,
                  hline to 5%,
                  curve to 0% 92% with 0% 97%,
                  vline to 5%,
                  curve to 5% 0% with 0% 0%); }
    

    为了使该路径具有响应性(即对尺寸变化有良好的响应),我们将把部分单位转换为 px 值,特别是那些控制曲线和箭头的单位

    .bubble { clip-path: shape(  from 5px 0%,
                  hline to calc(100% - 5px),
                  curve to 100% 5px with 100% 0%,
                  vline to calc(100% - 8px),
                  curve to calc(100% - 5px) calc(100% - 3px) with 100% calc(100% - 3px),
                  hline to 70%,
                  line by -2px 3px,
                  line by -2px -3px,
                  hline to 5px,
                  curve to 0% calc(100% - 8px) with 0% calc(100% - 3px),
                  vline to 5px,
                  curve to 5px 0% with 0% 0%); }
    

    当作为 clip-path 应用时,它看起来如下所示

    A speech bubble shape, using clip-path

    整个对话气泡会缩放到参考框,而曲线和箭头保持相对固定。

    由于 shape() 使用 CSS 单位,我们可以用 position 值替换一些边缘

    .bubble { clip-path: shape(from 5px 0,
                  hline to calc(100% - 5px),
                  curve to right 5px with right top,
                  vline to calc(100% - 8px),
                  curve to calc(100% - 5px) calc(100% - 3px) with right calc(100% - 3px),
                  hline to 70%,
                  line by -2px 3px,
                  line by -2px -3px,
                  hline to 5px,
                  curve to left calc(100% - 8px) with left calc(100% - 3px),
                  vline to 5px,
                  curve to 5px top with left top); }
    

    shape() 的另一个有用特性是它可以与 CSS 属性一起使用。在这种情况下,我们可以使箭头和半径参数化

    :root {
      --radius: 5px;
      --arrow-length: 3px;
      --arrow-half-width: 2px;
      --arrow-position: 70%;
      --arrow-bottom-offset: calc(100% - var(--radius) - var(--arrow-length));
    }
    
    .bubble {
      animation: bubble 100ms;
      clip-path: shape(from var(---radius) top,
        hline to calc(100% - var(---radius)),
        curve to right var(---radius) with right top,
        vline to var(---arrow-bottom-offset),
        curve to calc(100% - var(---radius)) calc(100% - var(---arrow-length))
                  with right calc(100% - var(---arrow-length)),
        hline to var(---arrow-position),
        line by var(---arrow-half-width) var(---arrow-length),
        line by var(---arrow-half-width) calc(0px - var(---arrow-length)),
        hline to var(---radius),
        curve to left var(---arrow-bottom-offset) with left calc(100% - var(---arrow-length)),
        vline to var(---radius),
        curve to var(---radius) top with left top); }
    
    3.1.1.2. shape() 函数的插值

    shape()path() 函数如果其相关路径数据命令列表长度相同且命令顺序相同,则可以互相插值,其中 path() 函数的第一个命令与 shape() 函数中的初始 <coordinate-pair> 进行插值。

    注意: path() 函数的第一个命令保证是一个 move,参见 SVG 规范中的 moveTo

    如果起点和终点值都是 path() 函数,则插值结果是一个 path() 函数;否则它是一个 shape() 函数。在这两种情况下,插值后的值必须表示相同的路径数据命令列表,每个命令的数值组件在起始列表和结束列表的对应组件之间进行插值。

    为此,如果命令使用相同的命令关键字和相同的 <by-to> 关键字,则它们是“相同”的。对于 curvesmooth,它们还必须具有相同数量的控制点。

    如果一个 arc 命令在其起始列表和结束列表之间具有不同的 <arc-sweep>,则插值结果对于 0 和 1 之间的任何进度值使用 cw。如果它具有不同的 <arc-size> 关键字,则插值结果对于 0 和 1 之间的任何进度值使用 large

    注意: arc 关键字插值规则旨在匹配现有的 SVG path 插值规则。

    3.2. 基本形状的计算值

    <basic-shape> 函数中的值按指定方式计算,但有以下例外:

    测试

    3.3. 基本形状的序列化

    要序列化 <basic-shape> 函数,请根据其各自的语法进行序列化,顺序与语法编写顺序一致,用单个空格连接空格分隔的标记,并在每个序列化逗号后跟一个空格。对于序列化计算值,分量值会计算,并在不改变含义的情况下尽可能省略。

    由于形状函数的指定值序列化相对简单,以下是一些在 shape-outside 中使用时 circle() 标记的计算值序列化示例

    测试

    3.4. 基本形状的插值

    对于在一个基本形状和第二个基本形状之间进行插值,应用以下规则。形状函数中的值按计算值进行插值。列表值在可能的情况下按长度、百分比或 calc 进行插值。如果列表值不是这些类型之一但相同(例如在两个列表中发现相同列表位置的 nonzero),这些值会进行插值。

    测试

    4. 基于图像的形状 (Shapes from Image)

    定义形状的另一种方法是指定一个源 <image>,利用其 Alpha 通道来计算形状。计算得出的形状是包围了指定图像不透明度大于 shape-image-threshold 值区域的路径。如果不存在 Alpha 值大于指定阈值的像素,则会导致浮动区域为空,从而不会影响环绕排版。如果未指定 shape-image-threshold,则考虑的初始值为 0.0。

    图像的尺寸和位置设定如同一个替换元素,其指定的宽度和高度与该元素的已用内容框 (content box) 尺寸相同。

    对于动画光栅图像格式(如 GIF),将使用动画序列的第一帧。

    图像浮动在段落左侧。该图像显示了透明背景上的 CSS 徽标 3D 版本。徽标利用 Alpha 通道带有一层阴影。

    图像通过 shape-outside 属性定义其 浮动区域

    
      <p>
        <img id="CSSlogo" src="CSS-logo1s.png"/>
        blah blah blah blah...
      </p>
    
      <style>
        #CSSlogo {
          float: left;
          shape-outside: attr(src url);
          shape-image-threshold: 0.1;
        }
      </style>
    

    shape-outside 属性复用了 img 元素 src 属性中的 url。

    完全可以显示一张图像,并为其 浮动区域 使用另一张不同的图像。

    在下图中,Alpha 通道阈值由 CSS 徽标周围的虚线表示。

    通过以下三种方式可以影响段落行开始的位置:

    1. 修改图像中的 Alpha 通道
    2. 更改 shape-image-threshold 属性的值
    3. 更改 shape-margin 属性的值(参见示例 8)
    A float shape around an image using its alpha-channel
    利用 Alpha 通道环绕图像的浮动形状。
    测试

    5. 基于框值的形状 (Shapes from Box Values)

    形状可以通过引用 CSS 盒模型 中的边来定义。这些边包括来自已用 border-radius 值的 边框圆角曲率 [CSS3BG]<shape-box> 值扩展了 <visual-box> 值,增加了 margin-box。其语法为

    <shape-box> = <visual-box> | margin-box
    

    这些值的定义如下

    margin-box 值定义了由外部外边距边缘包围的形状。该形状的圆角半径由相应的 border-radius 和 margin 值决定。如果 border-radius/margin 的比例为 1 或以上,或者 margin 为负数或零,则外边距框的圆角半径为 max(border-radius + margin, 0)。如果 border-radius/margin 的比例小于 1,且 margin 为正数,则外边距框的圆角半径为 border-radius + margin * (1 + (ratio-1)^3)

    border-box 值定义了由外部边框边缘包围的形状。该形状遵循所有正常的边框外部圆角形状规则。

    padding-box 值定义了由外部内边距边缘包围的形状。该形状遵循所有正常的边框内部圆角形状规则。

    content-box 值定义了由外部内容边缘包围的形状。此框的每个圆角半径为 0 或 border-radius - border-width - padding 中的较大者。

    给定下方具有 10px 内边距、边框和外边距的 100px 正方形,框值定义了这些形状

    Colored boxes representing simple box edges
    简单的 CSS 盒模型边缘

    相同的定义也适用于更复杂的例子:同样是 100px 的正方形,但具有这些边框、内边距和外边距属性

    
      border-radius: 20px 20px 20px 40px;
      border-width: 30px 10px 20px 10px;
      padding: 10px 20px 10px 10px;
      margin: 20px 10px 10px 10px;
    
    Colored boxes representing complex box edges
    复杂的 CSS 盒模型边缘

    普通浮动环绕与基于 margin-box 值定义的形状环绕之间的区别在于,margin-box 形状包含了圆角处理。以具有 10px 内边距、边框和外边距的 100px 正方形为例,但设置 border-radius 为 60px。如果将其设为左浮动,内容通常会以这种方式环绕

    Text wrapping around float with no shape
    普通浮动环绕

    如果你为浮动添加一个 margin-box 形状,则内容会环绕圆角后的 margin-box 角。

    
      shape-outside: margin-box;
    
    Text wrapping around float with margin-box shape
    带 margin-box 的浮动环绕
    测试

    6. 声明形状 (Declaring Shapes)

    形状通过 shape-outside 属性声明,并可能受到 shape-margin 属性的修改。由 shape-outsideshape-margin 属性定义的形状会改变浮动元素的 浮动区域 的几何结构。

    6.1. 浮动区域形状:shape-outside 属性

    名称shape-outside
    none | [ <basic-shape> || <shape-box> ] | <image>
    初始值 none(无)
    应用于 浮动元素和 首字母框
    可继承
    百分比 不可用
    计算值 <basic-shape>定义(如果提供,则紧跟 <shape-box>);否则为计算后的 <image>;否则为指定的关键字
    规范顺序 按语法
    动画类型 <basic-shape>定义,否则为离散值

    该属性的取值含义如下

    none(无)
    浮动区域 不受影响。
    <shape-box>
    如果单独指定其中一个值,则形状基于 margin-boxborder-boxpadding-boxcontent-box 之一进行计算,这些值会使用它们各自包含 border-radius 曲率的框,类似于 background-clip [CSS3BG]
    <basic-shape>
    形状基于 <basic-shape> 函数之一进行计算。如果同时提供了 <shape-box>,则它定义了 参考框 用于 <basic-shape> 函数。如果未提供 <shape-box>,则 参考框 默认为 margin-box
    <image>
    形状根据 shape-image-threshold 的定义,基于指定 <image> 的 Alpha 通道提取并计算。

    对于 shape-outside 值中的所有 URL,用户代理必须使用 [FETCH] 规范定义的 CORS 协议。在获取时,用户代理必须使用“匿名 (Anonymous)”模式,将 Referer 源设置为样式表的 URL,并将 Origin 设置为包含该文档的 URL。如果这导致网络错误以至于没有有效的后备图像,则其效果如同指定了 none 值一样。

    测试

    6.2. 选择图像像素:shape-image-threshold 属性

    shape-image-threshold 属性定义了用于通过图像提取形状的 Alpha 通道阈值。值为 0.5 意味着形状将包含所有不透明度大于 50% 的像素。

    名称shape-image-threshold
    <opacity-value>
    初始值 0
    应用于 浮点数
    可继承
    百分比 不可用
    计算值 指定的数字,限制在 [0,1] 范围内
    规范顺序 按语法
    动画类型 按计算值

    该属性的取值含义如下

    <number>(数字)
    设置用于从图像中提取形状的阈值。形状由 Alpha 值大于该阈值的像素定义。如果阈值超出 0.0(完全透明)到 1.0(完全不透明)的范围,将被截断至该范围。

    注意: 未来版本的 CSS Shapes 可能会定义一个开关,用于使用图像的亮度数据而非 Alpha 数据。届时,shape-image-threshold 将被扩展,根据开关状态将其阈值应用于 Alpha 或亮度。

    测试

    6.3. 扩展形状:shape-margin 属性

    shape-margin 属性为 shape-outside 添加外边距。这定义了一个新的形状,它是包含所有距离基础形状上某一点法线方向 shape-margin 距离的点的最小轮廓(收缩包裹意义上的)。这包括基础形状中的任何边缘或线条部分。注意,在无法定义法线的点(例如尖点或线端),则取以该点为中心、半径为 shape-margin 的圆上的所有点。

    通过应用 shape-outside 产生的新形状决定了 浮动区域,并且必须在做出任何 换行 决策之前构建完成。

    此属性仅接受非负值。

    名称shape-margin
    <length-percentage [0,∞]>
    初始值 0
    应用于 浮动元素和 首字下沉框
    可继承
    百分比 参考包含块的 行内尺寸
    计算值 计算出的 <length-percentage>
    规范顺序 按语法
    动画类型 按计算值
    <length-percentage [0,∞]>
    将形状的外边距设置为指定值。

    注意: 添加 shape-margin 不允许浮动区域延伸到浮动元素的 margin-box 之外。可能需要同时应用额外的 margin 以避免裁剪。

    shape-margin 从多边形 shape-outside 创建的偏移。较浅的蓝色区域显示了 100x100px 浮动中的形状,深蓝色区域显示了 10px 的偏移。

    
      .float {
          width: 100px;
          height: 100px;
        shape-outside: polygon(10px 10px, 90px 50px, 40px 50px, 90px 90px, 10px 90px);
        shape-margin: 10px;
      }
    

    Example of a shape-margin offset

    如果将 shape-margin 添加到示例 6 中的 CSS 标志,则围绕形状 换行 的行框会进一步缩短。如果图像的 Alpha 通道延伸到图像的右边缘,则应应用一些额外的 margin-right,以确保形状不会被 margin-box 裁剪。

    
      #CSSlogo {
        shape-margin: 35px;
        margin-right: 35px;
      }
    
    A float shape around an image using its alpha-channel with a 35 pixels shape-margin
    使用其 Alpha 通道且具有 35 像素 shape-margin 的图像周围的浮动形状
    测试

    7. 隐私考量

    目前尚未针对此规范提出隐私问题。

    8. 安全考量

    由于 shape-outside<image> 值可能会以新方式暴露某些图像数据,因此其使用仅限于经 CORS 批准的图像。

    致谢

    本规范得益于以下人士的贡献:Tab Atkins Jr., Amelia Bellamy-Royds, Oriol Brufau, Andrei Bucur, Alexandru Chiculita, Boris Chiou, Emilio Cobos Álvarez, Elika Etemad, Arron Eicholz, Sylvain Galineau, Daniel Glazman, Arno Gourdol, Zoltan Horvath, Chris Jones, Bem Jones-Bey, Ian Kilpatrick, Guillaume Lebas, Ting-Yu Lin, Eric Meyer, Marcus Mielke, Alex Mogilevsky, Hans Muller, Mihnea Ovidenie, Virgil Palanciuc, Noam Rosenthal, Robert Sanderson, Dirk Schulze, Jen Simmons, Peter Sorotokin, Bear Travis, Lea Verou, Eugene Veselov, Brad Werth, Stephen Zilles 以及 CSS 工作组成员。

    变更日志

    2022年11月15日

    2014年3月20日

    2014年2月11日

    2013年12月3日

    2013年6月20日

    2012年5月3日

    2011年12月13日

    一致性

    文档约定

    一致性要求通过描述性断言和 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"> 与其他规范性文本区分开来,如下所示: 用户代理必须提供可访问的替代方案。

    测试

    与本规范内容相关的测试可记录在“Tests”块中,就像这一个一样。任何此类块都是非规范性的。


    一致性类别

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

    样式表
    一份 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. 不是实验性的(即,专门为通过测试套件设计且不打算用于正常使用的版本)。

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

    索引

    本规范定义的术语

    通过引用定义的术语

    引用

    规范性引用

    [CSS-BOX-4]
    Elika Etemad. CSS 盒模型模块 Level 4. 2024 年 8 月 4 日. WD. URL: https://w3org.cn/TR/css-box-4/
    [CSS-CASCADE-5]
    Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://w3org.cn/TR/css-cascade-5/
    [CSS-COLOR-4]
    Chris Lilley; Tab Atkins Jr.; Lea Verou. CSS 颜色模块 Level 4. 2025 年 4 月 24 日. CRD. URL: https://w3org.cn/TR/css-color-4/
    [CSS-IMAGES-3]
    Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS 图像模块第 3 级. 2023 年 12 月 18 日. CRD. URL: https://w3org.cn/TR/css-images-3/
    [CSS-IMAGES-4]
    Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 4. 2023年2月17日. WD. URL: https://w3org.cn/TR/css-images-4/
    [CSS-INLINE-3]
    Elika Etemad. CSS 内联布局模块 Level 3. 2024 年 12 月 18 日. 工作草案 (WD). URL: https://w3org.cn/TR/css-inline-3/
    [CSS-MASKING]
    Dirk Schulze; Brian Birtles; Tab Atkins Jr.. CSS 遮罩模块 Level 1. 2021 年 8 月 5 日. CRD. URL: https://w3org.cn/TR/css-masking-1/
    [CSS-SYNTAX-3]
    Tab Atkins Jr.; Simon Sapin. CSS 语法模块 3 级 (CSS Syntax Module Level 3). 2021年12月24日. CRD. URL: https://w3org.cn/TR/css-syntax-3/
    [CSS-TRANSFORMS-1]
    Simon Fraser; et al. CSS Transforms Module Level 1. 2019年2月14日. CR. URL: https://w3org.cn/TR/css-transforms-1/
    [CSS-VALUES-3]
    Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块 3 级 (CSS Values and Units Module Level 3). 2024年3月22日. CRD. URL: https://w3org.cn/TR/css-values-3/
    [CSS-VALUES-4]
    Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块 4 级 (CSS Values and Units Module Level 4). 2024年3月12日. WD. URL: https://w3org.cn/TR/css-values-4/
    [CSS-VALUES-5]
    Tab Atkins Jr.; Elika Etemad; Miriam Suzanne. CSS Values and Units Module Level 5. 2024年11月11日. WD. URL: https://w3org.cn/TR/css-values-5/
    [CSS-VARIABLES-1]
    Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2022年6月16日. CR. URL: https://w3org.cn/TR/css-variables-1/
    [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/
    [CSS2]
    Bert Bos; et al. 层叠样式表 2 级修订版 1 (CSS 2.1) 规范 (Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification). 2011年6月7日. REC. URL: https://w3org.cn/TR/CSS2/
    [CSS3BG]
    Elika Etemad; Brad Kemper. CSS 背景与边框模块 3 级 (CSS Backgrounds and Borders Module Level 3). 2024年3月11日. CRD. URL: https://w3org.cn/TR/css-backgrounds-3/
    [CSS3BOX]
    Elika Etemad. CSS Box Model Module Level 3. 2024年4月11日. REC. URL: https://w3org.cn/TR/css-box-3/
    [FETCH]
    Anne van Kesteren. 提取标准 (Fetch Standard). 生活标准. URL: https://fetch.spec.whatwg.org/
    [RFC2119]
    S. Bradner. RFC 中用于指示要求级别的关键词. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
    [SVG2]
    Amelia Bellamy-Royds; et al. Scalable Vector Graphics (SVG) 2. 2018年10月4日. CR. URL: https://w3org.cn/TR/SVG2/

    参考资料

    [CSS3-EXCLUSIONS]
    Rossen Atanassov; Vincent Hardy; Alan Stearns. CSS 排除模块 Level 1. 2015 年 1 月 15 日. 工作草案 (WD). URL: https://w3org.cn/TR/css3-exclusions/

    属性索引

    名称初始值应用于继承百分比动画类型 (Animation type)规范顺序计算值
    shape-image-threshold <opacity-value>0 浮点数不可用按计算值按语法指定的数字,限制在 [0,1] 范围内
    shape-margin <length-percentage [0,∞]>0 浮动元素和首字下沉框参考包含块的行内尺寸按计算值按语法计算出的 <length-percentage> 值
    shape-outside none | [ <basic-shape> || <shape-box> ] | <image>none(无)浮动元素和首字下沉框不可用按 <basic-shape> 定义,否则为离散值按语法按 <basic-shape> 定义(若提供,随后为 <shape-box>);否则为计算出的 <image>;否则为指定的关键字