SVG简介及其用法

一、SVG - 基础

1.什么是SVG

   1) SVG是一种使用XML技术描述二维图形的语言,svg是一种矢量图

   2) 并不属于HTML5专有内容,在HTML5出现之前,就有SVG内容,HTML5只不过提供了SVG原生的内容

   3) svg文件的扩展名为.svg

2.SVG的优势

   1)可通过文本编辑器来创建和修改

   2)可被搜索引擎搜索到      ▲和canvas重要的区别

   3)SVG可在任何的分辨率下被高质量的打印   ▲

   4)可在图片质量不下降的情况下被放大   

   5)支持事件绑定   ▲

3.SVG与canvas的区别

     SVG - 实际开发中,多用SVG

      不依赖分辨率
      支持事件处理器
      不适合游戏
      大型渲染区域的程序(例如,百度地图)
      
     Canvas

     依赖分辨率
     不支持事件绑定
     最适合网页游戏
     可以用图片格式保存图像

     不管是SVG还是Canvas,在一个页面中都可以同时定义多个

4.用途

     静态绘制图形
     动态动画效果
     专门提供事件

5.svg再将来的工作开发,使用率并不高

     SVG图片一般都是由UI设计师来完成
     SVG即使是我们自己来设计,目前网络上有很多提供svg图片的网站
     使用JS库来 two.js

二、SVG-绘制图形

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Alone</title>
</head>


<body>
    <!--1.创建svg,支持css-->
    <svg style="width: 400px;height: 400px;background: pink;">
        
        <!--都是通过fill来设置背景色-->
        <!--矩形-->
        <rect id="rect" x="100" y="100" width="50" height="50" fill="orange" stroke="red" stroke-width="5" style="fill:yellow;"></rect>
        
        <!--圆-->
        <circle cx="50" cy="50" r="50" fill="orange" stroke="yellow" stroke-width="5"></circle>
        
        <!--椭圆-->
        <ellipse cx="100" cy="210" rx="80" ry="50" fill="yellow"></ellipse>
        
        <!--必须使用stroke设置线的颜色才能显示出来,只能设置直线,不能做折线-->
        <!--直线-->
        <line x1="0" y1="0" x2="400" y2="400" stroke="white"></line>
        
        <!--折线-->
        <!--会自动将折线包含的内容填充为黑色,但没闭合,使用fill将填充色设置为背景色-->
        <!--用折线绘制矩形在闭合时有bug-->
        <polyline points="100,20 20,100 200,200 100,20" stroke="red" stroke-width="10" fill="pink"></polyline>
        
        <!--绘制多边形-->
        <polygon points="100,350 20,100 200,200 100,350" stroke="red" stroke-width="10" fill="pink"></polyline>
    </svg>
    
    <script type="text/javascript">
        var rect = document.getElementById("rect");
        //因为svg绘制的内容都是dom元素,所以可以使用dom获取到,并给添加事件
        rect.onclick = function  () {
            alert("杨可儿大菜鸡");
        }
        //通过js设置图形的属性是无效的,因为这些是只读属性
        //rect.animVal.value = 50;
        
    </script>
</body>
</html>

三、SVG-渐变

1、 设置线性渐变步骤

   1)创建SVG元素

      <svg></svg>

   2)在svg里追加defs元素

      <svg>
         <defs></defs>
      </svg>

   3)在defs里追加linearGradient元素,他才是真正实现渐变的元素
      
      <svg>
         <defs>

           <linearGradient x1="" y1="" x2="" y2=""></linearGradient>

         </defs>
      </svg>

      x1、y1:起点坐标值
      x2、y2:终点坐标值

      注意: 这四个值都是百分比

   4)在linearGradient里面追加stop元素,stop元素真正设置渐变颜色

       <svg>
         <defs>
           <linearGradient>
              
              <stop offset="" stop-color="" stop-opacity="">
              <stop offset="" stop-color="">

           </linearGradient>
         </defs>
      </svg>

      offset: 值为百分比
      stop-color:设置渐变颜色
      stop-opacity:设置渐变颜色的透明度

   5)在defs下面追加<rect>,画出图形,并将上面设置的线性渐变,添加到矩形中

      使用fill属性,值为url(#渐变元素的id值)

      <rect x="0" y="0" width="400" height="400" fill="url(#def)">

2、 扇形渐变radialGradient,参考线性渐变
渐变例子
<svg style="width:400px;height:400px;">
        <!--
            svg渐变效果几个问题
            1.设置linearGradient的坐标值都得是百分比
            2.通过stop设置颜色,offset的值必须是百分比,而且stop必须要有结束符<stop/>或者<stop></stop>
            3.将绘制的图形与渐变效果结合时
              1)fill="url(#渐变元素的id值)"
        -->
        <defs>
            <!--linearGradient渐变元素-->
            <!--id加在渐变元素里-->
            <linearGradient id="linear" x1="0%" y1="0%" x2="100%" y2="100%">
                <!--stop添加渐变颜色-->
                <stop offset="0%" stop-color="red"></stop>
                <stop offset="100%" stop-color="orange"></stop>
            </linearGradient>
        </defs>
        
        <rect x="0" y="0" width="400px" height="400px" fill="url(#linear)" stroke="yellow" stroke-width="5"></rect>
