SVG 元素重用

2019/04/10 | 2分钟阅读 | 更新于 2019/04/10

SVG 元素重用

封面是个 SVG 的像素问号,手写的 XML。做第一版时,是逐行用 <rect />,但是那样子看起来很傻。于是就找出可以重用的部分重新做了一个。

因为 SVG 不支持 SVG 2 所以原文及引用的做了一些修改。

首先是分解,因为左右对称,同时上半部分是 3/4 个圆形。所以可以拆成三部分。因为左上(称为 a)向下延伸了一个像素,所以右上(称为 b)也跟着延伸下来。而右下(称为 c)则和右上重叠。另外再用两个 2x2 的方块放在剩下的位置上。

b 是 a 的镜像,c 是 a 的旋转,就得到这么一个分解的结果:

将问号分解成小区域
将问号分解成小区域

SVG 如何重用一个元素?

<use />!简单粗暴

The element takes nodes from within the SVG document, and duplicates them somewhere else.

<svg> - SVG

另外 MDN 提到,从 SVG 2 开始,xlink:href 被废弃而直接使用 href1

<rect id="a" />
<use href="#a" />

那,镜像呢?

<use /> 可以使用 x,y 来进行定位。也可以使用 transform 来进行移动。transform 属性的值同 CSS 类似,但是可以叠加使用。

所以 scale 的参数如果是 -1 的话,就起到了镜像的效果。但是请想象一下在画图 / Photoshop 等工具中缩放图像,如果固定左边,拖动右边,向左缩小再放大之后,图片相当于同时做了平移和镜像两个操作。所以需要用 translate 补回来。

其它

SVG 可以通过 <g> 标签实现多个元素的整体上色和变换,很贴心。


  1. Safari 当前不支持 <use /> 的 href 属性,所以仍然需要 xlink:href。而后者则需要增加 xmlns:xlink="http://www.w3.org/1999/xlink",不然会得到“Namespace prefix xlink for href on use is not defined”的错误。 ↩︎

© 2026 香蕉引擎故障报告

🌱 Powered by Hugo with theme Dream.

关于

要怎么介绍自己呢,🤔。

很早以前是作为 Web 前端在学习的,但是工作第一年就成为了全干工程师。喜欢尝试各种东西,什么都会一点。

一直很喜欢 Ebiten 游戏引擎 ,特别简洁,用它做过一些小东西,可以查看这个分类 。另外特别推荐这个木鱼 ,是一个相对完整的小玩意儿,包含手搓的一个简单的 UI 框架;支持鼠标和键盘操作;有多语言和主题切换功能;同时支持 Web 端和客户端。它的源代码在 bin16/wooden-fish

主题

网站基于 Hugo,当前使用的是 hugo-theme-dream 主题的修改版 ,根据我的需要,做了一些对 PaperMod 的兼容。

我自己也写过主题 ,但是没有别人写的好看。

正在从我的笔记中往外搬运内容

等待更新:

  • 从《锈湖》中学了些什么东西
  • 我拿 React 写解谜游戏的经过
  • 基于 Pocketbase 的 Pocket Memos
  • 数独!