数据可视化前端SVG交互设计

SVG基础之内部元素

2017-06-22  本文已影响1025人  weqwqwqwe121312

说明:SVG概念,元素样式设置等请查看SVG基础

目录

图形元素

1. 矩形

矩形使用<rect></rect>标签进行绘制

示例图:

rectDemo.png

示例代码如下:

<svg width="200" height="200">
  <rect x="10" y="10" width="100" height="100" rx="5" ry="5" fill="yellow"></rect>
</svg>

参数说明:

说明:fill用来设置填充颜色,在文章SVG基础已进行详细说明,这里不做更多解释

2. 圆形

圆形使用<circle></circle>标签进行绘制

示例图:

circleDemo.png

示例代码如下:

<svg width="200" height="200">
  <circle cx="50" cy="50" r="40" fill="yellow"></circle>
</svg>

参数说明:

3. 椭圆形

椭圆形使用<ellipse></ellipse>标签进行绘制,与圆形的绘制方法类似。

示例图:

ellipseDemo.png

示例代码如下:

<svg width="200" height="200">
  <ellipse cx="50" cy="50" rx="40" ry="20" fill="yellow"></ellipse>
</svg>

参数说明:

4. 线段

线段使用<line></line>标签进行绘制

示例代码如下:

<svg width="200" height="200">
  <line x1="10" y1="10" x2="90" y2="90" stroke="yellow"></line>
</svg>

参数说明:

5. 折线与多边形

折线与多边形的绘制方法类似,都是用points属性设置各个点的坐标。

折线使用<polyline></polyline>标签进行绘制,而多边形使用<polygon></polygon>标签进行绘制,且多边形会将起点与终点连接起来,折线不会。

示例图:

demo.png

示例代码如下:

/* 图一 折线,不会将起点与终点连接 */
<svg width="200" height="200">
  <polyline points="50,10 80,90 10,30 90,30 20,90" stroke="#fb3" stroke-width="3" fill="transparent"></polyline>
</svg>

/* 图二 多边形,将起点与终点连接 */
<svg width="200" height="200">
  <polygon points="50,10 80,90 10,30 90,30 20,90" stroke="#fb3" stroke-width="3" fill="transparent"></polygon>
</svg>

参数说明:

6. 路径

路径使用<path></path>标签进行绘制,使用d属性控制路径的类型及绘制。路径的功能最多,前面的所有图形均可使用路径进行绘制。

d属性值的书写格式有两种,可以使用逗号分割坐标,如:d="M10, 10",也可使用空格的形式,如:d="M 10 10"

注意:大写字母:表示坐标系中使用绝对坐标,小写字母:使用相对坐标(相对当前画笔所在的点)

移动类参数:

绘制直线类参数:

绘制曲线类参数:

示例图:

demo.png

示例代码如下:

/* 图一 三次方贝塞尔曲线 */
<svg width="200" height="200">
  <path d="M10,10 C40,5 40,140 100,100" stroke="#fb3" stroke-width="4px" fill="transparent"></path>
</svg>

/* 图二 三次方贝塞尔曲线,与上一条曲线相连 */
<svg width="200" height="200">
  <path d="M10,10 C40,5 40,140 100,100 S140,180 160,160" stroke="#fb3" stroke-width="4px" fill="transparent"></path>
</svg>

/* 图三 二次贝塞尔曲线 */
<svg width="200" height="200">
  <path d="M10,10 Q40,140 100,100" stroke="#fb3" stroke-width="4px" fill="transparent"></path>
</svg>

/* 图四 二次方贝塞尔曲线,与上一条曲线相连 */
<svg width="200" height="200">
  <path d="M10,10 Q40,140 100,100 T160,160" stroke="#fb3" stroke-width="4px" fill="transparent"></path>
</svg>

绘制弧线类参数:

示例图:

demo.png

示例代码:

<svg width="500" height="500">
    <path d="M50,50 A60 30 0 1,0 150,50 Z" stroke="#fb3" stroke-width="4px" fill="transparent"></path>
  </svg>    

分析:起点坐标(50,50),终点坐标(150,50),角度为0。角度弧线大小 large-arc-flag为1,选择大弧度,根据下面分析图,即选择红色的弧线,又绘制方向sweep-flag为0,为逆时针,即从起点沿逆时针防线绘制到终点,所以红色弧线位于下方。

分析图

注意:当 (起点与终点之间的直线距离/2) > (椭圆的水平半径) 时,角度为0的情况下,此时椭圆会等比放大,到相等为止。

闭合类参数:

再次提醒:大写字母:表示坐标系中使用绝对坐标,小写字母:使用相对坐标(相对当前画笔所在的点)

文字元素

在svg中使用<text></text>标签绘制文字。

示例图:

