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轴与水平方向顺时针方向夹 ...
随机推荐
- [FAQ] Solidity 合约销毁 ?
仅创建者可以销毁合约的示例: address public owner; // When deploy contract constructor() public { owner = msg.send ...
- SpringCloud + Seata1.5.0(使用docker安装配置Seata;数据存储mysql、配置中心与注册中心nacos)
1.seata介绍 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分 ...
- Oracle和达梦:获取表是否被锁定
1.获取表是否被锁定 select "V$SESSIONS".SESS_ID,"V$SESSIONS".SQL_TEXT,"V$SESSIONS&qu ...
- SAP Adobe Form 几种文本类型
前文: SAP Adobe Form 教程一 简单示例 SAP Adobe Form 教程二 表 SAP Adobe Form 教程三 日期,时间,floating field SAP Adobe F ...
- 21°C的冬天
2023-12-08 16:15:36 星期五 标题没有在胡说,今天穿着初秋的衣服还嫌热,尤其是蒋震图书馆的空调更是燥热. 明天就去考教资面试了,但是一点也没有学习的兴趣,今天下午四点就写完了这周所有 ...
- kali使用apt-get update 出现数字签名失效
kali使用apt-get update 出现数字签名失效 下载签名:wget archive.kali.org/archive-key.asc 安装签名:apt-key add archive-ke ...
- layui.js
目录 用法: 1.在base.js里导入layui插件 2.在使用的html页面里引入 base.js lucky.js index.html 用法: 1.在base.js里导入layui插件 2.在 ...
- Java 获取两个时间的时间差
前言 在平时的工作中,难免会遇到获取两个时间相差多少天.小时.分钟.秒.毫秒,现在我将自己获取的方法总结如下: 一.导入需要的依赖 <dependency> <groupId> ...
- mysql,左连接 ,查询右表为null的写法,删除,带join条件的写法
select * from sale_guest sg left join sale_bill sbon sg.bill_id=sb.id where sg.gmt_create>'2023-1 ...
- WPF 中使用附加属性解决 PasswordBox 的数据绑定问题
1.前言 在 WPF 开发中 View 中的数据展示我们常通过 Binding 进行绑定.但是,使用 Binding 有一个前提:绑定的目标只能是依赖属性. 而 PasswordBox 控件中的 Pa ...