zoukankan      html  css  js  c++  java
  • HTML5——Svg

    一、Svg简介

    svg也是html5新增的一个标签,它跟canvas很相似。都可以实现绘图、动画。

    但是svg绘制出来的都是矢量图,不像canvas是以像素为单位的,放大会模糊。svg绘制出来的图是不会的

    二、svg的基本使用

    svg是在html和css里面操作的,不是在js里面

    <body>
      <
    svg width="500" height="500"> <svg>
    </body>

    2.1 绘制直线

            line{
           stroke: red;
         }

         <!-- line(直线)前面两个值是起始点坐标,后面两个值是终点坐标 --> <line x1="100" y1="100" x2="200" y2="200"></line>

    2.2 绘制矩形

            <!-- rect(矩形)前面两个值是位置,中间两个值是圆角,后面两个值是设置宽高 -->
            <rect x="50" y="20" rx="10" ry="10" width="150" height="150"></rect>

    我们来看看加上css样式,空心矩形

            rect{
                fill:transparent;  //设置为透明色
                stroke: red;    //描边为红色
            }

     

    2.3 绘制圆弧

            <!-- cirle(圆弧)前面第一个值是设置圆的半径,后面值是位置。实心圆-->
            <!-- 可以在css设置为透明再设置描边,就会成空心圆 -->
            <circle r="50" cx="200" cy="100"></circle>

     

    2.4 绘制椭圆

            <!-- ellipse(椭圆) 第一个值为圆的宽度,第二个为圆的高度,后两值为圆的位置-->
            <!-- 可以在css设置为透明再设置描边,就会成空心 -->
            <ellipse rx="60" ry="30" cx="100" cy="100"></ellipse>

    2.5 绘制折线

            <!-- polugon(折线) 起点会跟终点相连接 -->
            <!-- 可以在css设置为透明再设置描边,就会成空心 -->
            <polygon points="100 100, 200 50, 300 100, 400 50"></polygon>
    
            <!-- poluline(折线) 起点会跟终点相连接 -->
            <!-- 可以在css设置为透明再设置描边,就会成空心 -->
            <polyline points="100 200, 200 150, 300 200, 400 150"></polyline>

    2.6 绘制文本

            <!-- text(文本)跟绝对定位一个道理 -->
            <text x="400" y=150>123</text>

    三、样式属性

      fill: 填充色 (默认为黑色)

      stroke: 线条的颜色(默认为黑色)

      stroke- 线条的宽度

      stroke-linecap: 线条末尾的样式 (默认)butt (圆角)round (方形)square ,round和square会影响线条的长度

       默认的样式就不设置了,设置跟设置没上面两样

        round(圆角)

        

        

        square(方形)

        

        

        stroke-linejoin:可使用的值是:miter, round, bevel, inherit 笔划连 接属性定义了路径拐角的形状,"miter"是默认值,"round"光滑连接,"bevel"折线连接,"inherit"继 承

      round

      bevel

      opacity: 不透明度 0~1(可以设置填充的,也可以描边的)

      

      

    用上面所学的知识来做个小demo

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            svg {
                margin-left: 100px;
                margin-top: 100px;
                border: 1px solid black;
            }
            rect{
                fill: transparent;
                stroke: black;
                stroke-width: 5px;
            }
            polygon{
                fill: black;
            }
            circle{
                fill: transparent;
                stroke: black;
                stroke-width: 4px;
            }
            .yan{
                fill: black;
            }
            .bi{
                fill: transparent;
                stroke: black;
                stroke-width: 3px;
            }
            ellipse{
                fill: transparent;
                stroke: black;
                stroke-width: 3px;
            }
            text{
                stroke: red;
            }
        </style>
    </head>
    <body>
        <svg width="500" height="500">
            <rect x="100" y="100" rx="15" ry="15" width="300" height="300"></rect>
            <polygon points="110 100, 130 60, 190 95, 250 60, 310 95,370 60, 390 100"></polygon>
            <circle r="20" cx="190" cy="200"></circle>
            <circle r="20" cx="320" cy="200"></circle>
            <circle class="yan" r="5" cx="198" cy="208"></circle>
            <circle class="yan" r="5" cx="328" cy="208"></circle>
            <polygon class="bi" points="240 300, 250 260, 270 300"></polygon>
            <ellipse rx="30" ry="10" cx="260" cy="330"></ellipse>
            <text x="200" y="440">屏幕前的你很帅</text>
        </svg>
    </body>
    </html>

     四、path元素(指令)

    moveTo   lineTo

      4.1 M命令和L命令

    <path d = "M 100 100 L 200 100 "></path>

    4.2 m命令和l命令

    <path d="m 100 100 l 200 100 "></path>

     大写表示绝对定位,小写表示相对定位

    绝对坐标和相对坐标,相对于上个移动距离

    4.3 H和V命令

            <!-- H水平方向  V竖着方向 -->
            <path d="M 100 100 H 200 V 200"></path>

      

     大写表示绝对定位,小写表示相对定位

    绝对坐标和相对坐标,相对于上个移动距离

     4.4 Z命令

    <path d="M 100 100 H 200 V 200 Z"></path>

    圆弧指令 

    4.5 A命令       可以传7个参数 rx, ry, x-axis-rotaion, large-arc-flag, sweep-flag, x, y

    rx, ry圆弧的x轴半径和y轴半径

    x-axis-rotaion 圆弧的相对x轴的旋转角度,默认是顺时针,可以设置负值

    large-arc-flag 表示圆弧路径是大圆弧还是小圆弧,1是大圆弧,0是小圆弧

    sweep-flag 表示从起点到终点是顺时针还是逆时针,1表示顺时针,0表示逆时针

    x, y 表示终点坐标,绝对或相对

    <path d="M 100 100 A 70 120 90 1 1 100 200"></path>

     如果不懂获取不清楚可以评论找我,或者自己多试试参数研究研究

      五、贝塞尔曲线

       5.1 二次贝塞尔曲线

    Q x1, y1, x, y 

    T x ,  y

    <path d = "M 100 100 Q 200 50 300 300"></path>

    加上T

    <path d = "M 100 100 Q 200 50 300 300 T 450 200"></path>

    做个小demo(logo)

            <path d="M 120 280 Q 80 460 300 310 T 450 200"></path>
            <path d="M 120 280 Q 115 360 280 284 T 450 200"></path>

    5.2  三次贝塞尔曲线 

    C : x1, y1, x2, y2,  x, y

    S: x2, y2, x, y  

            <path d="M 100 100 C 190 140 230 80 280 120 S 250 160 280 120"></path>

    都差不多是一个道理,自己试试就可以懂的

    自动生成绘制路径的网站:https://editor.method.ac/

     绘制出自己想要的样式,然后按 ctrl+U 把代码拿出来用

    六、渐变

     6.1 线性渐变

    <linearGradient> 可用来定义 SVG 的线性渐变。

    <linearGradient> 标签必须嵌套在 <defs> 的内部。<defs> 标签是 definitions 的缩写,它可对诸如渐变之类的特殊元素进行定义。

    线性渐变可被定义为水平、垂直或角形的渐变:

    • 当 y1 和 y2 相等,而 x1 和 x2 不同时,可创建水平渐变

    • 当 x1 和 x2 相等,而 y1 和 y2 不同时,可创建垂直渐变

    • 当 x1 和 x2 不同,且 y1 和 y2 不同时,可创建角形渐变

        <svg width="500" height="500">
            <defs>
                <linearGradient id="orange_red" x1="0%" y1="0%" x2="100%" y2="0%">
                  <stop offset="0%" style="stop-color:rgb(255,255,0); stop-opacity:1"/>
                  <stop offset="100%" style="stop-color:rgb(255,0,0); stop-opacity:1"/>
                </linearGradient>
            </defs>
            <ellipse cx="200" cy="190" rx="85" ry="55" style="fill:url(#orange_red)"/>
        </svg>

    6.2径向渐变

    <radialGradient> 用来定义径向渐变。

    <radialGradient> 标签必须嵌套在 <defs> 中。<defs> 标签是 definitions 的缩写,它允许对诸如渐变等特殊元素进行定义。

        <svg width="500" height="500">
            <defs>
                <radialGradient id="grey_blue" cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
                    <stop offset="0%" style="stop-color:rgb(200,200,200);stop-opacity:0"/>
                    <stop offset="100%" style="stop-color:rgb(0,0,255);stop-opacity:1"/>
                </radialGradient>
            </defs>
            <ellipse cx="230" cy="200" rx="110" ry="100" style="fill:url(#grey_blue)"/>
        </svg>

    6.3  高斯模糊

    <filter> 标签用来定义 SVG 滤镜。<filter> 标签使用必需的 id 属性来定义向图形应用哪个滤镜?

    <filter> 标签必须嵌套在 <defs> 标签内。<defs> 标签是 definitions 的缩写,它允许对诸如滤镜等特殊元素进行定义。

        <svg width="500" height="500">
            <defs>
                <filter id="Gaussian_Blur">
                    <feGaussianBlur in="SourceGraphic" stdDeviation="3" />
                </filter>
            </defs>       
            <ellipse cx="200" cy="150" rx="70" ry="40"style="fill:#ff0000;stroke:#000000;stroke-2;filter:url(#Gaussian_Blur)"/>
        </svg>

    再举一个例子

     七、路径动画

     stroke-dasharray、stroke-dashoffset

            line{
                stroke: red;
                stroke- 10px;
                stroke-linecap: butt;
    
            }
        </style>
    </head>
    <body>
        <svg width="500" height="500">
            <line x1="100" y1="100" x2="400" y2="100"></line>        
        </svg>
    </body>

    先画出一条直线,方便观察。

    再来添加stroke-dasharray:10px

            line{
                stroke: red;
                stroke- 10px;
                stroke-linecap: butt;
    
                stroke-dasharray: 10px ;
            }
        </style>
    </head>
    <body>
        <svg width="500" height="500">
            <line x1="100" y1="100" x2="400" y2="100"></line>        
        </svg>
    </body>

    再来添加stroke-dasharray:10px 20px;

     

    再来添加stroke-dasharray:10px 20px 30px;

     

    依此类推添加,就不再多写了,可以自己试试

    接着再来设置添加一下  stroke-dashoffset (偏移量) 属性

    随着偏移量增加可以无限循环播放

    做个小demo

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            svg {
                margin-left: 100px;
                margin-top: 100px;
                border: 1px solid black;
            }
            
            line{
                stroke: red;
                stroke-width: 10px;
                stroke-linecap: butt;
    
                stroke-dasharray: 300px;
                stroke-dashoffset: 300px;
                animation: move 1s linear infinite alternate-reverse;
            }
            @keyframes move{
                0%{
                    stroke-dashoffset: 300px;
                }
                100%{
                    stroke-dashoffset: 0;
                }
            }
        </style>
    </head>
    <body>
        <svg width="500" height="500">
            <line x1="100" y1="100" x2="400" y2="100"></line>        
        </svg>
    </body>
    </html>

     八、JS操作Svg

    8.1

    获取路径总长度

            line{
                stroke: red;
                stroke- 10px;
                stroke-linecap: butt;
                stroke-dasharray: 300px;
                stroke-dashoffset: 300px;
            }
        </style>
    </head>
    <body>
        <svg width="500" height="500">
        <line x1="100" y1="100" x2="400" y2="100"></line>
        </svg>
        <script>
            var svg = document.getElementsByTagName('svg')[0];
            var line = document.getElementsByTagName('line')[0];
            console.log(line.getTotalLength( ));
        </script>

    获取路径上距离起点距离与x长度点距离

            line{
                stroke: red;
                stroke- 10px;
                stroke-linecap: butt;
                stroke-dasharray: 300px;
                stroke-dashoffset: 300px;
            }
        </style>
    </head>
    <body>
        <svg width="500" height="500">
        <line x1="100" y1="100" x2="400" y2="100"></line>
        </svg>
        <script>
            var svg = document.getElementsByTagName('svg')[0];
            var line = document.getElementsByTagName('line')[0];
            console.log(line.getPointAtLength(50));
        </script>

    8.2

      1. 创建svg元素需要指定命名空间

      2.  svg元素对象一般通过调用setAttribute()方法来设定属性值

        <style>
            svg {
                border: 1px solid red;
            }
    
            line {
                stroke: red;
                stroke- 10px;
            }
        </style>
    </head>
    
    <body>
        <script>
            var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
            var line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
            svg.setAttribute('width', 200);
            svg.setAttribute('height', 200);
            line.setAttribute('x1', 100);
            line.setAttribute('y1', 100);
            line.setAttribute('x2', 150);
            line.setAttribute('y2', 100);
    
    
            svg.appendChild(line);
            document.body.appendChild(svg);
        </script>

  • 相关阅读:
    从量子加密到机器学习,盘点2015阿里云开放的黑科技
    架构设计:系统存储(24)——数据一致性与Paxos算法(中)
    深入理解Git (一) - 元数据
    IOS Using UIAlertView to show alerts
    gdal hdfs接口数据读取
    /usr/lib64/python2.6/site-packages/pycurl.so: undefined symbol: CRYPTO_set_locking_callback
    linux jexus mono 发布.net webservices web页面
    docker中使用systemd
    基于Open vSwitch搭建虚拟路由器
    Openstack Neutron DVR workflow
  • 原文地址:https://www.cnblogs.com/yangpeixian/p/11359676.html
Copyright © 2011-2022 走看看