用了那么久的 SVG,你还没有入门吗?(二)

简介: 用了那么久的 SVG,你还没有入门吗?

路径命令

路径命令是对要绘制的路径的说明,每一个命令由代表命令的字母和代表参数的 数字 组成,SVG 定义了六种路径命令类型,一共 20 条命令。

  • 移动到:Mm
  • 画线至:LlHhVv
  • 三次方贝塞尔曲线:CcSs
  • 二次方贝塞尔曲线:QqTt
  • 椭圆曲线:Aa
  • 封闭路径:Zz

不难发现命令是区分大小写的(即大小写敏感),大写 的命令指定 绝对坐标小写 命令指定 相对坐标(相对当前位置的)。

命令中的数字可以使用 负数 形式,只不过代表的意思不同:

  • 角度 而言 负数 表示是 逆时针
  • 绝对坐标 中,-x-y 均表示为负坐标
  • 相对坐标 中,-x 值为 向左 移动,负的 -y 值为 向上 移动

MoveTo 命令

顾名思义,就是指从 当前点 移动到 下一点,即从 当前位置(Po {xo, yo}) 移动到 新位置(Pn {xn, yn}),并且 PnPo 之间不会绘制连接线:

  • M 绝对坐标,将当前位置移动到坐标 x,y
  • m 相对坐标,将当前位置沿 x 轴移动 dx,沿 y 轴移动 dy,即Pn = { xo + dx, yo + dy }
<svg>
    <path
      fill="none"
      stroke="#f40"
      stroke-width="10"
      d="M 10,10 h 30
      m  0,10 h 30
      m  0,10 h 30
      M 40,20 h 30
      m  0,10 h 30
      m  0,10 h 30
      m  0,10 h 30
      m  -30,10 h 30
      m  -60,10 h 30
      m  -60,10 h 30
      m  -60,10 h 30
      m  -60,10 h 30"
    />
</svg>
复制代码

image.png

Lineto 命令

Lineto 指令将绘制一条直线段,从 当前位置 (Po { xo, yo }) 移到 **指定位置(Pn { xn, yn })指定位置(Pn) 将变成下一个命令中的 当前位置(Po)

  • L 在 当前位置 和 指定位置 x,y 之间绘制 一条线段
  • Po = Pn = { x, y }
  • I 在 当前位置 和 指定位置 x,y 之间绘制 一条线段,指定位置 为 当前位置 沿 x 轴偏移 dx、沿 y 轴偏移 dy
  • Po = Pn = { xo + dx, yo + dy }
  • H 在 当前位置 与 指定位置 之间绘制一条 水平线段,指定位置 由 x 参数 和 当前位置的 y 坐标指定
  • Po = Pn = { x, yo }
  • h 在 当前位置 与 指定位置 之间绘制一条 水平线段,指定位置 由 当前位置 沿 x 轴偏移 dxx 坐标 和 当前位置 的 y 坐标指定
  • Po = Pn = { xo + dx, yo }
  • V 在 当前位置 与 指定位置 之间绘制一条 垂直线段,指定位置 由 y 参数和 当前位置 的 x 坐标指定
  • Po = Pn = { xo, y }
  • v 在 当前位置 与 指定位置 之间绘制一条 垂直线段,指定位置 由 当前位置 沿 y 轴偏移 dyy 坐标 和 当前位置 的 x 坐标指定
  • 即  Po = Pn = { x, yo + dy }
<svg>
    <path
      fill="none"
      stroke="#f40"
      stroke-width="10"
      d="M 10,10
      L 100,100
      V 10
      H 30"
    />
</svg>
复制代码

image.png

三次贝塞尔曲线

三次贝塞尔曲线 是使用 四个点 定义的平滑曲线,绘制完成后 终点(Pn) 将成为下一个命令中的 当前位置(Po)

  • 起始点(当前位置) —  第一个点
    (Po = {xo, yo})
  • 终点 —  第二个点
    (Pn = {xn, yn})
  • 起始控制点 —  第三个点
    (*Pcs* = {xcs, ycs})(控制在起点附近的曲线的曲率)
  • 终点控制点  —  第四个点
    (Pce = {xce, yce})(控制在终点附近的曲线的曲率)

