SVG学习(一)

概念:

SVG 是一种基于 XML 语法的图像格式,全称是可缩放矢量图(Scalable Vector Graphics)。其他图像格式都是基于像素处理的,SVG 则是属于对图像的形状描述,所以它本质上是文本文件,体积较小,且不管放大多少倍都不会失真。SVG严格遵从XML语法,并用文本格式的描述性语言来描述图像内容。

注: 矢量图位图的区别
矢量图也称为面向对象的图像或绘图图像,繁体版本上称之为向量图,是计算机图形学中用点、直线或者多边形等基于数学方程的几何图元表示图像。矢量图形最大的优点是无论放大、缩小或旋转等不会失真;最大的缺点是难以表现色彩层次丰富的逼真图像效果。

位图亦称为点阵图像或栅格图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。文件类型有.bmp、.pcx、.gif、.jpg、*.tif等

区别:
1、位图表现的色彩比较丰富,可以表现出色彩丰富的图象。而矢量图形色彩不丰富,无法表现逼真的实物,矢量图常常用来表示标识、图标、Logo等简单直接的图像。
2、文件大小: 由于位图表现的色彩比较丰富,所以占用的空间会很大,颜色信息越多,占用空间越大,图像越清晰,占用空间越大;由于矢量图形表现的图像颜色比较单一,所以所占用的空间会很小。(不是对比同一文件的大小)
3、最大的区别,矢量图形与分辨率无关,可以将它缩放到任意大小和以任意分辨率在输出设备上打印出来,都不会影响清晰度,而位图是由一个一个像素点产生,当放大图像时,像素点也放大了,但每个像素点表示的颜色是单一的,所以在位图放大后就会出现平时所见到的马赛克状。

对比图:

WechatIMG260.png

1. 呈现方式

  • SVG 文件可以内嵌到网页中,成为 DOM 的一部分

      <html>
      <head></head>
      <body>
      <svg id="mysvg"
          xmlns="http://www.w3.org/2000/svg"
          version="1.1"
          viewBox="0 0 800 600"
          preserveAspectRatio="xMidYMid meet">
          <circle id="mycircle" cx="400" cy="300" r="50"  />
      </svg>
      </body>
      </html>
    
  • 独立SVG文件
    把文本文件保存成以svg为扩展名的文件,例如sun.svg,这样的文件可以直接用浏览器打开浏览,或者用<img>、<object>、<embed>、<iframe>等标签插入网页。

    <img src="./img/circle.svg">
    

    或者

    .icon {
         background: url("./img/circle.svg");
     }
    

2. 文档元素介绍

  • svg标签
    svg 代码都放在顶层标签<svg>之中
    viewBox属性的值有四个数字,分别是左上角的横坐标和纵坐标、视口的宽度和高度
    width属性和height属性: em,ex,px,pt,pc,cm,mm等长度还可以使用"%"
    svg图像默认大小是300像素(宽) x 150像素(高)。
      <svg width="300" height="100">   
        <circle cx="100" cy="100" r="50" style="stroke: black; fill: red;"/>
      </svg>
    
    注:请注意开头的部分xml声明,与svg的命名空间xmlns、版本version等部分,主要是考虑兼容性的问题;这些部分在HTML5中基本都可以不用写了。

(一)基本图形元素

  • 圆 circle
    fill: 填充色
    stroke: 描边色
    stroke-width:边框粗细
    stroke-linecap: 在开放子路径被设置描边的情况下,用于开放自路径两端的形状
    stroke-dasharray: 创建虚线

    <circle cx="50" cy="50" r="50" fill="red" stroke="rgb(0,0,0)" stroke-width="3" />
    
  • 椭圆 ellipse

    <ellipse cx="60" cy="60" ry="40" rx="20" stroke="black" stroke-width="5" fill="silver"/>
    
  • 直线 line

    <line x1="0" y1="0" x2="200" y2="0" style="stroke:rgb(0,0,0);stroke-width:5" />
    
  • 折线 polyline

     <polyline points="3,3 30,28 3,53"  fill="none" stroke="black" />
    
  • 矩形 rect

    <rect x="0" y="0" height="100" width="200" style="stroke: #70d5dd; fill: #dd524b" />
    
  • 多边形 polygon

    <polygon fill="green" stroke="orange" stroke-width="1" points="830,130 900,130 900,200 830,200 850,150"/>
    
  • 路径 path 是最通用,最强力的元素了;使用这个元素你可以实现任何其他的图形,不仅包括上面这些基本形状,也可以实现像贝塞尔曲线那样的复杂形状。这个元素控制位置和形状的只有一个参数d。
    d:一系列绘制指令和绘制参数(点)组合成。绘制指令分为绝对坐标指令和相对坐标指令两种,这两种指令使用的字母是一样的,就是大小写不一样,绝对指令使用大写字母,坐标也是绝对坐标;相对指令使用对应的小写字母,点的坐标表示的都是偏移量。
    M:移动到(moveto)将画笔移动到点(x,y)
    L:画直线到(lineto) 画笔从当前的点绘制线段到点(x,y)
    H: 画笔从当前的点绘制水平线段到点(x,y0)
    V: 画笔从当前的点绘制竖直线段到点(x0,y)
    A: 画笔从当前的点绘制一段圆弧到点(x,y)
    C: 参数: x1 y1, x2 y2, x y 画笔从当前的点绘制一段三次贝塞尔曲线到点(x,y)
    S: 参数: x2 y2, x y 特殊版本的三次贝塞尔曲线(省略第一个控制点)
    Q: 参数: x1 y1, x y 绘制二次贝塞尔曲线到点(x,y)
    T: 参数: x1 y1, x y 绘制二次贝塞尔曲线到点(x,y)
    Z:闭合路径

    <path d="
      M 18,3
      L 46,3
      L 46,40
      L 61,40
      L 32,68
      L 3,40
      L 18,40
      Z
    "></path>
    

    备注: 贝塞尔曲线是概念?可以去看看相关文章,本质是给定几个点(一般是4个)可以画出一条曲线。

  • 文本 text

    <text x="50" y="25">Hello World</text>
    

