SVG <pattern> 标签的用法和应用场景

通过使用 <pattern> 标签,可以在 SVG 图像内部定义可重复使用的任意图案。这些图案可以通过 fill 属性或 stroke 属性进行引用。

使用场景

例如我们要在 <svg> 中绘制大量的圆点点,可以通过重复使用 <circle> 标签来实现。

html 复制代码
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
  <circle cx="10" cy="10" r="2" fill="black" />
  <circle cx="30" cy="10" r="2" fill="black" />
  <circle cx="50" cy="10" r="2" fill="black" />
  <circle cx="70" cy="10" r="2" fill="black" />
  <circle cx="90" cy="10" r="2" fill="black" />

  <circle cx="10" cy="30" r="2" fill="black" />
  <circle cx="30" cy="30" r="2" fill="black" />
  <circle cx="50" cy="30" r="2" fill="black" />
  <circle cx="70" cy="30" r="2" fill="black" />
  <circle cx="90" cy="30" r="2" fill="black" />

  <circle cx="10" cy="50" r="2" fill="black" />
  <circle cx="30" cy="50" r="2" fill="black" />
  <circle cx="50" cy="50" r="2" fill="black" />
  <circle cx="70" cy="50" r="2" fill="black" />
  <circle cx="90" cy="50" r="2" fill="black" />

  <circle cx="10" cy="70" r="2" fill="black" />
  <circle cx="30" cy="70" r="2" fill="black" />
  <circle cx="50" cy="70" r="2" fill="black" />
  <circle cx="70" cy="70" r="2" fill="black" />
  <circle cx="90" cy="70" r="2" fill="black" />

  <circle cx="10" cy="90" r="2" fill="black" />
  <circle cx="30" cy="90" r="2" fill="black" />
  <circle cx="50" cy="90" r="2" fill="black" />
  <circle cx="70" cy="90" r="2" fill="black" />
  <circle cx="90" cy="90" r="2" fill="black" />
</svg>

这种方法不好的地方在于,需要为每个点都创建一个 <circle> 标签,它们除了坐标不一致之外,其它属性都是相同的,大量代码都是冗余的

这种情况正好就是 <pattern> 标签能够大显身手的地方。

使用方法

使用 <pattern> 标签的基本步骤如下:

  1. <defs> 标签内定义 <pattern>
  2. 通过元素的 strokefill 属性引用定义好的图案。

定义 <pattern> 最初看起来可能有些复杂,但实际上它仅仅是绘制一些形状或路径而已。你可以把它想象成一个可从外部重复引用的 <svg> 标签。

<pattern> 可使用的一些属性

  • viewBox : 用数值列表指定图案视口边界,默认为 none
  • x : 以长度或百分比指定图案的X坐标,默认为 0
  • width : 指定图案宽度,默认为 0
  • height : 指定图案高度,默认为 0
  • href : 要重用现有图案时,指定 id,默认为 none
  • patternContentUnits : 指定图案坐标系统,可选值为 userSpaceOnUse(SVG坐标)或objectBoundingBox(相对于形状),默认为 userSpaceOnUse。若设置了 viewBox,此属性无效。
  • patternTransform : 如需对图案应用变换(如旋转 rotate(45) ),在此指定,默认为 none
  • patternUnits : 指定 xywidthheight 值所使用的坐标单位,可选 userSpaceOnUseobjectBoundingBox,默认为 objectBoundingBox
  • preserveAspectRatio : 定义当图案应用于具有不同长宽比的图形时的处理方式,可选值包括 nonexMinYMinxMidYMinxMaxYMinxMinYMidxMidYMidxMaxYMidxMinYMaxxMidYMaxxMaxYMax 等,并可附加 meet(保持比例填充)或 slice(可截断),默认为 xMidYMid meet

我们再以上面的点状图案为例,使用 <pattern> 标签重新实现一次,代码如下:

html 复制代码
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <pattern id="dotPattern" width="20" height="20" patternUnits="userSpaceOnUse">
      <circle cx="10" cy="10" r="2" fill="black" />
    </pattern>
  </defs>
  <rect width="100" height="100" fill="url(#dotPattern)" />
</svg>

此时代码看起来比上面那一版要简洁多了,尽管坐标计算稍微复杂一些,但这种方式的可读性比上一版要好很多。

案例演示

SVG <pattern> 案例 - 创建可重复使用图案,在线预览

参考资料

Patterns - SVG:可缩放矢量图形 | MDN
<pattern> -- SVG: Scalable Vector Graphics | MDN

相关推荐
E_ICEBLUE1 天前
PPT 批量转图片:在 Web 预览中实现翻页效果(C#/VB.NET)
c#·powerpoint·svg
Highcharts.js1 天前
如何使用Highcharts SVG渲染器?
开发语言·javascript·python·svg·highcharts·渲染器
谜亚星1 个月前
SVG学习(五)
前端·svg
harrain1 个月前
前端svg精微操作局部动态改变呈现工程网架状态程度可视播放效果
前端·svg·工程网架图
我真的叫奥运1 个月前
scss mixin svg 颜色控制 以及与 png 方案对比讨论
前端·svg
harrain1 个月前
html里引入使用svg的方法
前端·svg
咬人喵喵1 个月前
SVG 答题类互动模板汇总(共 16 种/来自 E2 编辑器)
编辑器·svg·e2 编辑器
咬人喵喵1 个月前
16 类春节核心 SVG 交互方案拆解(E2 编辑器实战)
前端·css·编辑器·交互·svg
李少兄1 个月前
简单讲讲 SVG:前端开发中的矢量图形
前端·svg
咬人喵喵1 个月前
文生图:AI 是怎么把文字变成画的?
人工智能·编辑器·svg