CSS 中 SVG 属性指南

Avatar of Katherine Kato
Katherine Kato 发布

SVG 拥有自己的一套元素、属性和特性,以至于内联 SVG 代码可能会变得冗长且复杂。通过利用 CSS 和 SVG 2 规范中的一些即将推出的功能,我们可以减少这些代码,从而获得更简洁的标记。

由 DigitalOcean 提供支持

DigitalOcean 提供您在任何阶段支持业务增长所需的云计算服务。 立即获取 200 美元的免费信用额度!

有很多 可缩放矢量图形 (SVG),但只有某些属性可以作为 CSS 应用于 SVG。 表示属性 用于设置 SVG 元素的样式,并且可以用作 CSS 属性。其中一些属性仅限于 SVG,而其他属性已在 CSS 中共享,例如 font-sizeopacity

例如,要将 元素的颜色更改为红色,请在 CSS 中使用 fill 属性。fill 属性是一个表示属性,因此可以用作 CSS 属性。

circle {
  fill: red;
}

因此,让我们深入全面地了解所有可用的 SVG 元素及其 CSS 属性。我们还将了解各种样式方法,包括通用表示样式和动画。

按类别分类的 SVG 元素

可以在下面找到可以用作 CSS 属性的表示属性。作为参考,支持的元素将按类别分类。这并不包括已弃用的元素。

元素类型元素
容器元素<a>
<defs>
<g>
<marker>
<mask>
<pattern>
<svg>
<switch>
<symbol>
滤镜基元元素<feBlend>
<feColorMatrix>
<feComponentTransfer>
<feComposite>
<feConvolveMatrix>
<feDiffuseLighting>
<feDisplacementMap>
<feFlood>
<feGaussianBlur>
<feImage>
<feMerge>
<feMorphology>
<feOffset>
<feSpecularLighting>
<feTile>
<feTurbulence>
渐变元素<linearGradient>
<radialGradient>
<stop>
图形元素<circle>
<ellipse>
<image>
<line>
<path>
<polygon>
<polyline>
<rect>
<text>
<use>
形状元素<circle>
<ellipse>
<line>
<path>
<polygon>
<polyline>
<rect>
文本内容元素<text>
<textPath>
<tspan>

CSS 和 SVG 之间共享的属性

字体属性

表示属性支持的元素
font文本内容元素
font-family文本内容元素
font-size文本内容元素
font-size-adjust文本内容元素
font-stretch文本内容元素
font-style文本内容元素
font-variant文本内容元素
font-weight文本内容元素

文本属性

表示属性支持的元素
direction<text>
<tspan>
letter-spacing文本内容元素
text-decoration文本内容元素
unicode-bidi文本内容元素
word-spacing文本内容元素
writing-mode<text>

蒙版属性

表示属性支持的元素
overflow<foreignObject>
<image>
<marker>
<pattern>
<svg>
<symbol>

交互属性

表示属性支持的元素
cursor容器元素
图形元素

颜色属性

表示属性支持的元素
color应用于使用以下元素的场景
fill
stroke
stop-color
flood-color
lighting-color

可见性属性

表示属性支持的元素
display图形元素
文本内容元素
<a>
<foreignObject>
<g>
<svg>
<switch>
visibility图形元素
文本内容元素

SVG CSS 属性

文本属性

表示属性支持的元素
alignment-baseline<textPath>
<tspan>
baseline-shift<textPath>
<tspan>
dominant-baseline文本内容元素
glyph-orientation-horizontal文本内容元素
glyph-orientation-vertical文本内容元素
kerning文本内容元素
text-anchor文本内容元素

裁剪属性

表示属性支持的元素
clip<foreignObject>
<image>
<marker>
<pattern>
<svg>
<symbol>
clip-path容器元素
图形元素
clip-rule<clipPath>

蒙版属性

表示属性支持的元素
mask容器元素
图形元素
opacity图形元素
<a>
<defs>
<g>
<marker>
<pattern>
<svg>
<switch>
<symbol>

滤镜效果

