SVG简介及其用法

2016-12-19  本文已影响118人  Alone灬旅途

一、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>
上一篇下一篇

猜你喜欢

热点阅读