SVG和Canvas

SVG

SVG,即可缩放矢量图形(Scalable Vector Graphics),是一种 XML 应用,可以以一种简洁、可移植的形式表示图形信息。

SVG 主要可以概括为以下几点:

  • SVG 指可伸缩矢量图形

  • SVG 用来定义网络的基于矢量的图形

  • SVG 使用 XML 格式定义图形

  • SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失

  • SVG 是万维网联盟的标准

  • SVG 与诸如 DOM 和 XSL 之类的 W3C 标准是一个整体

SVG使用

第一种:<embed />标签

<embed src="circle1.svg" type="image/svg+xml" />

第二种:<object />标签

<object data="circle1.svg" type="image/svg+xml"></object>

第三种:<iframe />标签

<iframe src="circle1.svg"></iframe>

也可以使用a标签,链接到SVG文件。

<a href="circle1.svg">View SVG file</a>

浏览器是能够直接展示SVG的标签的。

<svg width="100%" height="100%">
    <rect width="300" height="100"style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,0)"/>
<svg/>

SVG语法

SVG标签

SVG代码都放在顶层标签<svg>之中。

<svg width="100%" height="100%">
<circle id="mycircle" cx="50" cy="50" r="50""/></svg>

width属性和height属性,制定了SVG图像在HTML元素中所占据的宽度和高度。除了相对单位,也可以采用绝对单位(单位∶像素)。如果不指定这两个属性,SVG图像默认大小是300像素(宽)*150像素(高)。

如果只想展示SVG图像的一部分,就要指定viewBox属性。

<svg width="100" height="100" viewBox="50 50 50 50"><circle id="mycircle" cx="50" cy="50" r="50""/>
</svg>

viewBox属性的值有四个数字,分别是左上角的横坐标和纵坐标、视口的高度和宽度。上面代码中,SVG图像是100像素宽*100像素高,viewBox属性指定视口从( 50,50 )这个点开始。所以,实际看到的是右下角的四分之一圆。

注意,视口必须适配所在的空间。上面代码中,视口的大小是50 50,由于SVG图像的大小是100 100,所以视口会放大去适配SVG图像的大小,即放大了四倍。

如果不指定width属性和height属性,只指定viewBox属性,则相当于只给到定SVG图像的长宽比。这时,SVG图像的默认大小将等于所在的HTML元素的大小。

  1. <circle>标签代表圆形。

<svg width="300"height="180">
    <circle cx="30" cy="50" r="25"/>
    <circle cx="90" cy="50" r="25" fill="red"/>
    <circle cx="150" cy="50"r="25" class="fancy"/>
</svg>

上面的代码定义了三个圆。<circle>标签的cx、cy、r属性分别为横坐标、纵坐标和半径,单位为像素。坐标都是相对于<svg>画布的左上角原点。class属性用来指定对应的CSS类。

.fancy {
    fi11: none;
    stroke: b1ack;
    stroke-width: 3pt;
}

SVG的CSS属性与网页元素有所不同。

  • fill:填充色

  • stroke:描边色

  • stroke-width:边框宽度

  1. <line>标签用来绘制直线。

<svg width="300" height="180">
    <line x1="0" y1="0" x2="200" y2="0" style="stroke:rgb(0,0,0)" stroke-width:"5"/>
</svg>

上面代码中,<line>标签的x1属性和y1属性,表示线段起点的横坐标和纵坐标11;x2属性和y2属性,表示线段终点的横坐标和纵坐标; style属性表示线段的样式。

  1. <polyline>标签用于绘制一根折线。

<svg width="300" height="180">
    <polyline points="3,3 30,28 3,53"fi71="none" stroke="black"/>
</svg>

<polyline>的points属性指定了每个端点的坐标,横坐标与纵坐标之间与逗号分隔,点与点之间用空格分隔。2.5<rect>标签

  1. <rect>标签用于绘制矩形。

<svg width="300" height="180">
    <rect x="o" y="o" height="100" width="200" style="stroke: #70d5dd; fi11: #dd524b"/>
</svg>

<rect>的x属性和y属性,指定了矩形左上角端点的横坐标和纵坐标;width属性和height属性指定了矩形的宽度和高度(单位像素)。

  1. <e1lipse>标签用于绘制椭圆。

<svg width="300" height="180">
    <e1lipse cx="60"cy="60" ry="40"rx="20" stroke="black" stroke-width="5" fi11="silver" />
</svg>

<e1lipse>的cx属性和cy属性,指定了椭圆中心的横坐标和纵坐标(单位像素); rx属性和ry属性,指定了椭圆横向轴和纵向轴的半径(单位像素)。

  1. <po1ygon>标签用于绘制多边形。

<svg width="300" height="180">
<polygon fil1="green" stroke="orange" stroke-width="1" points="0,0 100,0 100,100 0,1000,0"/>
</svg>

<polygon>的points属性指定了每个端点的坐标,横坐标与纵坐标之间与逗号分隔,点与点之间用空格分隔。

  1. <path>标签用于制路径。

<svg width="300" height="180">
    <path d="M18,3L46,3L 46,40L 61,40L 32,68L3,40L 18,40z"></path>
</svg>

<path>的d属性表示绘制顺序,它的值是一个长字符串,每个字母表示一个绘制动作,后面跟着坐标。

  • M = moveto 起始

  • L = lineto 连线

  • H = horizontal lineto 水平线

  • V = vertical lineto 垂直线

  • C = curveto 三次贝塞尔曲线

  • S = smooth curveto 三次贝塞尔曲线

  • Q = quadratic Bézier curve 二次贝塞尔曲线

  • T = smooth quadratic Bézier curveto 二次贝塞尔曲线

  • A = elliptical Arc 椭圆弧

  • Z = closepath 闭合(从最后一个点连直线到起始点)

    使用大写字母表示绝对位置,小写字母表示相对位置(相对于起点的位置,向右向下为正)。

  1. <text>标签用于绘制文本。