其对应的命令如下:

  • C
  • 当前位置终点 x,y 之间绘制一条三次贝塞尔曲线,起始控制点 通过 x1,y1 指定,终点控制点 通过 x2,y2 指定
  • 参数形式为 (x1,y1, x2,y2, x,y),各点表示 Po = Pn = {x, y}; Pcs = {x1, y1};Pce = {x2, y2}
  • c
  • 当前位置终点(当前位置沿 x 轴偏移 dx、沿 y 轴偏移 dy 处)之间绘制一条三次贝塞尔曲线,起始控制点 为当前位置沿 x 轴偏移 dx1、沿 y 轴偏移 dy1 处;终点控制点 为当前位置沿 x 轴偏移 dx2、沿 y 轴偏移 dy2 处
  • 参数形式为 (dx1,dy1, dx2,dy2, dx,dy),各点表示 Po = Pn = {xo + dx, yo + dy} ;Pcs = {xo + dx1, yo + dy1} ;Pce = {xo + dx2, yo + dy2}
  • S
  • 当前位置终点 x,y 之间绘制一条平滑的三次贝塞尔曲线,终点控制点 通过 x2,y2 指定,起始控制点 是上一条曲线命令的终点控制点在当前位置上的 反射点;若上一条命令不是曲线命令,则其与曲线的 起始点(当前位置) 相同
  • 参数形式为 (x2,y2, x,y)
  • s
  • 当前位置终点(当前位置沿 x 轴偏移 dx、沿 y 轴偏移 dy 处)之间绘制一条平滑的三次贝塞尔曲线,终点控制点 为当前位置沿 x 轴偏移 dx2、沿 y 轴偏移 dy2 处;起始控制点 是上一条曲线命令的终点控制点在当前位置上的 反射点;若上一条命令不是曲线命令,则其与曲线的 起始点(当前位置) 相同
  • 参数形式为 (dx2,dy2, dx,dy)
<svg>
    <path
      fill="none"
      stroke="red"
      d="M 10,90
       C 30,90 25,10 50,10
       S 70,90 90,90"
    />
    <path
      fill="none"
      stroke="red"
      d="M 110,90
       c 20,0 15,-80 40,-80
       s 20,80 40,80"
    />
</svg>
复制代码

image.png

二次贝塞尔曲线

二次贝塞尔曲线是使用 三个点 定义的平滑曲线,绘制完成后** 终点(Pn)** 将成为下一个命令中的 当前位置(Po)

  • 起始点(当前位置)
    Po = {xo, yo} — 第一个点
  • 终点
    Pn = {xn, yn} — 第二个点
  • 控制点  — 第三个点
    Pc = {xc, yc}(控制曲率)

其对应命令如下:

  • Q
  • 当前位置终点 x,y 之间绘制一条二次贝塞尔曲线,控制点 通过 x1,y1 指定
  • 参数形式为 (x1,y1, x,y),各点表示 Po = Pn = {x, y} ;Pc = {x1, y1}
  • q
  • 当前位置终点(当前位置沿 x 轴偏移 dx、沿 y 轴偏移 dy 处)之间绘制一条二次贝塞尔曲线,控制点 为 当前位置(曲线的起始点)沿 x 轴偏移 dx1、沿 y 轴偏移 dy1 处
  • 参数形式为 (dx1,dy1, dx,dy),各点表示 Po = Pn = {xo + dx, yo + dy} ;Pc = {xo + dx1, yo + dy1}
  • T
  • 当前位置终点 x,y 之间绘制一条平滑的二次贝塞尔曲线,控制点 是上一条曲线命令的控制点在当前位置上的 反射点;若上一条命令不是曲线命令,则其与曲线的 起始点(当前位置) 相同
  • 参数形式为 (x, y),各点表示 Po = Pn = {x, y}
  • t
  • 当前位置终点(当前位置沿 x 轴偏移 dx、沿 y 轴偏移 dy 处)之间绘制一条平滑的二次贝塞尔曲线,控制点 是上一条曲线命令的控制点在当前位置上的 反射点;若上一条命令不是曲线命令,则其与曲线的 起始点(当前位置) 相同
  • 参数形式为 (dx, dy),各点表示 Po = Pn = {xo + dx, yo + dy}
