<basic-shape>

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.

* Some parts of this feature may have varying levels of support.

<basic-shape> CSS 数据类型表示一种用于 clip-pathshape-outsideoffset-path 属性的形状。

尝试一下

语法

<basic-shape> 数据类型用于创建基本形状,包括通过容器 inset、通过坐标距离,或通过设定尺寸圆形椭圆形多边形路径以及作者创建的形状。这些基本形状是使用一个 <basic_shape> CSS 函数来定义的,每个值都需要一个符合该形状函数特定语法的参数。

公共参数

一些基本形状函数的语法中公共的参数包括:

round <'border-radius'>

通过容器 inset 定义的矩形通过距离定义的矩形以及具有尺寸的矩形定义圆角,使用与 CSS border-radius 缩写属性相同的语法。

<shape-radius>

定义圆形椭圆形的半径。有效值包括 <length><percentage>closest-side(默认值)和 farthest-side。负值无效。

closest-side 关键字值使用从形状中心到参考框最近边的长度来创建半径长度。farthest-side 关键字值使用从形状中心到参考框最远边的长度。

<position>

定义圆形椭圆形的中心 <position>。如果省略,则默认为 center

<fill-rule>

设置 fill-rule 用于确定由基本形状多边形路径形状定义的形状内部应如何填充。可能的值为 nonzero(默认值)和 evenodd

备注:offset-path 中不支持 <fill-rule>,使用它会使属性无效。

通过容器 inset 定义矩形的语法

inset() 函数创建一个内嵌矩形,其大小由容器四边向内偏移的距离定义,并且可以选择是否带有圆角。

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

当提供全部四个参数时,它们分别代表从参考框向内偏移的顶部、右侧、底部和左侧距离,这些距离定义了内嵌矩形的边缘位置。这些参数遵循 margin 缩写语法的规则,允许你使用一个、两个、三个或四个值来设置所有四个 inset。

如果某个尺寸的两个 inset 之和超过了该尺寸的 100%,则这两个值会按比例减小,使它们的和等于 100%。例如,值 inset(90% 10% 60% 10%) 中,顶部 inset 为 90%,底部 inset 为 60%。这些值会按比例减小为 inset(60% 10% 40% 10%)。像这样的形状,如果不包围任何区域并且没有 shape-margin,则不会影响换行。

通过距离定义矩形的语法

rect() 函数使用距参考框顶部和左侧边缘的指定距离来定义一个矩形,同时可选择是否带有圆角。

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

在使用 rect() 函数时,你无需定义矩形的宽度和高度。相反,你通过指定四个值来创建矩形,其尺寸由参考框的大小和这四个偏移值共同决定。每个值可以是 <length><percentage> 或关键字 auto。对于顶部和左侧的值,auto 关键字被解释为 0%;对于底部和右侧的值,auto 被解释为 100%

具有尺寸的矩形语法

xywh() 函数定义了一个矩形,该矩形位于距参考框左边缘(x)和上边缘(y)的指定距离处,并按照指定的矩形宽度(w)和高度(h)进行尺寸设置,顺序依此排列,同时可选择是否带有圆角。

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

圆形语法

circle() 函数使用一个半径和一个位置定义一个圆形。

circle( <shape-radius>? [ at <position> ]? )

椭圆形语法

ellipse() 函数使用两个半径和一个位置定义一个椭圆形。

ellipse( [ <shape-radius>{2} ]? [ at <position> ]? )

<shape-radius> 参数依次代表椭圆的 x 轴半径 rx 和 y 轴半径 ry。这些值可以指定为 <length><percentage>。此处的百分比值是根据参考框的使用宽度(对于 rx 值)和使用高度(对于 ry 值)来确定的。如果只提供了一个半径值,则 ellipse() 形状函数是无效的。如果没有提供任何值,则默认使用 50% 50%

多边形语法

polygon() 函数使用 SVG 的 fill-rule 和一组坐标来定义一个多边形。

polygon( <`fill-rule`>?, [ <length-percentage> <length-percentage> ]# )

该函数接受一个由逗号分隔的坐标对列表,每个坐标对由两个空格分隔的 <length-percentage> 值组成,分别作为 xiyi 对。这些值表示多边形在位置 i(即两条线相交的顶点)处的 x 轴和 y 轴坐标。

路径语法

path() 函数使用 SVG 的 fill-rule 和 SVG 路径定义来定义一个形状。

path( <`fill-rule`>?, ]? <string> )

必需的 <string> 是一个作为引用字符串的 SVG 路径path() 函数不是有效的 shape-outside 属性值。

形状语法

shape() 函数使用一个初始起点和一系列形状命令来定义一个形状。

