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

news/2024/9/28 7:19:22

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

使用场景

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

image

<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> 标签重新实现一次,代码如下:

<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> 案例 - 创建可重复使用图案,在线预览

image

参考资料

Patterns - SVG:可缩放矢量图形 | MDN

<pattern> – SVG: Scalable Vector Graphics | MDN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/45774.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

软件工具推荐-1数据库客户端-dbeaver

官网 https://dbeaver.io/ 免费社区版本 免费版本,功能齐全,支持各种数据库 其他包含TDengine这类时序数据, 功能非常强大,增删改查无需写sql,谁用谁便利 but,也许,可能,会使你失去写sql的能力,另一方面也反应了他的可视化功能非常强大 常用基本操作基本不能写sql

4.13 拔掉网线后, 原本的 TCP 连接还存在吗? (转载)

4.13 拔掉网线后, 原本的 TCP 连接还存在吗? 大家好,我是小林。 今天,聊一个有趣的问题:拔掉网线几秒,再插回去,原本的 TCP 连接还存在吗? 可能有的同学会说,网线都被拔掉了,那说明物理层被断开了,那在上层的传输层理应也会断开,所以原本的 TCP 连接就不会存在的了…

Angular cli 父传子,子传父,服务Service, @input,@output,@ViewChild 装饰器的简单使用,看这一篇就够了

直接code 1:Angular cli 创建组件componentng g component components\rightng g c wave 简写需要定位到根路径下即可创建组件Could not find an NgModule. Use the skip-import option to skip importing in NgModule. PS C:\myAngulrDemos\20240428demo\mydemo01\src> c…

业务数据脱敏

业务数据脱敏 一、什么是数据脱敏 先来看看什么是数据脱敏?数据脱敏也叫数据的去隐私化,在我们给定脱敏规则和策略的情况下,对敏感数据比如 手机号、银行卡号 等信息,进行转换或者修改的一种技术手段,防止敏感数据直接在不可靠的环境下使用。 像政府、医疗行业、金融机构、…

面试官问:Kafka 会不会丢消息?怎么处理的?

作者:Java3y链接:https://www.zhihu.com/question/628325953/answer/3281764326来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。面试官:今天我想问下,你觉得Kafka会丢数据吗? 候选者:嗯,使用Kafka时,有可能会有以下场景会丢消息 候选…

kafka 如何保证不重复消费又不丢失数据?

作者:Java3y链接:https://www.zhihu.com/question/483747691/answer/2392949203来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。面试官:今天我想问下,你觉得Kafka会丢数据吗? 候选者:嗯,使用Kafka时,有可能会有以下场景会丢消息 候选…

Angular 兄弟组件之间的传值

Angular 兄弟组件之间的传值 在Angular中,兄弟组件之间直接传递数据并不直接支持,但可以通过以下几种方式实现通信:1 使用服务(Service):创建一个服务,用于存储和管理需要共享的数据。在这个服务中定义一个BehaviorSubject或ReplaySubject(来自rxjs库),这些是可观察的对…