<svg width="300" height="180">
    <text x="50" y="25">He11o wor1d</text>
</svg>

x属性和y属性,表示文本区块基线( baseline )起点的横坐标和纵坐标。文字的样式可以用class或style属性指定。

  1. <use>标签用于复制一个形状。

<svg viewBox="0 0 30 10" xm71ns="http: / / www.w3.org/2000/svg">
    <circle id="mycircle" cx="5" cy="5" r="4"/>
    <use href="#myCircle" x="10" y="0"fi11="blue"/>
    <use href="#myCircle" x="20" y="O" fi11="white" stroke="blue"/>
</svg>

href属性指定所要复制的节点,x属性和y属性是左上角的坐标。另外,还可以指定width和height。

  1. <g>标签用于将多个形状组成一个组( group ),方便复用。

<svg width=" 300" height="100">
    <g id="myCircle">
        <text x="25" y="20"></text>
        <circle cx="50"cy="50" r="20" />
    </g>
    <use href="#myCircle" x="100"y="0" fi11="b1ue"/>
    <use href="#myCircle" x="200"y="0" fi11="white" stroke="blue"/>
</svg>                                    
  1. <defs>标签用于自定义形状,它的图形不会显示在页面上,仅供引用

<svg width="300" height="100">
    <defs>
        <g id="myCircle">
        <text x="25" y="20">圆形</text><circle cx="50" cy="50" r="20"/></g>
    </defs>
    <use href="#myCircle" x="0"y="0"/>
    <use href="#mycircle" x="100" y="0" fi11="blue"/>
    <use href="#myCircle" x="200" y="0" fi11="white" stroke="blue"/>
</svg>
  1. <pattern>标签用于自定义一个形状,该形状可以被引用来平铺一个区域。

<svg width="500" height="500">
    <defs>
        <pattern id="dots" x="0" y="o" width="100" height="100" patternUnits="userSpaceonuse">
        <circle fi11="#bee9e8" cx="50"cy="50"r="35"/></pattern>
    </defs>
    <rect x="O"y="o" width="100%" height="100%" fi11="ur1(#dots)"/>
</svg>

上面代码中,<pattern>标签将一个圆形定义为dots模式。patternUnits="userSpaceOnUse"表示<pattern>的宽度和长度是实际的像素值。然后,指定这个模式去填充下面的矩形。

  1. <image>标签用于插入图片文件。

<svg viewBox="0 0 100 100"width="100" height="100">
    <image xlink :href="path/to/image.jpg" width="50%" height="50%"/>
</svg>

上面代码中,<image>的xlink:href属性表示图像的来源。

  1. <animate>标签用于产生动画效果

<svg width="500px" height="500px">
    <rect x="0" y="0" width="100" height="100"fi11="#feac5e">
    <animate attributeName="x" from="o” to=""500"dur="2s" repeatcount="indefinite"/></rect>
</svg>

上面代码中,矩形会不断移动,产生动画效果。animate的属性含义如下。

  • attributeName:发生动画效果的属性名。

  • from:单次动画的初始值。

  • to:单次动画的结束值。

  • dur:单次动画的持续时间。

  • repeatCount:动画的循环模式。

可以在多个属性上面定义动画。

<animate attributeName="x" from="O" to="500" dur="2s" repeatCount="indefinite"/>
<animate attributeName="width" to="500"dur="2s" repeatCount="indefinite"/>
  1. <animate>标签对CSS的transform属性不起作用,如果需要变形,就要使用<animateTransform>标签。

<svg width="500px" height="500px">
    <rect x="250" y="250" width="50" height="50" fi71="#4bcOc8">
        <animateTransform attributeName="transform" type="rotate" begin="0s" dur="10s"from="0 200 200" to="360 400 400" repeatcount="indefinite"/>
    </rect>
</svg>

上面代码中,<animateTransform>的效果为旋转( rotate ),这时from和to属性值有三个数字,第一个数字是角度值,第二个值和第三个值是旋转中心的坐标。from="0 200200"表示开始时,角度为0,围绕(200,200)开始旋转; to=""360 400 400"表示结束时,角度为360,围绕(400,400)旋转。

JS操作

  1. DOM操作:获取标签,监听操作

  2. 如果使用iframe、object等形式引入的SVG,要SVG操作的话

var svgobject = document.getElementById( 'object ' ).contentDocument;
var svgiframe = document.getElementById('iframe ' ).contentDocument;
var svgEmbed = document.getElementById( ' embed ' ).getsVGDocument();

注意,如果使用<img>标签插入SVG文件,就无法获取SVG DOM。

Canvas

HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。画布是一个矩形区域,您可以控制其每一像素。canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。

 

SVG和Canvas

 SVGCanvas
特点 XML矢量图绘制 JS像素点(位图)绘制
性能 基于DOM,大量渲染会卡顿 基于画布,需要重绘,但是可以调用GPU
元素 多个元素 单个HTML元素
事件 基于DOM,可为某个元素触发事件 基于Canvas标签,像素点交互
简洁性 标签写法,可用CSS,书写简单 画笔描绘,相对复杂
posted @ 2023-05-10 11:04  Jacky02  阅读(34)  评论(0编辑  收藏  举报