shape( <fill-rule>? from <coordinate-pair>, <shape-command># )

from <coordinate-pair> 参数表示第一个形状命令的起点,而 <shape-command> 则定义了一个或多个形状命令,这些命令类似于 SVG 路径命令shape() 函数不是有效的 shape-outside 属性值。

描述

在创建形状时,参考框由使用 <basic-shape> 值的属性定义。形状的坐标系默认以元素的外边距框的左上角为原点,x 轴向右延伸,y 轴向下延伸。所有以百分比表示的长度都是根据参考框的尺寸来确定的。

默认的参考框是 margin-box,如下图所示。该图展示了一个使用 shape-outside: circle(50%) 创建的圆形,在浏览器开发者工具中高亮可见的盒模型的不同部分。此处的形状是相对于外边距框来定义的。

一张图片,展示了使用 Firefox 开发者工具的形状检查器检查的圆形。盒模型的不同部分已被高亮显示。

基础形状的计算值

<basic-shape> 函数中的值按照指定方式计算,考虑以下附加因素:

  • 对于任何省略值,将使用其默认值。
  • circle()ellipse() 中的 <position> 值计算为从参考框左上角开始的一对偏移量:第一个偏移量是水平方向的,第二个偏移量是垂直方向的。每个偏移量都被指定为 <length-percentage> 值。
  • inset() 中的 <border-radius> 值被扩展为一个包含八个值的列表,每个值要么是 <length>,要么是 <percentage>
  • inset()rect()xywh() 函数计算为等效的 inset() 函数。

基本形状的插值

在两个 <basic-shape> 函数之间进行动画处理时,遵循以下插值规则。每个 <basic-shape> 函数的参数值构成一个列表。为了在两个形状之间进行插值,这两个形状必须使用相同的参考框,并且两个 <basic-shape> 列表中的值的数量和类型必须匹配。

在两个 <basic-shape> 函数的列表中,每个值都尽可能的基于其计算值进行插值,计算值是 <number><length><percentage><angle>calc()。如果值不是这些数据类型之一,但在两个进行插值的基本形状函数中相同,例如 nonzero,则仍然可以进行插值。

  • 两个形状均为 ellipse() 类型或 circle() 类型:如果它们的半径指定为 <length><percentage>(而不是 closest-sidefarthest-side 等关键字),则对每个相应的值应用插值。

  • 两个形状均为 inset() 类型:对每个相应的值应用插值。

  • 两个形状均为 polygon() 类型:如果它们使用相同的 <fill-rule> 并且具有相同数量的逗号分隔的坐标对,则对每个相应的值应用插值。

  • 两个形状均为 path() 类型:如果两个形状中的路径字符串匹配路径数据命令的数量、类型和顺序,则将每个参数作为 <number> 应用插值。

  • 两个形状均为 shape() 类型:如果它们具有相同的命令关键字并且使用相同的 <by-to> 关键字,则对每个相应的值应用插值。如果 shape() 用于 clip-path 属性,则当它们还具有相同的 <fill-rule> 时,对这两个形状进行插值。

    • 如果它们使用 <curve-command><smooth-command>,则控制点的数量必须匹配才能进行插值。
    • 如果它们使用不同 <arc-sweep> 方向的 <arc-command>,则插值结果按顺时针方向(cw)进行。如果它们使用不同的 <arc-size> 关键字,则使用 large 值对大小进行插值。
  • 一个形状为 path() 类型,另一个为 shape() 类型:如果路径数据命令的列表在数量和顺序上相同,则对每个相应的值应用插值。插值后的形状是一个 shape() 函数,保持相同的路径数据命令列表。

在其他所有情况下,不进行插值,动画是离散的。

示例

动画多边形

在这个示例中,我们使用了@keyframes at 规则为两个多边形之间的裁剪路径创建动画效果。请注意,这两个多边形必须具有相同数量的顶点,这是此类动画能够正常工作的必要条件。

HTML

html
<div></div>

CSS

css
div {
  width: 300px;
  height: 300px;
  background: repeating-linear-gradient(red, orange 50px);
  clip-path: polygon(
    50% 0%,
    60% 40%,
    100% 50%,
    60% 60%,
    50% 100%,
    40% 60%,
    0% 50%,
    40% 40%
  );
  animation: 4s poly infinite alternate ease-in-out;
  margin: 10px auto;
}

@keyframes poly {
  from {
    clip-path: polygon(
      50% 0%,
      60% 40%,
      100% 50%,
      60% 60%,
      50% 100%,
      40% 60%,
      0% 50%,
      40% 40%
    );
  }

  to {
    clip-path: polygon(
      50% 30%,
      100% 0%,
      70% 50%,
      100% 100%,
      50% 70%,
      0% 100%,
      30% 50%,
      0% 0%
    );
  }
}

结果

规范

Specification
CSS Shapes Module Level 1
# basic-shape-functions

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobile
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
<basic-shape>
Animation
circle()
ellipse()
inset()
path()
In clip-path
In d as CSS property
In offset-path
In shape-outside
polygon()
rect()
shape()
Experimental
xywh()

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
Partial support
Partial support
In development. Supported in a pre-release version.
In development. Supported in a pre-release version.
No support
No support
Experimental. Expect behavior to change in the future.
User must explicitly enable this feature.
Requires a vendor prefix or different name for use.
Has more compatibility info.

参见