<svg>
    <path
      fill="none"
      stroke="red"
      d="M 10,50
       Q 25,25 40,50
       t 30,0 30,0 30,0 30,0 30,0"
    />
</svg>
复制代码

image.png

椭圆曲线

椭圆曲线 实际上就是用来定义为椭圆的一部分的曲线,当需要绘制 高度规则的曲线 时使用 椭圆曲线 相比于 贝塞尔曲线 会更容易:

  • A
  • 当前位置坐标 x,y 之间绘制一条椭圆曲线,用于绘制圆弧的椭圆中心根据命令的其他参数确定,参数形式 (rx ry angle large-arc-flag sweep-flag x y)
  • 坐标 x,y 将成为下一个命令中的当前位置
  • a
  • 当前位置指定位置 之间绘制一条椭圆曲线,指定位置 为当前位置沿 x 轴偏移 dx、沿 y 轴偏移 dy 处,用于绘制圆弧的椭圆中心根据命令的其他参数确定,参数形式 (rx ry angle large-arc-flag sweep-flag dx dy)
  • 坐标 dx,dy 将成为下一个命令中的当前位置

A 和 a 共同参数表示如下:

  • rxry 是椭圆的两个半径
  • angle 表示椭圆相对于 x 轴的旋转角度
  • large-arc-flagsweep-flag 允许选择必须绘制的弧线,因为其他参数可以绘制 4 条可能的弧线
  • large-arc-flag 允许选择 一个 大弧线(1)或 一个 小弧线(0)
  • sweep-flag 允许选择一条 顺时针 旋转的 弧线(1)或一条 逆时针 旋转的 弧线(0)
<svg stroke-width="4">
    <path
      fill="none"
      stroke="red"
      d="M 150,50
       A 150 50 10 1 0 14,10"
    />
    <path
      fill="none"
      stroke="lime"
      d="M 150,50
       A 150 50 10 1 1 14,10"
    />
    <path
      fill="none"
      stroke="purple"
      d="M 150,50
       A 150 50 10 0 1 14,10"
    />
    <path
      fill="none"
      stroke="pink"
      d="M 150,50
       A 150 50 10 0 0 14,10"
    />
 </svg>
复制代码

image.png

ClosePath

ClosePath 命令将从 当前位置 绘制一条 直线 到 路径中的 第一个点,其对应的命令为 Z 或 z,没有什么参数,并且大小写不敏感。

<svg stroke-width="3">
    <path
      fill="pink"
      stroke="red"
      d="M 150,50
       l -10,50 80,0
       z"
    />
</svg>
复制代码

image.png

image.png

基础案例实践

由于文章篇幅有限,第一个案例会说得细一些,后续的案例就不再一一详细分析了。

环形进度条

这个应该是比较常见的一个需求了,但是如果不让使用组件库你打算怎么实现?

要是没有了解 SVG 之前,恐怕连这么个看似简单的效果都不好实现,但是现在我们可以借助 SVG 来实现,或者我们先来看看组件库是怎么实现的:

image.png

以上是 ElementUi 中的实现,没错就是 SVG ,现在你知道其实你项目里一直都有在用 SVG 了吧!

