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-width: 线条的宽度

 

  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-width:2;filter:url(#Gaussian_Blur)"/>
    </svg>

再举一个例子

 七、路径动画

 stroke-dasharray、stroke-dashoffset

        line{
            stroke: red;
            stroke-width: 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-width: 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-width: 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-width: 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-width: 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>

 

posted @ 2019-08-16 18:22  杨培贤  阅读(3137)  评论(0编辑  收藏  举报