textDemo.png

示例代码如下:

<svg width="200" height="200">
  <text x="10" y="10" dx="10" dy="10" textLength="100" rotate="20">示例文字</text>
</svg>

参数说明:

** 文本路径 **

如果想实现文字沿着路径排列,可使用< textPath ></textPath >标签。需要提前定义好路径path,并指定ID,textPath使用xlink:href定义文字要匹配的路径。

效果图:

textpathDemo.png

示例代码如下:

<svg width="200" height="200">
  <path id="textPath1" d="M100,100 C140,50 140,240 200,200 S240,280 360,360" stroke="#fb3" stroke-width="4px" fill="transparent"></path>
  <text x="10" y="10" dx="-10" dy="-10" rotate="20">
    <textPath xlink:href="#textPath1" textLength="300">
      很扭曲的测试示例文字
    </textPath>
  </text>
</svg>

特殊元素

1. 克隆元素 use

use标签用来克隆其他元素,克隆后的元素不能修改样式。
示例图:

useDemo.png

示例代码:

<svg>
  <rect id="rect1"
        x="10" y="10" width="100" height="100"
        stroke="#5588aa" stroke-width="5"
        fill="transparent"
  ></rect>
  <use x="20" y="20" xlink:href="#rect1"></use>
  </svg>

参数说明:

2. 模版元素 symbol

symbol标签用定义模版,需要结合use标签使用,模版在未被使用之前,不会展示在页面上。模版内部可包含多个元素

示例代码:

<svg>
  <symbol id="template1">
    <rect x="10" y="10" width="100" height="100"
          stroke="#5588aa" stroke-width="5"
          fill="transparent"
    ></rect>
  </symbol>
  <use x="20" y="20" xlink:href="#template1"></use>
  </svg>

3. 组元素 g

group的简写,用来创建分组,组内所有的元素都会继承g的属性,可以嵌套使用,也可以和use标签结合使用。另外可使用transform属性定义控制整个组的位置。

示例代码:

<svg>
  <g stroke="#5588aa" stroke-width="5" fill="transparent">
    <rect x="10" y="10" width="100" height="100"></rect>
    <rect x="120" y="120" width="100" height="100"></rect>
  </g>
</svg>

g标签内部的两个矩形,都会继承g标签的样式。

4. 裁剪元素 clipPath

clipPath元素主要用来剪裁元素,clipPath元素范围外的内容将不会被展示。另外要注意写在<clipPath></clipPath>标签内部的元素不会被显示,clipPath标签需要放在defs标签内。其他元素在引用clipPath元素时,需要使用clip-path="url(#ID)"

示例代码如:

<svg height="200" width="200">
    <defs>
      <clipPath id="clip">
        <rect width="100" height="100"></rect>
      </clipPath>
    </defs>
    <circle cx="90" cy="90" r="90" clip-path="url(#clip)" stroke="none" fill="yellow" />
  </svg>

分析图:

clipPathDemo.png

最终效果图:

clipPathDemo2.png

5. tspan元素

类似span标签,如果想为text内文字单独设计样式,可使用 tspan标签
示例图:

tspanDemo.png

示例代码:

<svg>
  <text x="100" y="100" stroke="#5588aa" textLength="200">
    测试文字<tspan stroke="#ffbb33">单独</tspan>样式
  </text>
</svg>

6. 超链接元素

类似a,使用xlink:href指定链接地址
如:

<svg height="30" width="200">
  <a xlink:href="https://github.com/junruchen/junruchen.github.io/wiki/SVG基础" 
target="_blank">
    <text x="100" y="100" fill="#ffbb33">SVG基础</text>
  </a>
</svg>

7. 可重复利用的图形元素 defs

definitions缩写,用来定义可重复利用的元素,使用场景如使用marker实现线段箭头(见下文 8. 标记元素marker),渐变效果实现等等

8. 标记元素marker

可依附于<path> <line> <polyline> <polygon>元素上,写在<des></des>标签内部,常见的用法是为线段添加箭头。当然也可以为图形元素添加其他内容(如终点处添加圆形、矩形等)
示例图:

markDemo1.png

示例代码如下:

<svg width="200" height="200">
  <defs>
    <marker 
      id="markerDemo1"
      viewBox="0 0 12 12"
      refX= "6"
      refY="6"
      markerUnits="strokeWidth"
      markerWidth="12"
      markerHeight="12"
      orient="auto">
     <path d="M2,2 L10,6 L2,10 L4,6 L2,2" fill="black"></path>
    </marker>
  </defs>

  <line 
    x1="10" y1="10" 
    x2="160" y2="160"
    stroke="blue" stroke-width="2"
    marker-end="url(#markerDemo1)"></line>
</svg>

参数说明:

分析图:

