SVG <pattern> 标签的用法和应用场景
通过使用 <pattern> 标签,可以在 SVG 图像内部定义可重复使用的任意图案。这些图案可以通过 fill 属性或 stroke 属性进行引用。
使用场景
例如我们要在 <svg> 中绘制大量的圆点点,可以通过重复使用 <circle> 标签来实现。

<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> 标签的基本步骤如下:
- 在
<defs>标签内定义<pattern>。 - 通过元素的
stroke或fill属性引用定义好的图案。
定义 <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: 指定
x、y、width、height值所使用的坐标单位,可选userSpaceOnUse或objectBoundingBox,默认为objectBoundingBox。 - preserveAspectRatio: 定义当图案应用于具有不同长宽比的图形时的处理方式,可选值包括
none、xMinYMin、xMidYMin、xMaxYMin、xMinYMid、xMidYMid、xMaxYMid、xMinYMax、xMidYMax、xMaxYMax等,并可附加meet(保持比例填充)或slice(可截断),默认为xMidYMid meet。
我们再以上面的点状图案为例,使用 <pattern> 标签重新实现一次,代码如下:
<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> 案例 - 创建可重复使用图案,在线预览

参考资料
SVG <pattern> 标签的用法和应用场景的更多相关文章
- 今天我们谈一下HTML标签中的<map>标签的用法和使用场景
首先我们看下这个标签到底是干什么的! W3C的定义: 然后兼容性: 然后与之配套使用的另一个标签: <area/>规定其区域: 我们来看看<map>标签支不支持全局属性:=== ...
- SVG辅助标签
前面的话 本文将详细介绍SVG辅助标签 超链接 在SVG中,可以使用超链接<a>.超链接可以添加到任意的图形上,类比于热区<area> SVG中的超链接有如下3个常用属性 xl ...
- svg image标签降级技术
1.svg image标签降级技术: svg不能很好的在anroid2.3中得到支持,需要额外的补充,IE8-以及Android 2.3默认浏览器是不支持SVG的. svg image标签降级技术,这 ...
- Svn中的tag标签的用法和意义
使用场景: 假如你的项目的某个版本已经完成测试开发.测试并已经上线,接下来街道新的需求,新项目开发需要修改多个文件的代码,当需求已经开发一段时间的时候,突然接到用户和测试人员的反馈,项目中某个重大的b ...
- 灵魂代码分享HTML元素标签语义化及使用场景实用到爆
灵魂三问: 标签语义化是什么?为什么要标签语义化?标签语义化使用场景有哪些? 下面让我们跟着这三个问题来展开一下本文的内容. 一.标签语义化是什么? 标签语义化就是让元素标签做适当的事情.例如 p 标 ...
- 织梦dede文章列表调用标签的用法和规则
织梦dede列表标签在任何模板的网站中都可能会使用到,而且我们在仿站的时候也经常要使用到列表标签.这里主机吧就给大家讲一下文章列表以及图片列表.软件列表以及分类信息列表标签的用法,和结合div+css ...
- 理解SVG图片标签的viewport、viewBox、preserveAspectRatio缩放
一.viewport 表示SVG可见区域的大小,或者可以想象成舞台大小,画布大小. <svg width="></svg> 上面的SVG代码定义了一个视区,宽500单 ...
- django学习-14.sys.argv用法和使用场景
1.前言 sys是python自带的一个内置模块. "sys.argv[0]"的含义:表示代码本身所在的文件路径. sys.argv说白了就是一个从程序外部获取参数的桥梁,这个&q ...
- Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景
java的同步机制,大概是通过:1.synchronized:2.Object方法中的wait,notify:3.ThreadLocal机制来实现的, 其中synchronized有两种用法:1.对类 ...
- SVG Path标签 A 参数
A rx ry x-axis-rotation large-arc-flag sweep-flag x yrx:x轴半径ry:y轴半径x-axis-rotation:指椭圆的X轴与水平方向顺时针方向夹 ...
随机推荐
- pod QoS等级(A)
一.了解Pod Qos等级 一个节点不一定能提供所有pod所指定的资源limits之和那么多的资源量. 假设有两个pod,pod A使用了节点内存的 90%,pod B突然需要比之前更多的内存,这时节 ...
- Solution Set - NOI级别真题选做
[NOI2007] 社交网络 Link&Submission. key:Floyd Floyd求出任意两点间最短路,以及最短路的条数.求点 \(k\) 的答案时枚举所有点对 \(i,j\),若 ...
- 【web安全】隐藏nginx头文件信息
摘要 Nginx作为开源web中间件,被广泛应用.因此源编译或者yum安装,都会带有其原有的nginx版本.很容易被针对,因此,通过修改nginx的源码.隐藏nginx版本和头部信息,保障nginx的 ...
- NumPy 数组切片及数据类型介绍
NumPy 数组切片 NumPy 数组切片用于从数组中提取子集.它类似于 Python 中的列表切片,但支持多维数组. 一维数组切片 要从一维数组中提取子集,可以使用方括号 [] 并指定切片.切片由起 ...
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-44-鼠标操作-上篇
1.简介 前边文章中已经讲解过鼠标的拖拽操作,今天宏哥在这里对其的其他操作进行一个详细地介绍和讲解,然后对其中的一些比较常见的.重要的操作单独拿出来进行详细的介绍和讲解. 2.鼠标操作语法 鼠标操作介 ...
- goframe v2.1.0 gf-cli的使用
目录 1.视频教程 2.官方文档 3.下载 linux系统安装环境 windows系统安装环境 4.创建项目 5.启动项目 6.交叉编译 7.gen命令的使用 8.orm的操作 1.视频教程 http ...
- gin-vue-admin开发教程 01安装与启用
目录 目标 视频教程地址: 环境要求 前端环境安装文档: 安装node npm cnpm yarn(选装) 后端环境安装文档: Golang1.14.2 环境的安装 goland的配置 gin-vue ...
- 纯JavaScript制作动态增加的网页数字
看到别的网页上打开,会显示一个动态的数字,感觉这个效果增加了网页的灵动感.就尝试着写代码,最终实现的方法: 会从0增加到一个数值,实现的代码: <!-- html 部分 --> <d ...
- jupyter notebook无法找到自己的虚拟环境
1:打开cmd/Anaconda Prompt/Anaconda Powershell Prompt 2:进入虚拟环境conda activate 环境名 3:conda list查看有无ipyker ...
- 使用docker 5分钟搭建一个博客(mysql+WordPress)
目录 一.系统环境 二.前言 三.搭建博客 3.1 创建wordpress和mysql容器 3.2 在wordpress界面设置个人博客信息 3.3 WordPress容器创建命令的简化版本 一.系统 ...