简单分析

  • 整体可以看成是 两个圆形 重叠,因此可以通过 <circle> 元素实现(也可以选择 <path>元素,如上述给出的例图)
  • <circle> 元素默认是会绘制整个圆,但是进度条肯定不是一开始就是 100% 的,因此可以使用 stroke-dashoffset 属性 来将完整的圆变成部分的,但是直接使用 stroke-dashoffset 属性是不会生效的,因为它要配合 stroke-dasharray 属性 一起来使用
  • stroke-dashoffset:指定 dash 模式 到 路径开始 的距离
  • stroke-dasharray:控制用来描边的 点划线 的图案范式,其实你完全可以结合 border: 1px solid dash 来理解,就是用于将一段连续的内容变成非连续的,设置了它就开启了 dash 模式

静态实现

<svg stroke-width="5">
    <!-- 背景圆形 -->
    <circle cx="150" cy="75" r="50" stroke="#ebeef5" fill="none"></circle>
    <!-- 进度条 -->
    <circle
      class="process-circle"
      cx="150"
      cy="75"
      r="50"
      stroke="#20a0ff"
      transform="rotate(-90 150 75)"
      fill="none"
      stroke-dasharray="314"
      stroke-dashoffset="314"
    ></circle>
</svg>
复制代码

image.png



目录
相关文章
|
存储 弹性计算 数据中心
倚天产品介绍|倚天710平台稳定性-内存隔离降级运行
本文介绍利用倚天710平台的RAS特性,实现OS降级运行,提高系统稳定性
|
数据采集 机器学习/深度学习 人工智能
大数据分析案例-用RFM模型对客户价值分析(聚类)
大数据分析案例-用RFM模型对客户价值分析(聚类)
2008 0
大数据分析案例-用RFM模型对客户价值分析(聚类)
|
存储 网络协议 编译器
探索C++14新特性:更强大、更高效的编程
探索C++14新特性:更强大、更高效的编程
探索C++14新特性:更强大、更高效的编程
|
开发者
用D3制作矩形式树状结构图(Treemapping)并设计动画效果
矩形式树状结构图一般可以简称为Treemapping。Treemapping的各种制作方法网络上已经流行了许久,但是鲜有人在此之上有创作新意的,我在此基础上制作了一些动画效果供大家参考
904 0
|
Java Linux 测试技术
JMeter的运行
JMeter是一款基于Java的压力测试工具,适用于Windows、Mac及Linux系统。运行JMeter需Java 8及以上版本,建议至少1GB内存。用户可通过双击bin目录下的jmeter.bat/.sh文件或命令行启动。其主界面包括文件、编辑、查找、运行、选项与帮助等菜单,支持测试计划的创建、编辑与执行,并提供详细的帮助文档。正确配置环境变量可简化启动流程。
|
SQL 存储 Oracle
关系型数据库查询数据的语句
本文介绍了关系型数据库中的基本SQL查询语句,包括选择所有或特定列、带条件查询、排序、分组、过滤分组、表连接、限制记录数及子查询。SQL还支持窗口函数、存储过程等高级功能,是高效管理数据库的关键。建议深入学习SQL及相应数据库系统文档。
280 2
|
网络协议 Shell Linux
【Shell 命令集合 网络通讯 】⭐Linux 远程登录工具 telnet 命令 使用指南
【Shell 命令集合 网络通讯 】⭐Linux 远程登录工具 telnet 命令 使用指南
524 0
|
Java 应用服务中间件 API
深入解析Java Servlet技术在Web开发中的应用
深入解析Java Servlet技术在Web开发中的应用
433 1
|
存储 缓存 运维
计算机网络:性能指标
计算机网络:性能指标
884 3
|
机器学习/深度学习 搜索推荐 算法
智能推荐系统有哪些特点?
智能推荐系统是在大数据的基础上,基于用户的兴趣进行个性化推荐,并且对用户和商品之间的交互信息进行持续监测和反馈,并不断优化推荐系统,从而提高用户体验、丰富平台内容、提高商业价值。 在智能推荐系统的加持下,内容生产从以“编辑推荐”为核心变成以“用户喜好”为核心。智能推荐系统不仅可以帮助平台筛选优质内容,还可以通过对用户数据的持续分析,挖掘出更多潜在需求。