表示属性支持的元素
enable-background容器元素
filter容器元素
图形元素
flood-color<feFlood>
flood-opacity<feFlood>
lighting-color<feDiffuseLighting>
<feSpecularLighting>

渐变属性

表示属性支持的元素
stop-color<stop>
stop-opacity<stop>

交互属性

表示属性支持的元素
pointer-events图形元素

颜色属性

表示属性支持的元素
color-profile引用栅格图像的 <image>

绘制属性

表示属性支持的元素
color-interpolation容器元素
图形元素
color-interpolation-filters滤镜基元元素
color-rendering容器元素
图形元素
fill形状元素
文本内容元素
fill-rule形状元素
文本内容元素
fill-opacity形状元素
文本内容元素
image-rendering<image>
marker<line>
<path>
<polygon>
<polyline>
marker-start<line>
<path>
<polygon>
<polyline>
marker-mid<line>
<path>
<polygon>
<polyline>
marker-end<line>
<path>
<polygon>
<polyline>
shape-rendering形状元素
stroke形状元素
文本内容元素
stroke-dasharray形状元素
文本内容元素
stroke-dashoffset形状元素
文本内容元素
stroke-linecap形状元素
文本内容元素
stroke-linejoin形状元素
文本内容元素
stroke-miterlimit形状元素
文本内容元素
stroke-opacity形状元素
文本内容元素
stroke-width形状元素
文本内容元素
text-rendering<text>

SVG 2

虽然表示属性可以作为 CSS 属性来为 SVG 设置样式,但是如何使用 CSS 控制 SVG 元素的坐标和尺寸呢?SVG 2(在撰写本文时处于候选推荐阶段)使得对这些属性进行样式设置和动画成为可能。

SVG 2 规范指出

一些样式属性不仅可以在样式表和“style”属性中指定,还可以通过表示属性指定。这些属性的名称与给定的 CSS 属性匹配(或类似),并且其值会被解析为该属性的值。”

这不仅意味着可以使用 CSS 作为表示属性或在样式表中为 SVG 属性设置样式,还可以应用于 CSS 伪类,例如 :hover:active

SVG 2 还引入了更多可以用作样式属性的表示属性。这些属性可以在SVG 2 规范中找到。

特定元素的属性

需要注意的是,并非每个 SVG 元素都支持相同的 CSS 属性。就像可以应用于某些 SVG 元素的 CSS 属性一样,某些 SVG 元素也支持特定的属性。

例如,<circle><ellipse> 元素支持 cxcy 属性作为形状中心的坐标。该元素还支持 rxry 属性作为半径,但 <rect> 元素不能使用这些属性。

几何属性

在 SVG 2 中,诸如 rxry 之类的属性被定义为几何属性。几何属性可以用作 CSS 属性,就像 fillstroke 属性等表示属性一样。这些 CSS 属性和相应的 SVG 元素包括

SVG 元素几何属性
<circle>cx
cy
r
<ellipse>cx
cy
rx
ry
<rect>rx
ry
height
width
x
y
<path>path
<image>height
width
x
y
<foreignObject>height
width
x
y
<svg>height
width
x
y

定位 SVG 元素

SVG 2 还使得可以使用 CSS 定位 SVG 元素成为可能。让我们从绘制一个具有以下 SVG 代码的矩形开始

<svg width="170" height="170">
  <rect x="10" y="10" width="150" height="150" />
</svg>

以及以下 CSS 代码

rect {
  fill: #6e40aa;
}

这将生成一个坐标设置为 10, 10 的矩形。使用 SVG 2,xy 可以作为 CSS 属性应用。

/* This will work with SVG 2 */
rect {
  x: 10;
  y: 10;
  ...
}

SVG 代码将简化为以下代码

<svg width="170" height="170">
  <rect width="150" height="150" />
</svg>

你甚至可以使用 CSS 为 <rect> 元素设置 widthheight,如下所示

rect {
  ...
  width: 150px;
  height: 150px;
  ...
}

这样,SVG 标记就只剩下以下代码了

<svg width="170" height="170">
  <rect />
</svg>