(二)解释性元素 desc元素与title元素
这两个元素都是辅助性的元素,用于解释相关情境;它们的内容都是文本。当SVG文档被渲染的时候,这2个元素不会被渲染到图形中。这个2个元素之间差别不是太大,title在有些实现中是作为提示信息出现的,所以通常title是放到父元素的第一个位置上。

(三)结构元素

  • 组合 g元素
    g元素是一种容器,它组合一组相关的图形元素成为一个整体。这样,我们就可以对这个整体进行操作。这个元素通常可以和desc和title元素配合使用,提供文档的结构信息。结构良好的文档通常可读性和渲染效率都不错。

     <svg width="300" height="100">  
       <g id="group">
          <g id="myCircle1" fill="#53a600">
             <text x="25" y="20">圆形</text>
             <circle cx="50" cy="50" r="20"/>
           </g>
           <g id="myCircle2" fill="#ccc">
              <text x="25" y="20">圆形</text>
              <circle cx="50" cy="50" r="20"/>
           </g>
       </g>
     </svg>
    

注: g元素是可以嵌套, 组合起来的图形元素就和单个的元素一样,可以给id值,这样,需要的时候(例如动画和重用一组元素)只用引用这个id值就可以了, 组合一组图形元素可以统一设置这组元素的相关属性(fill,stroke,transform等)。

  • 模板 symbol元素
    symbol元素用于定义图形模板(模板可以包含很多图形),这个模板可以被use元素实例化。模板的功能与g元素很相似,都是提供一组图形对象,但是也有一些区别。与g元素不同的地方是:
      1.symbol元素本身是不会被渲染的,只有symbol模板的实例会被渲染。
      2.symbol元素可以拥有属性viewBox和preserveAspectRatio,这些允许symbol缩放图形元素。
    <svg xmlns="http://www.w3.org/2000/svg"
       version="1.1" width="5cm" height="5cm">
      <desc>One group of two rectangles</desc>
      <symbol id="group1" fill="red">
        <rect x="10" y="10" width="100" height="60"/>
        <rect x="120" y="10" width="50" height="50"/>
       </symbol>
      <use href="#group1">
    </svg>
    
  • 定义 defs元素
    SVG允许定义一组对象,然后重用这组对象(注意,不仅仅是图形对象)。最常见的例子如定义渐变色,然后再其他的图形对象中赋给fill属性。渐变色定义的时候是不会渲染的,所以这类型的对象可以放到任何地方。重用对于图形对象中也是经常存在的,而且我们也不希望定义的时候直接渲染,而是想在引用的地方渲染,这个可以用defs元素实现
    定义渐变色:
    <svg width="100" height="200">
      <defs>
        <linearGradient id="Gradient01">
          <stop offset="20%" stop-color="#39F" />
          <stop offset="90%" stop-color="#F3F" />
        </linearGradient>
      </defs>
      <rect x="1cm" y="1cm" width="6cm" height="1cm" fill="url(#Gradient01)"  />
    </svg>
    
    图形:
    <svg width="100" height="200">
       <defs>
           <rect id="MyRect" width="60" height="10"/>
        </defs>
        <use x="20" y="10" href="#MyRect" />
    </svg>
    

注意区别:其实作为容器对象的g元素、symbol元素、defs元素都不同程度上提供了重用的作用,只不过每个元素的特性可能少许不同:比如g元素是直接渲染的,symbol和defs不会直接渲染,symbol含有viewBox属性,会创建新的视窗。

  • use 复制一个形状
    href属性指定所要复制的节点,x属性和y属性是<use>左上角的坐标(在原图基础上的平移距离)。另外,还可以指定width和height坐标。
    <svg width="100" height="100">
      <circle id="myCircle" cx="5" cy="5" r="4"/>
      <use href="#myCircle" x="10" y="0" fill="blue" />
      <use href="#myCircle" x="20" y="0" fill="white" stroke="blue" />
    </svg>
    

渐变元素、阴影、动画等其他元素见下章

3、渲染顺序
SVG是严格按照定义元素的顺序来渲染的,这个与HTML靠z-index值来控制分层不一样。在SVG中,写在前面的元素先被渲染,写在后面的元素后被渲染。后渲染的元素会覆盖前面的元素,虽然有时候受透明度影响,看起来不是被覆盖的,但是SVG确实是严格按照先后顺序来渲染的。

To be continued...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354