• SVG笔记


    SVG(Scalable Vector Graphics)

    可伸缩矢量图形,它是用XML格式来定义用于网络的基于矢量的图形,它的特点是**图像在放大或改变尺寸的情况下其图形质量不会有所损失,同时他和DOM一样都是W3C的一个标准。

    位图和矢量图

    位图,也就是我们经常能看到的图片,它是一个平面上密集排布的点的集合,也就是说它是由一个个点构成的。对它进行放大那么相对应的点就会进行放大,这样就会让图片显得十分不清晰。

    矢量图,也称为面向对象的图像或绘图图像,在数学上定义为一系列由线连接的点。矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。它的特点是放大后图像不会失真,和分辨率无关,适用于图形设计、文字设计和一些标志设计、版式设计等。矢量图格式有CGM, SVG, AI (Adobe Illustrator), CDR (CorelDRAW), PDF, SWF, VML等等。

    SVG代码解析

    <?xml version="1.0" standalone="no"?>
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
    <svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
        <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>
    </svg>
    
    
    • 第一行包含了XML声明。standalone属性规定此SVG文件是否“独立”,是否引用外部文件。standalone="no" 意味着 SVG 文档会引用一个外部文件。栗子中引用了DTD文件。
    • 第二引用了这个外部的 SVG DTD。该 DTD 位于 “http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd”。该 DTD 位于W3C,含有所有允许的SVG元素。
    • svg标签是SVG 代码的根元素。

    SVG栗子

    栗子1

    <!DOCTYPE html>
    <head>
        <title>SVG</title>
        <meta charset="utf-8" />
    <style>
    	svg{display:block;}
    </style>
    </head>
    <body>
    <!-- 圆形circle -->
    <svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
        <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>
    </svg>
    
    <!-- 椭圆ellipse -->
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
        <ellipse cx="240" cy="100" rx="220" ry="30" style="fill:purple"/>
        <ellipse cx="220" cy="70" rx="190" ry="20" style="fill:lime"/>
        <ellipse cx="210" cy="45" rx="170" ry="15" style="fill:yellow"/>
    </svg>
    
    <!-- 矩形rect -->
    <svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
        <rect x="20" y="20" rx="20" ry="20" width="250" height="100" style="fill:red;stroke:black; stroke-5;opacity:0.5"/>
    </svg>
    
    <!-- 线line -->
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
        <line x1="0" y1="0" x2="200" y2="200" style="stroke:rgb(255,0,0);stroke-2"/>
    </svg>
    
    <!-- 多边形polygon -->
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
        <polygon points="200,10 250,190 160,210" style="fill:lime;stroke:purple;stroke-1"/>
    </svg>
    
    <!-- 折线polyline 用于创建任何只有直线的形状 -->
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
        <polyline points="20,20 40,25 60,40 80,120 120,140 200,180" style="fill:none;stroke:black;stroke-3" />
    </svg>
    
    <!-- 路径path -->
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
        <path d="M150 0 L75 200 L225 200 Z" />
    </svg>
    
    <!-- 文本text -->
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
        <text x="0" y="15" fill="red" transform="rotate(30 20,40)">I love SVG</text>
    </svg>
    <svg width="660" height="220" style="outline: 1px solid red; overflow: visible;">  
        <text x="0" y="0" dx="10,20,30,40,60" dy="10,20,30,40,50,60">This is some SVG Text<text>  
    </svg>
    <svg width="660" height="220" style="outline: 1px solid red; overflow: visible;">  
        <text x="0" y="20" rotate="0,45,0,90,180,0">This is some SVG Text</text>  
    </svg>
    
    
    </body>
    </html>
    
    
    • version:定义所使用的 SVG 版本。
    • xmlns:定义 SVG 命名空间。
    • style:定义 CSS 属性。
    • width 和 height:设置此 SVG 文档的宽度和高度。
    • stroke,笔画颜色:设置图形边线的颜色。
    • stroke-width,笔画宽:设置图形边线的宽。
    • fill,填充:设置形状内的颜色。
    • fill-opacity:定义填充颜色透明度(合法的范围是:0 - 1)。
    • stroke-opacity:定义了笔触颜色的透明度(合法的范围是:0 - 1)。
    • opacity:定义了元素的透明值 (范围: 0 到 1)。
    • x,y,rx,ry等:都是相对于画布而言的,画布看不见,在svg标签上设置的width和height就是画布的宽高。
    • rect,矩形:x属性定义矩形的左侧位置(例如,x="0" 定义矩形到浏览器窗口左侧的距离是 0px);y属性定义矩形的顶端位置(例如,y="0" 定义矩形到浏览器窗口顶端的距离是 0px);rx 和 ry 属性可使矩形产生圆角;
    • circle and ellipse,圆形和椭圆:cx和cy属性定义圆心的x和y坐标。如果省略cx和cy,圆的中心会被设置为(0, 0)。
    • circle: r属性定义圆的半径。
    • ellipse: RX属性定义的水平半径;RY属性定义垂直半径。
    • line,线:x1 属性在 x 轴定义线条的开始,y1 属性在 y 轴定义线条的开始,x2 属性在 x 轴定义线条的结束,y2 属性在 y 轴定义线条的结束。
    • polygon和polyline,多边形和折线:points 属性定义每个角的 x 和 y 坐标,角是按逆时针排序的。
    • text,文本:x,y是相对于整个视窗的绝对定位,dx,dy是相对于前一个字符的长度(ps:空格也算是一个字符),rotate是字符旋转一定角度。
    • path,路径:下面的命令可用于路径数据:
    指令&名称 参数 描述
    M = moveto移动到 x,y 移动虚拟画笔到指定的(x,y)坐标,仅移动不绘制
    L = lineto连直线到 x,y 从当前画笔所在位置绘制一条直线到指定的(x,y)坐标
    H = horizontal lineto水平连线到 x 绘制一条水平直线到参数指定的x坐标点,y坐标为画笔的y坐标
    V = vertical lineto垂直连线到 y 从当前位置绘制一条垂直直线到参数指定的y坐标
    C = curveto三次方贝塞尔曲线 x1,y1 x2,y2 x,y 从当前画笔位置绘制一条三次贝塞尔曲线到参数(x,y)指定的坐标。x1,y1和x2,y2是曲线的开始和结束控制点,用于控制曲线的弧度
    S = smooth curveto平滑三次方贝塞尔曲线 x2,y2 x,y 从当前画笔位置绘制一条三次贝塞尔曲线到参数(x,y)指定的坐标。x2,y2是结束控制点。开始控制点和前一条曲线的结束控制点相同
    Q = quadratic Bézier curve二次方贝塞尔曲线 x1,y1 x,y 从当前画笔位置绘制一条二次方贝塞尔曲线到参数(x,y)指定的坐标。x1,y1是控制点,用于控制曲线的弧度
    T = smooth quadratic Bézier curveto平滑的二次贝塞尔曲线 x,y 从当前画笔位置绘制一条二次贝塞尔曲线到参数(x,y)指定的坐标。控制点被假定为最后一次使用的控制点
    A = elliptical Arc椭圆弧线 rx,ry x-axis-rotation large-arc-flag,sweepflag x,y 从当前画笔位置开始绘制一条椭圆弧线到(x,y)指定的坐标。rx和ry分别为椭圆弧线水平和垂直方向上的半径。x-axis-rotation指定弧线绕x轴旋转的度数。它只在rx和ry的值不相同时有效果。large-arc-flag是大弧标志位,取值0或1,用于决定绘制大弧还是小弧。sweep-flag用于决定弧线绘制的方向
    Z = closepath闭合路径 从结束点绘制一条直线到开始点,闭合路径

    注意:

    1. 以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位
    2. 深度掌握SVG路径path的贝塞尔曲线指令

    栗子2

       <svg xmlns="http://www.w3.org/2000/svg"  width="100%" height="100%"> 
         <defs>
           <g id="shape">
               <circle cx="50" cy="50" r="50" fill="blue" />
               <rect x="50" y="50" width="50" height="50" fill="red" />
           </g>
         </defs>
         <use xlink:href="#shape" x="0" y="0" />
         <use xlink:href="#shape" x="150" y="0" />
       </svg> 
    
    
    • defs元素是一个容器,defs是definitions的缩写。
    • defs元素用于预定义一个元素使其能够在SVG图像中重复使用。
    • 在defs元素中定义的图形不会直接显示在SVG图像上,要显示它们需要使用use元素来引入它们。
    • 要引用g元素,必须在g元素上设置一个ID,通过ID来引用它。
    • use元素通过xlink:href属性来引入g元素。
    • 在use元素中,通过x和y属性来指定重用图形的显示位置。
    • 在g元素中的图形的定位点都是0,0,在使用use元素来引用它的时候,它的定位点被转换为use元素x和y属性指定的位置。

    SVG滤镜

    SVG滤镜的原理
    SVG在使用了滤镜的元素里,不会将原始图形直接渲染出来,而是会将原始图形的像素信息渲染到临时位图中,然后由filter元素指定的操作会被应用到这个临时位图,最终把计算结果渲染为最终图形输出。

    • SVG可用的滤镜有:
    • feBlend - 与图像相结合的滤镜
    • feColorMatrix - 用于彩色滤光片转换
    • feComponentTransfer
    • feComposite
    • feConvolveMatrix
    • feDiffuseLighting
    • feDisplacementMap
    • feFlood
    • feGaussianBlur - 定义模糊效果
    • feImage
    • feMerge
    • feMorphology
    • feOffset - 过滤阴影,创建阴影效果
    • feSpecularLighting
    • feTile
    • feTurbulence
    • feDistantLight - 用于照明过滤
    • fePointLight - 用于照明过滤
    • feSpotLight - 用于照明过滤
    • 除此之外,可以在每个 SVG 元素上使用多个滤镜!

    举个栗子-阴影效果1

    	    <svg id="test" xmlns="http://www.w3.org/2000/svg" version="1.1" width="800" height="400">
    		 <defs>
    			<filter id="f1">
    				<feGaussianBlur in="SourceGraphic" stdDeviation="15" />
    			</filter>
    		</defs>
    		<rect x="20" y="20" rx="5" ry="5" width="750" height="325" fill="green"  filter="url(#f1)" />
    	   </svg>
            <!--图形非常模糊,原因是滤镜返回的是一个模糊过的阿尔法通道,并不是原始图形。另外浏览器里查看图形,可以明显的看到滤镜对象的边界不同于原始对象的边界,它的默认值为X等于-10%,Y等于-10%,宽120%,高120%。这其实是为滤镜提供了额外的空间,产生的输出大于输入区域。改进版看栗子*阴影效果2*-->
    
    
    • 所有互联网的SVG滤镜定义在defs元素中。
    • in="SourceGraphic"定义了由整个图像创建效果。
    • stdDeviation="15"定义模糊程度,值越大,模糊效果越强,并且可以接受两个数字,分别为X和Y方向的模糊度。
    • 可以指定SourceAlpha为它的输入源,如果不指定将在原色值上做模糊。
    • filter滤镜属性用来把元素链接到滤镜,如filter="url(#f1)",把元素链接到id为f1的滤镜。

    举个栗子-阴影效果2
    参见svg滤镜学习

    SVG渐变

    • 渐变是从一种颜色到另一种颜色的平滑过渡。
    • SVG渐变可以把多个颜色的过渡应用到同一个元素上。
    • SVG渐变主要有Linear(直线)和Radial(放射)两种类型:

    SVG线性渐变linearGradient

    • linearGradient元素用于定义线性渐变。
    • linearGradient标签必须嵌套在defs标签的内部。
    • linearGradient标签的id属性可为渐变定义一个唯一的名称。
    • linearGradient标签的X1,X2,Y1,Y2属性定义渐变开始和结束位置。
    • 渐变的颜色范围可由两种或多种颜色组成。
    • 每种颜色通过一个stop标签来规定。
    • offset属性用来定义渐变的开始和结束位置。
    • fill填充属性把渐变应用到相应元素。

    线性渐变可以定义为水平、垂直或角渐变:
    当y1和y2相等,而x1和x2不同时,可创建水平渐变
    当x1和x2相等,而y1和y2不同时,可创建垂直渐变
    当x1和x2不同,且y1和y2不同时,可创建角形渐变

    小栗子

    	<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
    	<defs>
    		<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%">
    			<stop offset="0%" style="stop-color:rgb(255,255,0);stop-opacity:1" />
    			<stop offset="60%" style="stop-color:blue;stop-opacity:1" />
    			<stop offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1" />
    		</linearGradient>
    	</defs>
    	<ellipse cx="200" cy="70" rx="85" ry="55" fill="url(#grad1)" />
    	</svg>
    
    

    SVG放射性渐变radialGradient

    • radialGradient元素用于定义放射性渐变。
    • radialGradient标签必须嵌套在defs的内部。
    • radialGradient标签的 id 属性可为渐变定义一个唯一的名称。
    • cx/cy和r属性定义的是最外层的圆;fx和fy定义的是最内层的圆。
    • 渐变颜色范围可以由两个或两个以上的颜色组成。
    • 每种颜色用一个stop标签指定。
    • offset属性用来定义渐变色开始和结束。
    • fill填充属性把渐变应用到相应元素。

    小栗子

    	<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
    	<defs>
    		<radialGradient id="grad1" cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
    			<stop offset="0%" style="stop-color:rgb(255,255,255); stop-opacity:0" />
    			<stop offset="50%" style="stop-color:rgb(255,255,0); stop-opacity:1" />
    			<stop offset="100%" style="stop-color:red;stop-opacity:1" />
    		</radialGradient>
    	</defs>
    	<ellipse cx="200" cy="70" rx="85" ry="55" fill="url(#grad1)" />
    	</svg>
    
    

    SVG运动动画

    set元素
    set元素本身没有动画效果,但可以在特定时间之后修改某个属性值(也可以是CSS属性值)。

    小栗子

    	<svg width="520" height="320" xmlns="http://www.w3.org/2000/svg">
    		<g>
    			<text font-family="microsoft yahei" font-size="60" y="160" x="160">
    			GOGOGO
    				<set attributeName="font-size" attributeType="XML" to="30" begin="3s" />
    				<set attributeName="x" attributeType="XML" to="30" begin="3s" />
    			</text>
    		</g>
    	</svg>
    

    animate元素
    animate基础动画元素。

    小栗子

    	<svg width="520" height="320" xmlns="http://www.w3.org/2000/svg">
    		<g>
    			<text font-family="microsoft yahei" font-size="60" y="160" x="160">
    			GOGOGO
    				<animate attributeName="x" from="160" to="60" begin="0s" dur="3s" repeatCount="indefinite" />
    				<animate attributeName="font-size" from="60" to="20" begin="0s" dur="5s" repeatCount="indefinite" />
    			</text>
    		</g>
    	</svg>
    
    

    animateTransform元素
    animateTransform元素可以实现transform变换动画效果的。与css3中transform变换基本一样。

    小栗子

    	<svg width="520" height="320" xmlns="http://www.w3.org/2000/svg">
    		<g>
    			<text font-family="microsoft yahei" font-size="40" y="160" x="160">
    			GOGOGO
    				<animateTransform attributeName="transform" begin="0s" dur="3s" type="scale" from="0.5" to="1.5" repeatCount="indefinite"/>
    			</text>
    		</g>
    	</svg>
    
    

    animateMotion元素
    animateMotion元素可以让SVG各种图形沿着特定的path路径运动。

    小栗子

    	<svg width="560" height="200" xmlns="http://www.w3.org/2000/svg">
    		<text font-family="microsoft yahei" font-size="40" x="0" y="0" fill="#cd0000">人
    			<animateMotion path="M10,80 q100,120 120,20 q140,-50 160,0" begin="0s" dur="3s" rotate="auto" repeatCount="indefinite"/>
    		</text>
    		<path d="M10,80 q100,120 120,20 q140,-50 160,0" stroke="#cd0000" stroke-width="2" fill="none" />
    	</svg>
    
    
  • 相关阅读:
    尚硅谷韩顺平Linux教程学习笔记
    第15章 自动编码器
    问题总结
    日常问题记录
    SQLServer日常bug记录
    .NetCore使用NLog写入数据库总结
    C#操作XML文档
    C#中的 ?/?:/?? 三者的区别及用法
    git 命令从入门到放弃
    通过反射技术获得类中的所有属性
  • 原文地址:https://www.cnblogs.com/giselle527/p/6491939.html
Copyright © 2020-2023  润新知