在撰写本文时,以下演示在 Blink(例如 Chrome 和 Opera)和 WebKit(例如 Safari)浏览器中可以正常工作,因为这些浏览器支持 SVG 2 功能。在此之前,让我们深入了解如何使用 CSS 覆盖 SVG 属性。

SVG 形状变形

可以使用 CSS 覆盖该元素以创建形状变形。

相互变形的 SVG 路径必须具有相同的命令和相同数量的点,否则变形将无法正常工作。

让我们从绘制一个三角形形状的 <path> 元素开始。使用 d 属性将指定该元素的形状。

<svg height="220" width="300">
  <path d="M150 10 L40 200 L260 200Z" />
</svg>

为了使三角形变形为不同的形状,让我们使用 CSS 中的 d 属性覆盖 SVG 元素。

path {
  d: path("M150, 10 L40, 200 L260, 200Z");
  fill: #4c6edb;
}

让我们也为该属性添加一个 :active 伪类,以便在单击该元素时,形状将变形为正方形并更改其 fill 颜色。我们还添加一个 transition 属性,使形状变形动作看起来更平滑。以下是 CSS 代码:

path:active {
  d: path("M150, 10 L40, 200 L260, 200 L260, 200Z");
  fill: #4c6edb;
  transition: all 0.35s ease;
}

SVG 代码将是

<svg height="220" width="300">
  <path />
</svg>

想要另一个演示?这是 Chris Coyier 提供的一个很酷的演示,展示了悬停时 SVG 形状的变形!

为 SVG 属性添加动画

可以使用 CSS 动画和过渡通过 CSS 为 SVG 属性添加动画。

在这个演示中,我们将绘制各种 SVG 元素并创建一个波浪动画。首先绘制五个 <circle> 元素。

<svg width="350" height="250">
  <circle class="shape" />
  <circle class="shape" />
  <circle class="shape" />
  <circle class="shape" />
  <circle class="shape" />
</svg>

我们将使用 CSS 变量和 :nth-child() CSS 伪类来定义每个 .shape 类。.shape 类将具有 50 的 cy 和 20 的 r。每个 .shape 类都将设置其自己的 cxfill CSS 属性。

:root {
  --color-1: #6e40aa;
  --color-2: #4c6edb;
  --color-3: #24aad8;
  --color-4: #1ac7c2;
  --color-5: #1ddea3;
}

.shape {
  cy: 50;
  r: 20;
}

.shape:nth-child(1) {
  cx: 60;
  fill: var(--color-1);
}

.shape:nth-child(2) {
  cx: 120;
  fill: var(--color-2);
}

.shape:nth-child(3) {
  cx: 180;
  fill: var(--color-3);
}

.shape:nth-child(4) {
  cx: 240;
  fill: var(--color-4);
}

.shape:nth-child(5) {
  cx: 300;
  fill: var(--color-5);
}

到目前为止,它应该看起来像这样。

现在是时候添加动画了!首先使用 @keyframes 规则来定义 moveCircle 动画。

@keyframes moveCircle {
  50% {
    cy: 150;
    r: 13;
  }
}

这将使每个元素的 cy 坐标从 50 更改为 150,r 从 20 更改为 13。将以下内容添加到 .shape 类的 CSS 中以使动画无限循环。

.shape {
  ...
  animation: moveCircle 1250ms ease-in-out both infinite;
}

最后,为每个 .shape 类添加 animation-delay 到 CSS 中,除了 .shape:nth-child(1),如下所示

.shape:nth-child(2) {
  ...
  animation-delay: 100ms;
}

.shape:nth-child(3) {
  ...
  animation-delay: 200ms;
}

.shape:nth-child(4) {
  ...
  animation-delay: 300ms;
}

.shape:nth-child(5) {
  ...
  animation-delay: 400ms;
}

SVG <pattern> 元素中的形状也可以使用 CSS 设置动画。这是 Dudley Storey 提供的一个很酷的演示,展示了这一点!

总结

由于 SVG 1.1 是当前标准,因此目前只有少数浏览器支持 SVG 2 功能。不建议将这些技术投入生产环境。SVG 2 实现目前处于候选推荐阶段,因此未来使用 CSS 为 SVG 几何属性设置样式的支持应该会有所改进。