分析图.png

在使用marker绘制的箭头时,可使用marker-startmarker-midmarker-end来控制箭头的位置。

多个箭头效果图:

markerDemo2.png

代码:

<svg width="200" height="200">
  <defs>
    <marker 
      id="markerDemo2"
      viewBox="0 0 12 12"
      refX= "6"
      refY="6"
      markerUnits="strokeWidth"
      markerWidth="12"
      markerHeight="12"
      orient="auto">
     <path d="M2,2 L10,6 L2,10 L4,6 L2,2" fill="black"></path>
    </marker>
  </defs>

  <path 
    d="M20,70 T80,100 T160,80 T300,120 T200,90"     
    stroke="blue" stroke-width="2" fill="transparent"
    marker-start="url(#markerDemo2)"
    marker-mid="url(#markerDemo2)"
    marker-end="url(#markerDemo2)"></path>
</svg>

9. 笔刷元素 pattern

可用来制作纹理背景,写在<defs></defs>标签内部。

示例图:

patternDemo.png

代码:

 <svg>
  <defs>
    <pattern id="p1" x="0" y="0" width="0.2" height="0.2">
      <circle cx="10" cy="10" r="5" fill="#fb3"></circle>
      <rect x="18" y="18" width="10" height="10" fill="#58a"></rect>
      <polygon points="30 10 60 50 0 50" fill="#58a"></polygon>
    </pattern>
  </defs>
  <rect x="0" y="0" width="200" height="200" fill="url(#p1)"</rect>
</svg>

参数说明:

滤镜元素

使用filter标签来标记滤镜,需放在defs标签内部,其他元素通过ID引用滤镜。
如:

<svg height="110" width="110">
  <defs>
    <filter id="f1" x="0" y="0">
      <feGaussianBlur in="SourceGraphic" stdDeviation="15" />
    </filter>
  </defs>
  <rect width="90" height="90" stroke="green" stroke-width="3"  fill="yellow" filter="url(#f1)" />
</svg>

说明:

  1. filter:引用的滤镜
  2. x y 用来定义滤镜相对于图形元素的位置,如:x="0.2",相当于图形元素宽度的20%,也可以使用百分比表示。
  3. feGaussianBlur:feGaussianBlur表示模糊滤镜
  4. in:应用的对象,[SourceGraphic | SourceAlpha],SourceGraphic表示效果应用于整个RGBA图像,SourceAlpha表示使用alpha通道进行效果处理。
  5. in2:in3... 应用多个对象,in2="某对象",使用result输出的对象
  6. result:输出对象
  7. stdDeviation:定义模糊程度

如:

<svg height="120" width="120">
  <defs>
    <filter id="f1" x="0" y="0" width="200%" height="200%">
      <feOffset result="offOut" in="SourceGraphic" dx="20" 
dy="20" />
      <feBlend in="SourceGraphic" in2="offOut" 
mode="normal" />
    </filter>
  </defs>
  <rect width="90" height="90" stroke="green" stroke-width="3"
  fill="yellow" filter="url(#f1)" />
</svg>

效果图:

filter.png

1. feBlend

2. feColorMatrix

3. feComponentTransfer

4. feComposite

5. feConvolveMatrix

6. feDisplacementMap

7. feFlood

8. feGaussianBlur

9. feImage

10. feMerge

11. feMorphology

12. feOffset

13. feSpecularLighting

14. feTile

15. feTurbulence

16. feDiffuseLighting

17. feDistantLight

18. fePointLight

19. feSpotLight

渐变元素

渐变代码写在defs标签内部,其他元素使用url来指定使用的渐变ID

1. 线性渐变 linearGradient

示例图:

linearGradientDemo.png

示例代码:

<svg>
   <defs>
     <linearGradient id="demo1"
                     x1="0%" y1="0%"
                     x2="0%" y2="100%">
       <stop offset="0%" stop-color="#5588aa" stop-opacity="1" />          
       <stop offset="100%" stop-color="#ffbb33" stop-opacity="1" />
     </linearGradient>
   </defs>
   <rect x="20" y="20" width="100" height="100" fill="url(#demo1)"></rect>
 </svg>

参数说明:

gradientUnits.png

注意:

x1="50%" x2="30%" y1="0%" y2="0%"

demo.png

2. 径向渐变 radialGradient

示例图:


demo2.png

示例代码:

<svg>
  <defs>
    <radialGradient id="demo2" cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
      <stop offset="0%"  stop-color="#5588aa"/>
      <stop offset="100%" stop-color="#ffbb33"/>
    </radialGradient>
  </defs>
  <rect x="20" y="20" width="100" height="100" fill="url(#demo2)"></rect>
</svg>

参数说明:

上一篇下一篇

猜你喜欢

热点阅读