SVG 入门指北(二)

SVG 相关概念

本节中所提及的概念非常重要,他是 SVG 的基础,在应用中经常可以看到。需要仔细理解揣摩。

画布

画布无限大,可以在任何位置绘制内容。

视窗(viewport)

在使用 SVG 展示内容时,其实是在通过一个视窗在看画布上的东西。就比如我们透过窗户(视窗)看天空(画布),看到的那一小片天空,叫做视野。随意改变窗户的大小不是一件容易的事,但是可以通过<svg />的属性 widthheight 来随意改变视窗的宽高。就算不手动设置,浏览器通常也会有默认值。

html 复制代码
<!--
在 100px * 100px 的视窗内,以画布的(0,0)点(画布的原点和视窗的原点默认对齐)为圆心画半径为 40 的圆,填充色绿色
-->
<svg width="100" height="100">
  <circle cx='0' cy="0" r="40" fill="green" />
</svg>


See the Pen <a href="https://codepen.io/healerlzh/pen/wvRWVQm"> SVG - default hidden</a> by Healer (<a href="https://codepen.io/healerlzh">@healerlzh</a>) on <a href="https://codepen.io">CodePen</a>.

现实中,透过窗户的视野是有限的。SVG 也一样,所有超出视窗的内容默认不可见,它是通过 SVG 的默认样式overflow: hidden来实现的。所以可以通过设置overflow: visible让超出视窗边界的内容变得可见。

视野(viewBox)

上文我们说透过窗户看到的那片天空是我们视野。在SVG中我们可以选定画布上的任意位置任意大小的内容来放到视窗中做为我们的视野。换句话说,它不像现实中窗外的视野那样总是看那么大范围看那些东西,SVG可以让我们透过有限的视窗,看到画布上任意位置任意大小的内容,这就是SVG viewBox的作用。viewBox 属性的值是一个包含 4 个参数的列表 min-x,min-y,width,height,以空格或者逗号分隔开,min-xmin-y 决定了 viewBox 的左上角,widthheight 决定了 viewBox 的宽和高。注意 widthheight 如果设置成 0 ,会禁止元素的渲染。

在视窗一节中,我们通过设置overflow: visible 来显示完整的圆。现在我们使用移动视野的方式来实现。

html 复制代码
<svg width="100" height="100" viewBox="-40 -40 100 100">
  <circle cx='0' cy="0" r="40" fill="green" />
</svg>


See the Pen <a href="https://codepen.io/healerlzh/pen/RwEGYBo"> SVG - viewBox equal ratio</a> by Healer (<a href="https://codepen.io/healerlzh">@healerlzh</a>) on <a href="https://codepen.io">CodePen</a>.

viewBox 就很像一个取景器,将我们设定坐标范围中的内容呈现在视窗中。 这里视窗与视野大小一致,所展示的内容大小不变。 设置viewBox="-40 -40 80 80"视野小于视窗 ,内容铺到 100 的视窗中被放大 (这里不做图解和案例了,发挥空间想象)。 设置viewBox="-40 -40 200 200"视野大于于视窗 ,内容铺到 100 的视窗中被缩小(同上)。

保持纵横比(preserveAspectRatio)

本文为了循序渐进的讲述,上述的案例中视窗与视野的宽高定义总是等比的。现实总是那么不尽人意,如果宽高比不一样,那么视野铺到视窗中的时候,SVG 图形就可能发生变形。由此我们需要preserveAspectRatio(保持纵横比)

preserveAspectRatio="align [meetOrSlice]"

  • align 是否保持纵横比,以及视野与视窗如何对齐

    可选值 说明
    none 不保持纵横比
    xMinYMin 保持纵横比。 横向左侧对齐,纵向顶部对齐。
    xMidYMin 保持纵横比。 横向局中对齐,纵向顶部对齐。
    xMaxYMin 保持纵横比。 横向右侧对齐,纵向顶部对齐。
    xMinYMid 保持纵横比。 横向左侧对齐,纵向局中对齐。
    xMidYMid (默认值) 保持纵横比。纵横局中对齐。
    xMaxYMid 保持纵横比。横向右侧对齐,纵向局中对齐。
    xMinYMax 保持纵横比。横向左侧对齐,纵向底部对齐。
    xMidYMax 保持纵横比。横向局中对齐,纵向底部对齐。
    xMaxYMax 保持纵横比。横向右侧对齐,纵向底部对齐。
  • meetOrSlice [可选参数] 如何保持纵横比。align值为none时,此参数无效。

    可选值 说明
    meet (默认值) 保持纵横比缩放视野以适应视窗,能展现视野全部内容。类似background-size: contain
    slice 保持纵横比并放大比例小的方向适应视窗,可能视野展示不全。类似background-size: cover

整两个示例?

See the Pen <a href="https://codepen.io/healerlzh/pen/NWebeZX"> SVG - preserveAspectRatio</a> by Healer (<a href="https://codepen.io/healerlzh">@healerlzh</a>) on <a href="https://codepen.io">CodePen</a>.

相关推荐
子兮曰6 小时前
Bun v1.3.14 深度解析:Image API、HTTP/3、全局虚拟存储与五十项变革
前端·后端·bun
kyriewen7 小时前
今天,百年巨头一次砍了9200人,而一个离职科学家的实话让全网睡不着觉
前端·openai·ai编程
问心无愧05137 小时前
ctf show web 入门42
android·前端·android studio
kyriewen8 小时前
老板逼我上AI,我偷偷在浏览器里跑LLaMA,省下20万API费
前端·react.js·llm
Beginner x_u8 小时前
前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组
前端·数组·数组转树·数组扁平化
KaMeidebaby8 小时前
卡梅德生物技术快报|禽类成纤维细胞 FISH 实验:鸟类性别染色体基因定位技术实现与数据验证
前端·数据库·其他·百度·新浪微博
天若有情6738 小时前
前端高阶性能优化:跳出传统懒加载与预加载,基于用户行为做轻量预判加载
前端·性能优化
小小小小宇8 小时前
前端转后端:SQL 是什么
前端
张元清9 小时前
React Observer Hooks:7 种监听 DOM 而不写样板代码的方式
前端·javascript·面试
广州华水科技9 小时前
单北斗GNSS变形监测是什么?主要有怎样的应用与优势?
前端