使用 Vue 绘制 SVG 图形

发布于 2022-06-03 21:08:03 字数 2803 浏览 1324 评论 0

SVG 是一种矢量图形格式。 SVG 有两个简洁的特性,使它们非常适合 Web 应用程序:

  1. 因为 SVG 是基于矢量的,所以您可以将 SVG 缩放到任意大小,而不会降低质量,也不会更改文件大小。 在文件大小相同的情况下,您的 SVG 在 1000×1000 和 100×100 看起来一样好。
  2. .svg文件是看起来很像 HTML 的文本文件。 您可以直接在 HTML 中嵌入 SVG,无需 img标签。

阴阳符号的 SVG 版本 Wikimedia commons

<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="-40 -40 80 80">
  <circle r="39"/>
  <path d="M0,38a38,38 0 0 1 0,-76a19,19 0 0 1 0,38a19,19 0 0 0 0,38" fill="#fff"/>
  <circle cy="19" r="5" fill="#fff"/>
  <circle cy="-19" r="5"/>
</svg>

从 Vue 控制 SVG

因为 svg是一个有效的 HTML 标签,你可以使用 Vue 控制 SVG 图像。 例如,以下脚本具有复选框,可让您摆脱符号的阴(黑色)或阳(白色)侧:

const app = new Vue({
  data: () => ({
    yin: true,
    yang: true
  }),
  template: `
    <div>
      <div>
        <div>
          <input type="checkbox" v-model="yin"> Yin
        </div>
        <div>
          <input type="checkbox" v-model="yang"> Yang
        </div>
      </div>
      <svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="-40 -40 80 80">
        <circle r="39" v-if="yin"/>
        <circle r="39" v-if="yang && !yin" fill="#fff" />
        <path d="M0,38a38,38 0 0 1 0,-76a19,19 0 0 1 0,38a19,19 0 0 0 0,38" fill="#fff" v-if="yang" />
        <circle v-if="yang" cy="19" r="5" fill="#fff"/>
        <circle v-if="yin" cy="-19" r="5"/>
      </svg>
    </div>
  `
}).$mount('#content');

条形图

SVG 的一个巧妙应用是轻量级图形和图表。 对于许多应用程序,从原始 SVG 构建您自己的图表有点过于复杂,但您可能会在某些专门的用例中看到手工构建的 SVG 可视化。

例如,下面是如何使用 Vue 绘制一个基本折线图,表示从 2020 年 8 月 17 日到 2020 年 8 月 21 日苹果股票的收盘价。

const app = new Vue({
  data: () => ({
    points: [
      { date: '2020-08-17', price: 114.61 },
      { date: '2020-08-19', price: 115.56 },
      { date: '2020-08-20', price: 115.71 },
      { date: '2020-08-21', price: 118.28 },
      { date: '2020-08-22', price: 124.37 },
    ]
  }),
  computed: {
    pointsAsPolyline: function() {
      return this.points.map((p, i) => `${i * 20} ${p.price}`).join(' ');
    }
  },
  template: `
  <div>
    <svg viewBox="0 0 500 100">
      <polyline
        fill="none"
        stroke="#0074d9"
        stroke-width="3"
        v-bind:points="pointsAsPolyline"/>
    </svg>
  </div>
  `
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

唱一曲作罢

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

qq_Yqvrrd

文章 0 评论 0

2503248646

文章 0 评论 0

浮生未歇

文章 0 评论 0

养猫人

文章 0 评论 0

第七度阳光i

文章 0 评论 0

新雨望断虹

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文