前端福音:为什么使用 React 和 SVG 开发图形 UI 是天作之合?

本文讲述了如何在SVG中使用元素来定义绘图上下文,强调了viewport和ViewBox的重要性,这两个属性分别用于设定SVG元素在页面上的大小和可视区域,可通过调整它们实现图形的缩放和定位。
摘要由CSDN通过智能技术生成

所有的元素都尽在掌握


要使用 SVG 绘制内容,我们首先需要一个 < svg> 元素来定义绘图上下文,在其中将渲染所有后代元素。

我们的页面中可以有很多 < svg> 元素,每个元素描述一个孤立的绘图上下文。每个图标、图表或其他漂亮的图形小部件都搭配一个 < svg>。

另外,我们可以在同一个 < svg> 中创建许多图形组件,并在单个绘图上下文中创建整个 UI。

Viewport 和 ViewBox


< svg> 元素至少应指定它要占据多大的屏幕空间,也就是它的 viewport(视口)。这可以通过 CSS 样式或 width 和 height 属性来完成。

复制代码

我们一般也会指定一个 viewBox,以明确定义绘图的“用户空间”部分,这一部分在 viewport 中是可见的。

可以将 viewport 视为通向由 SVG(“用户空间”)定义的世界的窗口,并将 viewBox 视为缩放和平移的设置,它们决定你可以通过窗口看到用户空间的哪些部分。

viewBox 属性是一个字符串,其按顺序指定用户空间可视部分左上角的 x 和 y 坐标,以及 viewBox 的宽度和高度。

复制代码

例如,“-100 -100 200 200”就描述了一个正方形的 viewBox,高 200 个单位,宽 200 个单位,以(0,0)的原点为中心。

复制代码

如果我们没有明确指定,则 viewBox 的宽度和高度会和 viewport 一比一对应,并且用户空间原点(0,0)位于左上角。

重申一下:viewport 描述了 < svg> 元素在 HTML 页面中占据了多少空间。viewBox 描述了在该 viewport 中可见的那部分图像。通过更改 viewBox,我们可以放大或缩小 SVG 图像,或者显示出来完全不同的部分。

5976b8d03c0273d632476f07e512ca98.png

这两张 SVG 图像的唯一区别是 viewBox 和背景色

如果你的 SVG viewport 的比例(以像素为单位)与 viewBox 的比例不匹配,则默认行为是保留宽高比,居中显示,并使 viewBox 适应可用 viewport。可以通过更改 prepareAspectRatio 属性来控制此行为。

610bbc3724d4319166c0e36448e80caf.png

默认情况下,viewBox 将居中并“适应”SVG viewport

viewBox 和 viewport 之间的坐标系是分离的,这意味着在我们的 SVG 中,我们可以针对特定的绘制使用对应的坐标。

例如,如果我们正在绘制一个交互式小部件,则可以使用百分比来控制图像,并将 viewBox 设置为“0 0 100 100”来简化数学运算。

或者,如果我们的小部件是纵向对称的,并且我们想从中心开始绘制,则可以使用一个以原点(0,0)为中心的“-50 -50 100 100”viewBox。

c17f2328e42d63c35ff3af4db8235107.png

在这个文章系列中我们将绘制的是房间平面图,因此我们可以选择公制、英制或其他合适的度量系统。实际上我们要使用的是毫米单位,这样就可以只涉及整数运算了。

我们将使用一些简单的 JSON 描述平面图,房间的形状用房间各个角的坐标(按顺时针方向)来定义。

411488c984f52d45f8a9882d8275a0ec.png

现在我们可以设置 viewport 和 viewBox,在平面图周围留一点空隙,以免在 viewport 中太过拥挤。

复制代码

import data from ‘./floorplan-data.json’;const App = () => ( <svg width=“500px” height=“500px” viewBox=“-1000 -1000 14000 11000” style={{backgroundColor:‘blue’}} > // … floorplan components here … );

搞定 viewport 和 viewBox 后,就可以处理绘图工作了。

声明式图元


SVG 包含许多图元,既有简单的和,也有更灵活的。Mozilla Developer Network 有一篇参考资料介绍了这些可用元素。

形状可以被填充和 / 或描边。填充是在形状定义的边界内应用颜色,描边是对形状的轮廓应用颜色。描边的宽度和其他样式可以通过属性或 CSS 控制。

我们将使用两个简单的图元 < line> 和 < circle> 来绘制初始平面图。

< line> 描述一对 (x,y) 坐标之间的一条线段。

复制代码

< circle> 描述一个以 (cx,cy) 为中心,半径为 r 的圆。

复制代码

房间的视图


绘制我们的房间时,我们将数据传递到一个 Floorplan 组件中,该组件将渲染平面图的各种元素——一开始图上只有各个房间。

复制代码

const Floorplan = ({ data: { rooms } }) => ( rooms.map(r => <Room {…r} />));

要使用 Room 组件绘制墙壁,我们需要使用成对的连续角坐标,并将它们链接在一起以形成墙。例如,一个具有角 a、b、c 和 d 的矩形房间会有四面墙:(a-b),(b-c), (c-d), (d-a)。

我们可以使用一个简单的函数来提取这些坐标对,还可以把它们打包在一个 useMemo hook 中以实现高效的重渲染。

复制代码

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

给大家分享一些关于HTML的面试题,有需要的朋友可以戳这里获取,先到先得哦。


可以扫码获取!!(备注:前端)**

最后

给大家分享一些关于HTML的面试题,有需要的朋友可以戳这里获取,先到先得哦。

[外链图片转存中…(img-StD7LxII-1712649542143)]
[外链图片转存中…(img-n1zCNksv-1712649542143)]

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值