</svg>

四、SVG-高斯模糊效果

 <svg width="500" height="500"> 
   <defs> 

      <filter id="Gaussian_Blur"> 

            //fegaussianblur- 高斯模糊,stdDeviation - 设置模糊程度 
            <feGaussianBlur in="SourceGraphic" stdDeviation="3" /> 

      </filter>
   </defs>

   <rect x="0" y="0" width="400" height="400" filter="url(#def)">

 </svg>

五、Two.js

1、 专门用于绘制二维图形,支持SVG Canvas WebGL

2、 特点

 深度实现具有动画效果的矢量图
 致力于更简洁地创建矢量图及动画效果
 
3、 官网

   https://two.js.org/

4、 绘制步骤步骤

 1) 在HTML页面引入two.js文件

      <script src="two.js"></script>

 2).在HTML页面定义用于显示矢量图的容器

     <div id="draw-shapes"></div>

 3).js代码获取元素

     document.getElementById("draw-shapes");

 4) 使用创建two对象,并追加到设置的容器内

     var two = new Two(params).appendTo(elem);

 5) 使用twojs的api确定要画的图形

     var rect = two.makeRectangle(213, 100, 100, 100);
     var circle = two.makeCircle(72, 100, 50);

 6) 设置图形的样式

      circle.fill = '#FF8000';
      circle.stroke = 'orangered'; 
      circle.linewidth = 5;
      rect.opacity = 0.75;
      rect.noStroke();

 7) 绘制

      two.update();
  1. 给图形分组

    如果在HTML页面绘制多个图形,并且每个图形设置的样式相同,每个图形要重新设置一次,此时可以将这些图形设为一组,用组对象统一设置样式

    two.makeGroup(rect,circle);

two.js作图例子
     <!DOCTYPE html>
     <html>
      <head>
      <meta charset="UTF-8">
      <title></title>
      <!--1.导入two.js文件-->
      <script type="text/javascript" src="two.js"></script>
      </head>
      <body>
       <!--2.设置图形的容器-->
       <div id="div">
        
       </div>
    
      <script type="text/javascript">
        //3.获取到容器
        var div = document.getElementById("div");
        //4.创建two对象,并追加到容器里面
        var two = new Two({
            //有默认的宽和高,也可以自己设置
            width:400,
            height:400
        }).appendTo(div);
        //5.调用two的API作图,获取到图形对象,对图形对象进行样式设置
        var rect = two.makeRectangle(-100,-100,200,200);
        rect.fill = "red";
        rect.stroke = "orange";
        
        var circle = two.makeCircle(-100,-100,50);
        circle.fill = "yellow";
        circle.stroke = "blue";
        
        //实现分组设置样式
        var group = two.makeGroup(rect,circle);
        group.fill = "green";
        group.stroke = "pink";
        
        circle.fill = "red";

        //two.update();
        
        //设置参考点
        group.translation.set(200,200);
        //1s 60次
        two.bind("update",function  () {
            //写上动画逻辑
            group.rotation += 10*Math.PI/180;
        }).play();
        
      </script>
     </body>
     </html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,658评论 2 32
  • SVG API: SVG是一种可缩放矢量图形,一种二维图形表示语言 与canvas不同的是,在浏览器的开发工具中能...
    Iris_mao阅读 1,002评论 0 5
  • 18- UIBezierPath官方API中文翻译(待校对) ----------------- 华丽的分割线 -...
    醉卧栏杆听雨声阅读 1,046评论 1 1
  • 一、栅格图形和矢量图形栅格图形:也称位图,图像由一组二维像素网格表示。Canvas 2d API 就是一款栅格图形...
    linda102阅读 1,125评论 0 4
  • 在React Native中使用ARTReact Native ART 究竟是什么?所谓ART,是一个在React...
    JackfengGG阅读 9,478评论 2 50