可视化系列讲解:SVG创建及使用方式

6 篇文章 0 订阅
6 篇文章 0 订阅


一、SVG是什么?

◼ SVG 全称为(Scalable Vector Graphics),即可缩放矢量图形。(矢量定义:既有大小又有方向的量。在物理学中称作矢
量,如一个带箭头线段:长度表示大小,箭头表示方向;在数学中称作向量。在计算机中,矢量图可无限放大而不变形)
◼ SVG 是一种基于XML格式的矢量图,主要用于定义二维图形,支持交互和动画
◼ SVG 规范是万维网联盟(W3C) 自 1998 年以来开发的标准。
◼ SVG 图像可在不损失质量的情况下按比例缩放,并支持压缩。
◼ 基于XML的SVG可轻松的用文本编辑器或矢量图形编辑器创建和编辑,并可以直接在浏览器显示。

二、SVG 优点与缺点

2.1 优点

扩展好:矢量图像在浏览器中放大缩小不会失真,可被许多设备和浏览器中使用。而光栅图像(PNG 、JPG)放大缩小会失真
矢量图像是基于矢量的点、线、形状和数学公式来构建的图形,该图形是没有像素的,放大缩小是不会失真的。
光栅图像是由像素点构建的图像——微小的彩色方块,大量像素点可以形成高清图像,比如照片。图像像素越多,质量越高。)
灵活:SVG是W3C开发的标准,可结合其它的语言和技术一起使用,包括 CSS、JavaScript、 HTML 和 SMIL 。SVG图像可以
直接使用JS和CSS进行操作,使用时非常方便和灵活,因为SVG也是可集成到 DOM 中的。
可以动画:SVG 图像可以使用 JS 、 CSS 和 SMIL 进行动画处理。对于 Web 开发人员来说非常的友好。
轻量级:与其它格式相比,SVG 图像的尺寸非常小。根据图像的不同,PNG 图像质量可能是 SVG 图像的 50 倍。
可打印:SVG 图像可以以任何分辨率打印,而不会损失图像质量。
利于SEO:SVG 图像被搜索引擎索引。因此,SVG 图像非常适合 SEO(搜索引擎优化)目的。
可压缩:与其它图像格式一样,SVG 文件支持压缩。
易于编辑:只需一个文本编辑器就可以创建 SVG 图像。设计师通常会使用 Adobe Illustrator (AI)等矢量图形

2.2 缺点

不适和高清图片制作:SVG 格式非常适合用于徽标和图标(ICON)等 2D 图形,但不适用于高清图片,不适合进行像素级操作。SVG 的图像无法显示与标准图像格式一样多的细节,因为它们是使用点和路径而不是像素来渲染的
◼ SVG 图像变得复杂时,加载会比较慢
不适用于 IE8 及更低版本的旧版浏览器:(这都淘汰了,可以忽略)

三、SVG的应用场景

◼ 适合显示矢量徽标(Logo)、图标(ICON)和其他几何设计。
◼ SVG 适合应用在
需适配多种尺寸的屏幕
上展示,因为SVG的扩展性更好。
◼ 当需要创建简单的动画时(SVG 可以与 JS 交互来制作线条动画、过渡和其他复杂的动画,SVG 可以与 CSS 动画交互,也可以使用自己内置的 SMIL 动画。)
◼ SVG 也非常适合制作各种图表(条形图、折线图、饼图、散点图等等),以及大屏可视化页面开发。

四、SVG 和 Canvas的区别

  1. 可扩展性:
    ◼ SVG 是基于矢量的点、线、形状和数学公式来构建的图形,该图形是没有像素的,放大缩小不会失真
    ◼ Canvas 是由一个个像素点构成的图形,放大会使图形变得颗粒状和像素化(模糊)。
    ◼ SVG可以在任何分辨率下以高质量的打印。Canvas 不适合在任意分辨率下打印。
  2. 渲染能力:
    ◼ 当 SVG 很复杂时,它的渲染就会变得很慢,因为在很大程度上去使用 DOM 时,渲染会变得很慢。
    ◼ Canvas 提供了高性能的渲染和更快的图形处理能力,例如:适合制作H5小游戏
    ◼ 当图像中具有大量元素时,SVG 文件的大小会增长得更快(导致DOM变得复杂),而Canvas并不会增加太多。
  3. 灵活度:
    ◼ SVG 可以通过JavaScript 和 CSS 进行修改,用SVG来创建动画和制作特效非常方便。
    ◼ Canvas只能通过JavaScript进行修改,创建动画得一帧帧重绘。
  4. 使用场景:
    ◼ Canvas 主要用于游戏开发、绘制图形、复杂照片的合成,以及对图片进行像素级别的操作,如:取色器、复古照片
    ◼ SVG 非常适合显示矢量徽标(Logo)、图标(ICON)和其他几何设计。

五、SVG的创建方式

方式一

在一个单独的svg文件中绘制,svg文件可直接在浏览器预览或嵌入到HTML中使用(推荐)

// svg 1.0版本  创建一个.svg的文件
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg
  version="1.0"
  baseProfile="full"
  width="300"
  height="150"
  xmlns="http://www.w3.org/2000/svg"
  style="border:1px solid pink"
>
  <rect x="0" y="0" width="100" height="50"></rect>
</svg>

// svg 2.0版本  创建一个.svg的文件
<?xml version="1.0" standalone="no" ?>
<svg
  width="300"
  height="150"
  xmlns="http://www.w3.org/2000/svg"
  style="border:1px solid pink"
>
  <rect x="0" y="0" width="100" height="50"></rect>
</svg>

方式二

使用AI(Adobe IIIustractor)矢量绘图工具来绘制矢量图,并导出为svg文件(推荐)

方式三

直接在HTML文件中使用svg元素来绘制(推荐)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <!-- 1.0版本 -->
  <svg
    version="1.0"
    baseProfile="full"
    width="100"
    height="100"
  >
    <rect x="0" y="0" width="100" height="100"></rect>
  </svg>

  <!-- 2.0版本 -->
  <svg
    width="100"
    height="100"
    xmlns="http://www.w3.org/2000/svg"
  >
    <rect x="0" y="0" width="100" height="100"></rect>
  </svg>

  <!-- 2.0版本简写 -->
  <!-- 不写宽高 默认w300 h150 -->
  <svg>
    <rect x="0" y="0" width="100" height="100"></rect>
  </svg>
  
</body>
</html>

方式四

直接使用JavaScript代码来生成svg矢量图。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script>
    // 1.命名空间(使用js创建这个必须写)
    const xmlns = "http://www.w3.org/2000/svg";

    // 2.创建SVG元素
    let svgEl = document.createElementNS(xmlns, "svg");
    let rectEl = document.createElementNS(xmlns, "rect");

    // 3.给SVG元素添加属性
    svgEl.setAttributeNS(null, "version", "1.1");
    svgEl.setAttributeNS(null, "width", 300);
    svgEl.setAttributeNS(null, "height", 150);
    svgEl.style.border = "1px solid pink";

    rectEl.setAttributeNS(null, "width", 100);
    rectEl.setAttributeNS(null, "height", 40);

    // 4.把SVG元素插入到DOM中
    svgEl.appendChild(rectEl);
    document.body.appendChild(svgEl);
  </script>
</body>
</html>

六、SVG的使用方式

方式一

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <img src="你的svg文件地址">
</body>
</html>

方式二

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        width: 300px;
        height: 150px;
        background-image: url(你的svg文件地址);
        background-repeat: no-repeat;
      }
    </style>
  </head>
  <body>
    <div class="box"></div>
  </body>
</html>

方式三

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <svg
  width="300"
  height="150"
  style="background:pink"
>
  <rect x="10" y="10" width="100" height="50"></rect>
</svg>
</body>
</html>

方式四

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    
    <object data="你的svg文件地址" type="image/svg+xml"></object>
  </body>
</html>

方式五

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <iframe src="你的svg文件地址"></iframe>
  </body>
</html>

方式六

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <embed src="你的svg文件地址" type="image/svg+xml">
  </body>
</html>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个利用D3设计交互式图表的实战示例,供您参考: ```javascript // 定义数据 var dataset = [ { name: "A", value: 10 }, { name: "B", value: 20 }, { name: "C", value: 30 }, { name: "D", value: 40 }, { name: "E", value: 50 } ]; // 创建SVG画布 var svg = d3.select("body") .append("svg") .attr("width", 500) .attr("height", 300); // 创建饼图 var pie = d3.pie() .sort(null) .value(function(d) { return d.value; }); var path = d3.arc() .outerRadius(100) .innerRadius(0); var label = d3.arc() .outerRadius(120) .innerRadius(120); var arc = svg.selectAll(".arc") .data(pie(dataset)) .enter() .append("g") .attr("class", "arc") .attr("transform", "translate(200,150)"); arc.append("path") .attr("d", path) .attr("fill", function(d) { return d3.schemeCategory10[d.index]; }) // 添加交互 .on("mouseover", function(d) { d3.select(this) .transition() .duration(500) .attr("d", d3.arc() .outerRadius(120) .innerRadius(0) ); }) .on("mouseout", function(d) { d3.select(this) .transition() .duration(500) .attr("d", path); }); arc.append("text") .attr("transform", function(d) { return "translate(" + label.centroid(d) + ")"; }) .attr("text-anchor", "middle") .text(function(d) { return d.data.name; }); // 添加图例 var legend = svg.selectAll(".legend") .data(dataset) .enter() .append("g") .attr("class", "legend") .attr("transform", function(d, i) { return "translate(320," + (i * 20 + 100) + ")"; }); legend.append("rect") .attr("x", 0) .attr("y", 0) .attr("width", 18) .attr("height", 18) .attr("fill", function(d, i) { return d3.schemeCategory10[i]; }); legend.append("text") .attr("x", 24) .attr("y", 9) .attr("dy", ".35em") .text(function(d) { return d.name; }); ``` 这个示例创建了一个饼图,使用了D3的pie、arc和centroid等方法。每个扇形上方都添加了一个文本标签,显示对应的名称。同时,每个扇形都添加了交互事件,当鼠标悬停时变成大圆环,鼠标移开时恢复为正常大小。另外,还添加了一个图例,显示对应颜色和名称。 希望这个示例能够帮助您了解如何使用D3设计交互式图表。您可以根据实际需求修改代码,并尝试添加更多的交互事件和图表类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值